No description
|
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
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. |
||
|---|---|---|
| .claude | ||
| .planning/codebase | ||
| alembic | ||
| backtester | ||
| dashboard | ||
| docker | ||
| docs/plans | ||
| scripts | ||
| services | ||
| shared | ||
| tests | ||
| .env.example | ||
| .gitignore | ||
| .woodpecker.yml | ||
| alembic.ini | ||
| docker-compose.yml | ||
| pyproject.toml | ||
| README.md | ||
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