ebff19940b
A new /regime tab scoring how far the AI/Tech bull regime has deteriorated toward a re-rating as a single 0-100 index with per-signal breakdown and a 7/30-day trend. Intentionally decoupled: nothing reads its output to gate or score trades — the daily-pipeline membership is scheduling only. - regime_monitor_service: price sub-scores (P1-P6 via Alpaca, like market_regime), VIX + HY credit spreads via a small FRED helper, weighted aggregation over available signals (missing source -> n/a, dropped from the denominator), one snapshot row/day, and a ~90-day history backfill by replaying the already-fetched series as-of each past day. - F1/F3 fundamentals proposed by the configured grounded LLM (reuses sentiment_provider_service config resolution), with a manual override + lock. - regime_snapshots table (migration 011); endpoints on the existing market router; admin-editable weights/threshold; standalone /regime page. Data needs: prices via Alpaca, VIX/credit via FRED (optional key — signals show n/a without it). No LLM needed for history. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
95 lines
3.5 KiB
Python
95 lines
3.5 KiB
Python
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8")
|
|
|
|
# Database
|
|
database_url: str = "postgresql+asyncpg://stock_backend:changeme@localhost:5432/stock_data_backend"
|
|
|
|
# Auth
|
|
jwt_secret: str = "change-this-to-a-random-secret"
|
|
jwt_expiry_minutes: int = 60
|
|
|
|
# OHLCV Provider — Alpaca Markets
|
|
alpaca_api_key: str = ""
|
|
alpaca_api_secret: str = ""
|
|
|
|
# Sentiment Provider — Gemini with Search Grounding (legacy)
|
|
gemini_api_key: str = ""
|
|
gemini_model: str = "gemini-2.0-flash"
|
|
|
|
# Sentiment Provider — OpenAI
|
|
openai_api_key: str = ""
|
|
openai_model: str = "gpt-4o-mini"
|
|
openai_sentiment_batch_size: int = 5
|
|
|
|
# Sentiment Provider — DeepSeek / xAI (OpenAI-compatible; optional env fallback)
|
|
deepseek_api_key: str = ""
|
|
xai_api_key: str = ""
|
|
|
|
# Fundamentals Provider — Financial Modeling Prep
|
|
fmp_api_key: str = ""
|
|
|
|
# Fundamentals Provider — Finnhub (optional fallback)
|
|
finnhub_api_key: str = ""
|
|
|
|
# Fundamentals Provider — Alpha Vantage (optional fallback)
|
|
alpha_vantage_api_key: str = ""
|
|
|
|
# Regime Monitor — FRED (VIX level + HY credit spreads). Optional: without it
|
|
# the volatility (P5) and credit-spread (F2) signals are reported as n/a.
|
|
fred_api_key: str = ""
|
|
|
|
# Alerts — Telegram (optional env fallback; can also be set in Admin)
|
|
telegram_bot_token: str = ""
|
|
telegram_chat_id: str = ""
|
|
|
|
# Scheduled Jobs
|
|
data_collector_frequency: str = "daily"
|
|
sentiment_poll_interval_minutes: int = 30
|
|
# Sentiment search-budget controls (Gemini grounding free tier = 5000/month).
|
|
# Only fetch sentiment for relevant tickers (watchlist + open trades + top-N by
|
|
# composite), skip ones refreshed within fresh_hours, and cap per run.
|
|
sentiment_fresh_hours: int = 72
|
|
sentiment_max_per_run: int = 25
|
|
sentiment_top_composite: int = 30
|
|
fundamental_fetch_frequency: str = "weekly" # quarterly-ish data; weekly conserves API quota
|
|
rr_scan_frequency: str = "daily"
|
|
alerts_frequency: str = "hourly"
|
|
fundamental_rate_limit_retries: int = 3
|
|
fundamental_rate_limit_backoff_seconds: int = 15
|
|
# Pause between tickers in the bulk fundamentals job. Free tiers throttle
|
|
# hard (Finnhub ~60 calls/min, ~3 calls/ticker → ~3s/ticker); without
|
|
# spacing the job bursts straight into 429s. 0 disables.
|
|
fundamental_request_spacing_seconds: float = 3.0
|
|
|
|
# Scoring Defaults
|
|
default_watchlist_auto_size: int = 10
|
|
default_rr_threshold: float = 1.5
|
|
|
|
# Outcome evaluation: trading days before an undecided setup expires
|
|
outcome_evaluation_max_bars: int = 30
|
|
|
|
# OHLCV history depth to fetch. New tickers backfill this far; the manual
|
|
# "data_backfill" job re-fetches the full window for everyone. ~5 years so
|
|
# long-lookback factors (12-month momentum, 52-week high) and multi-regime
|
|
# backtests become computable. ~252 trading days/year.
|
|
ohlcv_history_days: int = 1825
|
|
|
|
# Backtest parallelism: replay tickers across this many worker processes on
|
|
# POSIX (forkserver), capped to cpu_count-1 so a core stays free for the web
|
|
# server. 1 disables it (sequential). No effect on Windows / spawn-only
|
|
# platforms — those fall back to a single worker thread.
|
|
backtest_workers: int = 4
|
|
|
|
# Database Pool
|
|
db_pool_size: int = 5
|
|
db_pool_timeout: int = 30
|
|
|
|
# Logging
|
|
log_level: str = "INFO"
|
|
|
|
|
|
settings = Settings()
|