No description
Find a file
Viktor Barzin 00a40c9d2f
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
fix(dashboard): Strategy LAST SEEN = 'Invalid Date' contract drift
API GET /api/meet-kevin/strategy/tickers returns the field as
latest_mention_at, but the dashboard's StrategyTicker type + table
read t.last_mention_at — so new Date(undefined) produced
'Invalid Date' in every row.

Aligned StrategyTicker to the actual API shape and renamed the
table accessor. Also dropped two columns that referenced fields the
API never returned (mention_count, unrealized_pnl_pct, current_price)
and replaced them with what IS in the response (Horizon column +
trade_entry_price renamed 'Entry'). t.is_held -> t.has_open_trade.
2026-05-29 06:04:05 +00:00
.claude fix: resolve all remaining TODOs, add dev mode auth bypass 2026-02-25 22:02:25 +00:00
.planning/codebase docs: map existing codebase 2026-02-23 20:04:05 +00:00
alembic feat(meet-kevin): prompt v2 — forward-looking action + expected_move field 2026-05-28 21:40:07 +00:00
backtester feat(backtester): extend compute_metrics with alpha/beta/winners/best 2026-05-24 00:57:42 +00:00
dashboard fix(dashboard): Strategy LAST SEEN = 'Invalid Date' contract drift 2026-05-29 06:04:05 +00:00
docker docker: copy scripts/ into image so ad-hoc CLIs are available in-pod 2026-05-27 12:06:20 +00:00
docs/plans add Meet Kevin v2 implementation plan (3 phases, 22 tasks) 2026-05-24 00:40:20 +00:00
scripts fix(scripts): kevin-analyze + reanalyze — self-contained + append-only 2026-05-28 22:55:14 +00:00
services feat(meet-kevin): prompt v2 — forward-looking action + expected_move field 2026-05-28 21:40:07 +00:00
shared fix(redis-streams): survive blocking-read timeout on idle streams 2026-05-29 05:49:15 +00:00
tests fix(redis-streams): survive blocking-read timeout on idle streams 2026-05-29 05:49:15 +00:00
.env.example feat: productionize local service — fix signal pipeline, lower thresholds, add company-name ticker extraction 2026-02-22 22:17:26 +00:00
.gitignore feat: docker compose infrastructure — postgres+timescaledb, redis, ollama 2026-02-22 15:11:50 +00:00
.woodpecker.yml feat(trade-executor): Slack bot-token transport + semver image tags 2026-05-27 10:06:49 +00:00
alembic.ini feat: database models and alembic migrations — all tables per design 2026-02-22 15:17:07 +00:00
docker-compose.yml feat: productionize local service — fix signal pipeline, lower thresholds, add company-name ticker extraction 2026-02-22 22:17:26 +00:00
pyproject.toml fix(ci): add fakeredis to [dev] extras 2026-05-26 19:47:15 +00:00
README.md fix: resolve all remaining TODOs, add dev mode auth bypass 2026-02-25 22:02:25 +00:00

Trading Bot

Automated stock trading bot combining news sentiment analysis with technical strategies. Built as event-driven Python microservices communicating via Redis Streams, with a React/TypeScript dashboard and Alpaca paper trading.

Architecture

RSS/Reddit ─→ news_fetcher ─→ [news:raw] ─→ sentiment_analyzer ─→ [news:scored] ┐
                                                                                  │
Alpaca OHLCV ─→ market_data ─→ [market:bars] ────────────────────────────────────┤
                                                                                  │
                                              signal_generator ←──────────────────┘
                                                    │
                                              [signals:generated]
                                                    │
                                              trade_executor ─→ [trades:executed] ─→ learning_engine
                                                    │                                       │
                                                Alpaca API                             Redis (weights)

Services: news-fetcher, sentiment-analyzer, signal-generator, trade-executor, learning-engine, market-data, api-gateway, dashboard

9 Trading Strategies: Momentum, Mean Reversion, News-Driven, Value, MACD Crossover, Bollinger Breakout, VWAP, Liquidity, MA Stack — combined via weighted ensemble with multi-armed bandit weight adjustment.

Tech Stack

  • Backend: Python 3.12, FastAPI, SQLAlchemy 2.0 (async), Pydantic v2, alpaca-py
  • Frontend: React 19, TypeScript, Vite, Tailwind CSS, TanStack Query, TradingView lightweight-charts
  • ML: transformers (FinBERT), Ollama (local LLM fallback)
  • Database: PostgreSQL 16 + TimescaleDB, Alembic migrations (16 tables)
  • Messaging: Redis Streams + pub/sub
  • Auth: WebAuthn/Passkeys + JWT sessions
  • Observability: OpenTelemetry + Prometheus metrics
  • CI/CD: Woodpecker → Docker → Kubernetes

Quick Start

# Full stack with Docker Compose
docker compose up -d

# Seed default strategies
docker compose exec api-gateway python -m scripts.seed_strategies

Development

# Create virtual environment
python3 -m venv .venv && source .venv/bin/activate

# Install all dependencies
pip install -e ".[api,news,sentiment,trading,backtester,dev]"

# Run unit tests (404 tests)
python -m pytest tests/ -v -m "not integration"

# Run integration tests (requires Redis + PostgreSQL)
python -m pytest tests/ -v -m integration

# Dashboard development
cd dashboard && npm install && npm run dev

Project Structure

trading-bot/
├── shared/              # Shared libraries (config, DB, Redis, models, schemas, broker, strategies, fundamentals)
├── services/            # 7 microservices (news_fetcher, sentiment_analyzer, signal_generator,
│                        #   trade_executor, learning_engine, market_data, api_gateway)
├── backtester/          # Historical replay engine with simulated broker
├── dashboard/           # React 19 / TypeScript / Vite frontend
├── docker/              # Dockerfiles and nginx configs
├── scripts/             # Seed scripts and smoke tests
├── tests/               # 404 unit + 9 integration tests
├── alembic/             # Database migrations
├── docker-compose.yml   # Full stack orchestration
├── .woodpecker.yml      # CI/CD pipeline
└── pyproject.toml       # Python monorepo with optional dependency groups