The pipeline uses a multi-layered scoring framework to evaluate investment opportunities. Every score is deterministic (reproducible from the same inputs), except AI Resilience which uses LLM-generated assessments calibrated against reference anchors.
Each module page shows the components, formulas, thresholds, and data sources. Scores are 0–100 unless noted otherwise. All thresholds and weights are configurable via the score_config table.
conviction_scores (composite output)
|
+-- Fundamental (25%)
| beat_rate, surprise_quality, sentiment,
| estimate_trajectory, guidance, financial_strength
|
+-- Thematic (25%)
| ai_resilience, theme_health, peer_standing
|
+-- Valuation (25%)
| pe_percentile, peg, price_strength,
| net_debt_ocf (TTM, sector-aware),
| ev_fcf (TTM, sector-aware), pe_momentum
|
+-- Catalyst (25%)
thesis_conviction (calibrated + penalty),
rating_momentum, thesis_consistency
Raw data flows through three layers before reaching conviction scores:
| Layer | Source | Output |
|---|---|---|
| Ingestion | FMP, yfinance, SEC XBRL, Reddit, news APIs | earnings_events, financial_health, companies, news_articles, analyst_ratings |
| Signals | Ingested tables + LLM analysis | ticker_signals, ai_scores, theme_momentum, peer_rankings, estimate_revisions |
| Scoring | Signals + company data | conviction_scores, investment_theses, earnings_previews |
All weights, thresholds, and labels are tunable at runtime via the score_config table without code changes:
| Config Type | Key Settings |
|---|---|
| conviction | Dimension weights (default 25% each), label thresholds (Strong Buy ≥80, Buy ≥65, Hold ≥50), macro modifier toggle |
| ai_resilience | Dimension weights (RevCat 25%, Moat 25%, OpLev 15%, Pricing 20%, Obsol 15%), label thresholds |
| financial_strength | Industry adjustment factors (Energy 1.15, Utilities 1.15, Industrials 1.10) |