Scoring Methodology — Signal
All scores are 0–100. Pipeline for every score: compute raw components per company → winsorize at 1st/99th percentiles → percentile-rank within the S&P 500 universe → weighted blend → 0–100. Weights below are v1 starting points; every score run records its weights in score_runs.config so runs are reproducible. Missing components: reweight remaining components proportionally; if >50% of weight is missing, score is null (displayed "insufficient data").
LLM scores: temperature 0, JSON-schema structured output, per-dimension 0–10 with mandatory evidence citations (a dimension without ≥1 citation is rejected and retried once, then nulled). Prompts include 2 fixed anchor-company exemplars to calibrate the scale. Rubric files live in app/llm/rubrics/ and are versioned; the rubric version is recorded in score_runs.config.
Financial (quant)
TTM values from fundamentals (sum of last 4 quarters; fall back to latest FY).
| Component | Definition | Weight |
|---|---|---|
| RONTA | EBIT ÷ (total assets − goodwill − intangibles − total liabilities); if denominator ≤ 0, assign top-decile flag and exclude from ranking (score via other components) | 30% |
| ROIC | NOPAT ÷ invested capital, where NOPAT = EBIT × (1 − effective tax rate), invested capital = total debt + equity − cash | 25% |
| Strength | Composite: Piotroski F-score (9 signals, from YoY fundamentals) 50% + interest coverage (EBIT/interest expense) 25% + net debt/EBITDA (inverted) 25% | 25% |
| Sales growth | 3Y revenue CAGR 60% + TTM YoY revenue growth 40% | 20% |
GARP (quant)
Growth at a reasonable price: growth percentile vs. valuation percentile.
| Component | Definition | Weight |
|---|---|---|
| Growth | 3Y revenue CAGR 40% + 3Y diluted-EPS CAGR 40% + TTM YoY EPS growth 20% (EPS growth winsorized hard; negative-base EPS → component null) | 50% |
| Valuation (inverted rank) | Earnings yield (TTM EPS/price) 40% + EBIT/EV 40% + sales yield (revenue/EV) 20% | 50% |
Blend rule: score = percentile of (growth_pct − 0.8 × valuation_expensiveness_pct) — cheap fast growers top, expensive slow growers bottom. Tune the 0.8 after first backfill.
PayScore (quant)
| Component | Definition | Weight |
|---|---|---|
| SBC ratio | TTM SBC ÷ TTM gross profit (lower = better) | 50% |
| SBC trend | 3Y avg SBC ratio vs TTM (improving = better) | 20% |
| Dilution | 3Y diluted share count CAGR, net (buybacks show up here as negative) | 30% |
Surge (quant)
From prices (adjusted closes):
- Compute last 12 calendar-month returns r₁ (most recent) … r₁₂.
- Weighted momentum M = Σ wᵢ·rᵢ with exponential weights, half-life = 3 months (w₁ normalized sum to 1).
- Cross-sectional z-score of M across the universe on the run date ("normalized to current market dynamics").
- Map z to 0–100 via percentile rank. Skip-month variant (exclude most recent month, classic momentum) is computed and stored as a component for later evaluation but not used in v1 score.
Leaders (hybrid)
Quant components (60%):
| Component | Definition | Weight |
|---|---|---|
| CEO-tenure TSR | Annualized total shareholder return from CEO start date vs. equal-weighted sector peers over same window | 25% |
| Financial trajectory | ROIC trend (5Y slope) + margin trend under current CEO | 20% |
| Capital allocation | Buyback effectiveness (shares repurchased at below current-run median valuation multiple = good) + goodwill-impairment history (impairments within 5Y of acquisitions = bad) | 15% |
LLM components from DEF 14A + 8-K + news dossier (40%): governance quality (board independence, dual-class, related-party flags) 15%, track-record narrative (delivery vs. stated strategy across filings) 15%, red flags (abrupt departures, restatements, investigations) 10%.
AI (LLM)
Dossier: 10-K Items 1/1A/7 excerpts (AI-relevant passages pre-filtered by keyword windows), news_events tagged AI, patent_stats.ai_related, R&D/revenue from fundamentals.
Dimensions (0–10 each): AI product depth (real deployed capability vs. narrative) ×3, AI infrastructure (own models/chips/datacenters/data moat) ×2.5, technical talent & research output ×2, potential impact of AI on the business (upside or disruption-resilience) ×2.5. Sum × weights → 0–100 rubric score → percentile-ranked.
Tech (LLM)
Same dossier family as AI. Dimensions: core infrastructure strength ×2.5, industry/ecosystem position ×2.5, AI & AGI capability ×2.5, innovation potential (patent velocity, R&D intensity, new-product cadence) ×2.5.
Note: AI and Tech overlap by design (AI dimension appears in both); they answer different questions — "how good is their AI?" vs. "how strong is their overall technology position?"
Product: 1Y (LLM)
Input: news_events from trailing 365 days, classified (launch/partnership/acquisition), plus 8-K material-agreement/acquisition items. Two stages:
- Per-event LLM classification: type, significance 0–3, sentiment −1..1 (cached per event, incremental).
- Rubric roll-up: launch execution ×3, partnership/M&A quality ×3, market sentiment ×2, strategy coherence ×2.
Product: 5Y (LLM)
Dossier: 5 years of 10-K Item 1/1A + competitive-position passages, long-window news sample, peer list (same GICS industry). Dimensions: competitive strength vs. named peers ×3, product quality & customer satisfaction ×2.5, innovation & competitive edge durability ×2.5, 5Y execution trajectory ×2.
Refresh cadence
| Scores | Cadence |
|---|---|
| Surge | daily |
| Financial, GARP, PayScore | weekly |
| AI, Tech, Leaders, Product 1Y, Product 5Y | quarterly + manual trigger |
Validation & calibration (ongoing)
- Unit tests: every quant component against hand-computed fixtures (≥3 companies incl. a financial and a negative-NTA case).
- Sanity ranks: publish-blocking check that a fixed sanity set lands in expected bands (e.g., NVDA AI score > KO AI score).
- LLM stability: quarterly re-run on unchanged dossiers must reproduce scores exactly (cache); rubric-version bumps trigger full re-run and a diff report.
- Score distributions logged per run; alert if any pillar's distribution collapses (std < 15). Note: pillars whose final value is a pure percentile rank (Surge, GARP) sit at the uniform-rank std (~28.9) by construction, so this alert is only informative for blended pillars (Financial, PayScore, …).