The two-axis model
Every covered company has two scores: Opportunity and Risk. They are independent. Risk is not the inverse of Opportunity. The default ranking lens is Risk-Adjusted Opportunity = Opportunity − 0.5 × Risk.
Six dimensions
Opportunity is a weighted blend of four operating dimensions plus a valuation modifier. Risk is a separate axis composed of eight structural risk components.
Opportunity (§7.2)
raw_opportunity = 0.25 × Quality
+ 0.25 × Growth_Durability
+ 0.20 × Capital_Efficiency
+ 0.30 × Demand_Signal
valuation_penalty = max(0, 30 − Valuation) × 1.5
Opportunity = max(0, raw_opportunity − valuation_penalty)Demand Signal carries the highest weight (0.30) because forward visibility is the most asymmetric input. Valuation acts as a penalty when poor (≤30), not a fully additive component — a great business at a fair price isn't penalized; a great business at a heroic price is.
Risk (§7.3)
Risk = 0.5 × max(component_risks) + 0.5 × average(component_risks)
Eight components: customer concentration, geopolitical / export-control, tech displacement, cyclical, balance sheet, regulatory / permitting, single-asset / single-product, energy / physical bottleneck. Max + average means a single 95th-percentile risk dominates while the average tells you whether the company is broadly fragile or just exposed to one thing.
Valuation (§7.6)
A three-lens blend: relative-to-self percentile (35%) + relative-to-peers percentile (35%) + reverse-DCF score (30%). The reverse-DCF lens solves for the implied growth rate that justifies the current EV at the subsegment's default WACC, and bands the ratio of implied / reasonable growth into cheap (75) / fair (50) / rich (30) / heroic (15).
Customer concentration penalty (§7.5)
concentration_penalty = max(0, top_customer_pct − 25) × 1.0 Quality_score = base_quality_score − concentration_penalty (floored at 0)
A company with a single customer at 70% of revenue takes a 45-point hit on Quality. Aggressive on purpose — concentration is structural.
Computed, not narrated (hard rule #1)
All scoring math is regular TypeScript code. The LLM is used only to identify and extract inputs from filings and transcripts; it never produces a score. Every score in this system is reproducible from the inputs and formulas above.
Confidence flags (hard rule #5)
Every input carries a confidence: high | medium | low. A dimension takes the lowest-confidence input. A scorecard with any low-confidence dimension is tagged low_confidence: true and renders with a "low confidence" pill on segment-list pages.
Subsegment-specific adjustments (Part 4)
- REITs: Quality uses AFFO/share growth (not ROIC); Capital Efficiency uses AFFO payout ratio; Valuation uses cap rate vs peers.
- Capital-cycle businesses (semicap, power, materials): scores are explicitly cycle-tagged. Late-cycle = penalty multiplier on Demand Signal.
- Pre-revenue / project-finance (SMR developers, etc.): Quality replaced with a Milestone Score (regulatory, customer, capital).
- Commodity-exposed: a commodity-cycle overlay is added; scoring acknowledges price-driven cyclicality.
Track record (hard rule #8)
Monthly snapshots of every ranking are immutable and publicly accessible at /track-record. The “We Got It Wrong” log is published. This is not a feature flag.
What this site is not
Opinions, not personalized advice. The site expresses views grounded in the scorecard and technical setup — “buy on a pullback,” “tracking for entry,” “pass at this price.” What it does not produce: imperative trade commands, specific price targets with deadlines, or advice tailored to any individual situation. Operates under the Investment Advisers Act publisher exemption (general-circulation publication, no managed money, no compensation tied to specific calls). Full posture on /disclosures.