9.5 KiB
9.5 KiB
External Integrations
Analysis Date: 2025-02-23
APIs & External Services
Brokerage Trading:
- Alpaca Markets - Paper and live trading
- SDK/Client:
alpaca-py(21.0+) - API Key:
TRADING_ALPACA_API_KEYenv var - Secret:
TRADING_ALPACA_SECRET_KEYenv var - Base URL:
TRADING_ALPACA_BASE_URL(defaults to paper trading endpoint) - Paper trading:
TRADING_PAPER_TRADING=trueflag in config - Used by:
shared/broker/alpaca_broker.py- Order execution, position tracking, account info viaTradingClientservices/market_data/main.py- Historical bars viaStockHistoricalDataClientand live streamingservices/api_gateway/tasks/portfolio_sync.py- Portfolio synchronization background taskservices/trade_executor/main.py- Order placement and status monitoring
- SDK/Client:
News & Content Sources:
-
Yahoo Finance RSS - Financial news feed
- Feed URL:
https://finance.yahoo.com/news/rssindex - Client: feedparser 6.0+
- Polling:
TRADING_RSS_POLL_INTERVAL_SECONDS(default 300s) - Configured in:
services/news_fetcher/config.py
- Feed URL:
-
Reuters RSS - Business news feed
- Feed URL:
https://feeds.reuters.com/reuters/businessNews - Client: feedparser 6.0+
- Feed URL:
-
Dow Jones RSS - Market news feed
- Feed URL:
https://feeds.content.dowjones.io/public/rss/mw_topstories - Client: feedparser 6.0+
- Feed URL:
-
Reddit - Wallstreetbets, stocks, investing communities
- SDK/Client: praw 7.7+ (blocking) and asyncpraw 7.7+ (async)
- Client ID:
TRADING_REDDIT_CLIENT_IDenv var - Client Secret:
TRADING_REDDIT_CLIENT_SECRETenv var - User Agent:
TRADING_REDDIT_USER_AGENT(default:trading-bot/0.1) - Subreddits:
["wallstreetbets", "stocks", "investing"](configurable viaTRADING_REDDIT_SUBREDDITS) - Min score filter:
TRADING_REDDIT_MIN_SCORE(default 10) - Polling:
TRADING_REDDIT_POLL_INTERVAL_SECONDS(default 600s) - Used by:
services/news_fetcher/main.py
Machine Learning Models:
-
FinBERT (Hugging Face) - Financial sentiment classification
- Model:
ProsusAI/finbert(transformer) - Confidence threshold:
TRADING_FINBERT_CONFIDENCE_THRESHOLD(default 0.4) - Library: transformers 4.38+
- Used by:
services/sentiment_analyzer/analyzers/finbert.py - Location: Loaded from Hugging Face model hub
- Model:
-
Ollama - Local LLM for fallback sentiment analysis
- Host:
TRADING_OLLAMA_HOST(defaulthttp://localhost:11434) - Model:
TRADING_OLLAMA_MODEL(defaultgemma3) - Used when: FinBERT confidence below threshold
- Library: ollama-python 0.1+
- Used by:
services/sentiment_analyzer/analyzers/ollama_analyzer.py
- Host:
Data Storage
Databases:
- PostgreSQL 16 + TimescaleDB extension (Docker:
timescale/timescaledb:latest-pg16)- Connection: Async via asyncpg driver
- URL:
TRADING_DATABASE_URLenv var (default:postgresql+asyncpg://trading:trading@localhost:5432/trading) - Username:
trading(env:POSTGRES_USER) - Password:
POSTGRES_PASSWORDenv var - Database:
trading - ORM: SQLAlchemy 2.0+ with mapped_column style
- Migrations: Alembic (auto-run via
python -m alembic upgrade head) - Tables (14 models in
shared/models/):- Auth:
users,webauthn_credentials - News:
articles,article_sentiments - Trading:
strategies,trade_signals,executed_trades,positions - Learning:
strategy_weights,weight_history - Market data: OHLCV timeseries via TimescaleDB hypertables
- Auth:
- Used by: All services via
shared/db.pyasync sessionmaker
File Storage:
- Local filesystem only (no cloud storage)
- Docker volumes for persistent data:
pgdata- PostgreSQL persistent storageredisdata- Redis persistent storage
Caching & Message Broker:
- Redis 7-alpine (Docker image)
- Connection:
TRADING_REDIS_URLenv var (default:redis://localhost:6379/0) - Default port: 6379
- Persistent volume:
redisdata - Features used:
- Streams (consumer groups) for inter-service messaging
- Key-value cache for rate limiting
- Stream topics (producer/consumer contracts):
news:raw- Raw articles from news fetcher → consumed by sentiment analyzernews:scored- Scored articles from sentiment analyzer → consumed by signal generatorsignals:generated- Trade signals from signal generator → consumed by trade executor and learning enginetrades:executed- Executed trades from trade executor → consumed by learning engine
- Client library: redis 5.0+ with async support
- Consumer group per service (e.g.,
sentiment-analyzer-grouponnews:rawstream)
- Connection:
Authentication & Identity
Auth Provider:
- Custom WebAuthn/Passkey implementation (no third-party OAuth provider)
- Library: webauthn 2.0+ (Python backend)
- Frontend: @simplewebauthn/browser 13.2.2 (JavaScript/TypeScript)
- Flow: WebAuthn registration → credential storage → authentication challenge verification
- Credentials storage:
webauthn_credentialstable in PostgreSQL - Implementation:
services/api_gateway/auth/routes.py(register/login/verify endpoints)
Session Management:
- JWT tokens with HS256 (HMAC-SHA256)
- Library: PyJWT 2.8+ with crypto support
- Secret key:
TRADING_JWT_SECRET_KEYenv var (REQUIRED, must be 32+ bytes in production) - Algorithm:
TRADING_JWT_ALGORITHM(default: HS256) - Access token expiry:
TRADING_ACCESS_TOKEN_EXPIRE_MINUTES(default 15) - Refresh token expiry:
TRADING_REFRESH_TOKEN_EXPIRE_DAYS(default 7) - Token verification:
services/api_gateway/auth/middleware.py(Bearer token extraction and validation) - Implementation:
services/api_gateway/auth/jwt.py
Monitoring & Observability
Error Tracking:
- None detected - No Sentry or other APM integration
- Logging: Standard Python logging module with
TRADING_LOG_LEVELenv var
Logs:
- Console logging to stdout/stderr
- Log level controlled by:
TRADING_LOG_LEVELenv var (default: INFO) - Each service logs to standard output (captured by Docker/container orchestration)
Metrics & Telemetry:
- OpenTelemetry 1.20+ - Metrics collection and export
- PrometheusMetricReader - Metrics exporter
- prometheus-client - HTTP
/metricsendpoint - Setup:
shared/telemetry.py-setup_telemetry()called by each service - Metrics port:
TRADING_OTEL_METRICS_PORTenv var (default 9090) - Service name:
TRADING_OTEL_SERVICE_NAMEenv var (default:trading-bot) - Scrape endpoint:
http://<service>:9090/metricsfor each service - Note: Prometheus/Grafana not deployed; metrics available for external monitoring
CI/CD & Deployment
Hosting:
- Docker & Docker Compose (local development and self-hosted deployment)
- No managed hosting detected (e.g., AWS, Heroku, GCP)
CI Pipeline:
- None detected - No GitHub Actions, GitLab CI, or other CI/CD pipeline
Docker Composition:
- Services defined in
docker-compose.yml:postgres- Databaseredis- Message brokermigrations- Database schema initializationnews-fetcher- Servicesentiment-analyzer- Servicesignal-generator- Servicetrade-executor- Servicelearning-engine- Servicemarket-data- Serviceapi-gateway- FastAPI + WebSocket server (port 8000)dashboard- Nginx serving React build (port 3000)
Environment Configuration
Required env vars:
TRADING_JWT_SECRET_KEY- REQUIRED for API Gateway JWT signing (must be set, generate withpython -c "import secrets; print(secrets.token_hex(32))")TRADING_ALPACA_API_KEY- Alpaca account API keyTRADING_ALPACA_SECRET_KEY- Alpaca account secretTRADING_REDDIT_CLIENT_ID- Reddit app client IDTRADING_REDDIT_CLIENT_SECRET- Reddit app secret
Optional env vars with defaults:
TRADING_DATABASE_URL- Default:postgresql+asyncpg://trading:trading@localhost:5432/tradingTRADING_REDIS_URL- Default:redis://localhost:6379/0TRADING_LOG_LEVEL- Default:INFOTRADING_ALPACA_BASE_URL- Default: Paper trading endpointTRADING_PAPER_TRADING- Default:trueTRADING_OLLAMA_HOST- Default:http://localhost:11434TRADING_OLLAMA_MODEL- Default:gemma3TRADING_FINBERT_CONFIDENCE_THRESHOLD- Default:0.4TRADING_RSS_POLL_INTERVAL_SECONDS- Default:300TRADING_REDDIT_POLL_INTERVAL_SECONDS- Default:600TRADING_RP_ID- Default:localhostTRADING_RP_NAME- Default:Trading BotTRADING_RP_ORIGIN- Default:http://localhost:5173TRADING_CORS_ORIGINS- Default:["http://localhost:5173"]POSTGRES_PASSWORD- Default:trading
Secrets location:
.envfile (git-ignored, loads via docker-composeenv_filedirective)- Environment variables passed at container runtime
- No secrets management service (Vault, Secrets Manager) integrated
Webhooks & Callbacks
Incoming:
- None detected - No webhook endpoints for external services
Outgoing:
- None detected - No outbound webhooks to external systems
Real-time Communication:
- WebSocket support via
websocketslibrary for API Gateway - Used for: Real-time dashboard updates (TBD implementation in routes)
- Endpoint:
/wsproxy configured in Vite dev server
Service Dependencies (Internal Messaging)
Message Flows:
- News Fetcher → (
news:rawstream) → Sentiment Analyzer - Sentiment Analyzer → (
news:scoredstream) → Signal Generator - Signal Generator → (
signals:generatedstream) → Trade Executor + Learning Engine - Trade Executor → (
trades:executedstream) → Learning Engine - Market Data → Alpaca API → Database (timeseries persisted)
- API Gateway → Alpaca API → Portfolio sync background task
Integration audit: 2025-02-23