// Credit rating scale (S&P convention). // Bond.js converts letter ratings to these numbers; BondScorer uses them for gate checks. // Investment grade = BBB (7) and above. export const CREDIT_RATING_SCALE = { AAA: 10, AA: 9, A: 8, BBB: 7, BB: 6, B: 5, CCC: 4, CC: 3, C: 2, D: 1, }; // ───────────────────────────────────────────────────────────────────────────── // Fundamental baseline — Graham / value-investing style. // MarketRegime.js overrides the valuation gates for INFLATED-mode analysis. // Sector overrides are structural — they apply in both modes. // ───────────────────────────────────────────────────────────────────────────── export const ScoringRules = { STOCK: { gates: { maxDebtToEquity: 1.5, // Graham ceiling; 3.0 was too permissive — most distress starts above 2x minQuickRatio: 0.8, // Raised from 0.5: below 0.8 signals real liquidity stress in non-tech maxPERatio: 15, // Graham's actual rule: never pay more than 15x trailing earnings maxPegGate: 1.0, // PEG > 1.0 means you're paying full price for growth (Lynch standard) }, weights: { margin: 2, // net profit margin opMargin: 2, // operating margin (pricing power) roe: 3, // return on equity — Buffett's primary quality metric peg: 2, // valuation relative to growth revenue: 2, // revenue growth fcf: 3, // raised: FCF is the most manipulation-resistant quality signal }, thresholds: { marginHigh: 15, // lowered from 20: 15% net margin is genuinely excellent across most sectors marginMed: 8, // lowered from 10: 8% is the realistic mid-tier for industrials/retail opMarginHigh: 20, opMarginMed: 10, roeHigh: 15, // lowered from 20: sustainable 15% ROE is Buffett-quality; 20% is rare/fleeting roeMed: 10, // kept — 10% is the cost-of-equity floor for most businesses pegHigh: 0.75, // raised bar: PEG < 0.75 is genuinely cheap relative to growth pegMed: 1.0, revHigh: 10, // lowered from 15: 10% organic revenue growth is strong for mature cos revMed: 5, fcfHigh: 5, fcfMed: 2, }, SECTOR_OVERRIDE: { // Large-cap tech borrows to fund buybacks — D/E 2.0 is structural, not distress. // AAPL quick ratio runs ~0.9 by design (aggressive working capital management). // Raised maxPERatio from 30→35: mega-cap tech comps (MSFT, GOOG) trade 28-35x sustainably. // Tightened maxPegGate from 2.0→1.5: paying >1.5x PEG for tech rarely ends well long-term. TECHNOLOGY: { gates: { maxDebtToEquity: 2.0, minQuickRatio: 0.8, maxPERatio: 35, maxPegGate: 1.5 }, weights: { margin: 1, opMargin: 3, roe: 3, peg: 3, revenue: 4, fcf: 3 }, thresholds: { marginHigh: 25, opMarginHigh: 25, roeHigh: 20, pegHigh: 1.0, revHigh: 20 }, }, // REITs: P/E and PEG are distorted by depreciation — score on yield and P/FFO. // Raised minYield from 4.0→4.5: 10Y yield at 4.5%+ means REITs must clear that bar to add value. // Tightened maxPFFO from 15→18: 15 was too tight; well-run REITs (O, VICI) trade 17-22x P/FFO. // Explicitly zero out weights that don't apply to REITs. REIT: { gates: { maxDebtToEquity: 6.0, minQuickRatio: 0.1, maxPERatio: 9999, maxPegGate: 9999 }, weights: { margin: 0, opMargin: 0, roe: 0, peg: 0, revenue: 0, fcf: 0, yield: 5, pFFO: 3 }, thresholds: { minYield: 4.5, maxPFFO: 20 }, }, // Banks: P/E and PEG are distorted by loan loss provisions. // Price-to-Book is the primary valuation metric. // Lowered maxPriceToBook from 2.0→1.5: P/B > 1.5 for banks outside crisis recovery is expensive. // Tightened ROE threshold: 12% is the realistic cost-of-equity for US banks; 10% is break-even. FINANCIAL: { gates: { maxDebtToEquity: 9999, minQuickRatio: 0.1, maxPERatio: 9999, maxPegGate: 9999, maxPriceToBook: 1.5, }, weights: { margin: 0, opMargin: 0, peg: 0, roe: 5, revenue: 1, fcf: 1, priceToBook: 3 }, thresholds: { roeHigh: 15, roeMed: 12, revHigh: 10, revMed: 5 }, }, // Energy: capital-heavy, cyclical. D/E up to 1.5 is normal. // FCF yield is the primary quality signal (replaces margin); opMargin matters for integrated cos. // Div yield is scored because energy majors return capital via dividends. ENERGY: { gates: { maxDebtToEquity: 1.5, minQuickRatio: 0.6, maxPERatio: 15, maxPegGate: 1.5 }, weights: { margin: 0, opMargin: 3, roe: 2, peg: 1, revenue: 2, fcf: 4, yield: 3 }, thresholds: { opMarginHigh: 20, opMarginMed: 10, roeHigh: 15, roeMed: 8, fcfHigh: 8, fcfMed: 4, }, }, // Healthcare: high R&D burn distorts net margin; focus on revenue growth and FCF. // P/E can be elevated for pipeline names — gate loosened slightly. HEALTHCARE: { gates: { maxDebtToEquity: 1.5, minQuickRatio: 1.0, maxPERatio: 25, maxPegGate: 1.5 }, weights: { margin: 1, opMargin: 2, roe: 2, peg: 2, revenue: 4, fcf: 3 }, thresholds: { marginHigh: 20, marginMed: 10, roeHigh: 20, roeMed: 12, revHigh: 15, revMed: 8, fcfHigh: 8, fcfMed: 3, }, }, // Communication Services: META, GOOGL, NFLX, DIS, T, VZ. // Mix of high-margin platform businesses and capital-heavy telcos/media. // P/E gate at 25: META and GOOGL sustainably trade 20-25x; below 15 is wrong for platforms. // High FCF weight: platform businesses are judged on FCF (ad revenue converts 35-40% to FCF). // Revenue growth matters more than for mature industrials — network effects are the moat. COMMUNICATION: { gates: { maxDebtToEquity: 2.0, minQuickRatio: 0.8, maxPERatio: 25, maxPegGate: 1.5 }, weights: { margin: 2, opMargin: 3, roe: 2, peg: 2, revenue: 3, fcf: 4 }, thresholds: { marginHigh: 25, marginMed: 12, opMarginHigh: 30, opMarginMed: 15, roeHigh: 20, roeMed: 12, pegHigh: 1.0, pegMed: 1.5, revHigh: 15, revMed: 5, fcfHigh: 8, fcfMed: 3, }, }, // Consumer Staples: KO, PG, WMT, COST, KR. Slow-growth, recession-resistant. // Lower revenue growth expectations (2-5% is good for staples). // Higher margin thresholds — pricing power is the primary moat (not growth). // D/E tolerance is low — staples should be conservatively financed. CONSUMER_STAPLES: { gates: { maxDebtToEquity: 1.5, minQuickRatio: 0.5, maxPERatio: 22, maxPegGate: 2.0 }, weights: { margin: 3, opMargin: 3, roe: 3, peg: 1, revenue: 1, fcf: 3 }, thresholds: { marginHigh: 12, marginMed: 7, opMarginHigh: 18, opMarginMed: 10, roeHigh: 20, roeMed: 12, pegHigh: 1.5, pegMed: 2.0, revHigh: 5, revMed: 2, fcfHigh: 5, fcfMed: 2, }, }, // Consumer Discretionary: AMZN, HD, MCD, NKE, TSLA. Cyclical, growth-oriented. // Revenue growth is the primary signal — discretionary spending expands with the economy. // Margins are thinner than staples (competitive markets); FCF matters for capital return. // P/E gate relaxed slightly — quality retailers trade at 20-30x on durable FCF. CONSUMER_DISCRETIONARY: { gates: { maxDebtToEquity: 2.0, minQuickRatio: 0.5, maxPERatio: 25, maxPegGate: 1.5 }, weights: { margin: 2, opMargin: 2, roe: 2, peg: 2, revenue: 4, fcf: 3 }, thresholds: { marginHigh: 10, marginMed: 5, opMarginHigh: 15, opMarginMed: 8, roeHigh: 20, roeMed: 12, pegHigh: 1.0, pegMed: 1.5, revHigh: 12, revMed: 5, fcfHigh: 5, fcfMed: 2, }, }, }, }, ETF: { // Raised expense gate from 0.5→0.2: with so many sub-0.1% index ETFs available, // a 0.5% expense ratio is genuinely hard to justify except for niche/active strategies. gates: { maxExpenseRatio: 0.2 }, weights: { yield: 2, lowCost: 4, fiveYearReturn: 2 }, // cost is #1 predictive factor; 5Y return rewards consistency thresholds: { minYield: 1.5, maxExpense: 0.05, // 0.05% is achievable for broad market ETFs minVolume: 1000000, // 1M ADV is the real liquidity floor to avoid slippage minFiveYearReturn: 8.0, // S&P 500 long-run real return ~7-10%; 8% filters underperformers }, }, BOND: { // Kept investment-grade floor at BBB — still correct. Below BBB is speculative. // Raised minSpread from 1.0→1.5: with risk-free at 4.5%, you need >1.5% spread // to be compensated for credit risk vs just buying Treasuries. // Tightened maxDuration from 10→7: in a HIGH rate regime, duration > 7 carries // meaningful rate-sensitivity risk (every 1% rate rise ≈ 7% price loss). gates: { minCreditRating: 7 }, // BBB = investment-grade floor weights: { yieldSpread: 3, duration: 2 }, thresholds: { minSpread: 1.5, maxDuration: 7 }, }, };