fin-ratios 0.7.3 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +779 -0
- package/dist/fetchers/alphavantage/index.cjs +0 -2
- package/dist/fetchers/alphavantage/index.js +0 -2
- package/dist/fetchers/edgar/index.cjs +0 -2
- package/dist/fetchers/edgar/index.js +0 -2
- package/dist/fetchers/fmp/index.cjs +0 -2
- package/dist/fetchers/fmp/index.js +0 -2
- package/dist/fetchers/polygon/index.cjs +174 -0
- package/dist/fetchers/polygon/index.d.cts +84 -0
- package/dist/fetchers/polygon/index.d.ts +84 -0
- package/dist/fetchers/polygon/index.js +171 -0
- package/dist/fetchers/yahoo/index.cjs +0 -2
- package/dist/fetchers/yahoo/index.js +0 -2
- package/dist/hooks/index.cjs +0 -2
- package/dist/hooks/index.js +0 -2
- package/dist/index.cjs +557 -8
- package/dist/index.d.cts +289 -1
- package/dist/index.d.ts +289 -1
- package/dist/index.js +553 -9
- package/package.json +11 -3
- package/dist/fetchers/alphavantage/index.cjs.map +0 -1
- package/dist/fetchers/alphavantage/index.js.map +0 -1
- package/dist/fetchers/edgar/index.cjs.map +0 -1
- package/dist/fetchers/edgar/index.js.map +0 -1
- package/dist/fetchers/fmp/index.cjs.map +0 -1
- package/dist/fetchers/fmp/index.js.map +0 -1
- package/dist/fetchers/yahoo/index.cjs.map +0 -1
- package/dist/fetchers/yahoo/index.js.map +0 -1
- package/dist/hooks/index.cjs.map +0 -1
- package/dist/hooks/index.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/safe-divide.ts","../src/ratios/valuation/index.ts","../src/ratios/valuation/dcf.ts","../src/ratios/profitability/index.ts","../src/ratios/liquidity/index.ts","../src/ratios/solvency/index.ts","../src/ratios/efficiency/index.ts","../src/ratios/cashflow/index.ts","../src/utils/math.ts","../src/ratios/growth/index.ts","../src/ratios/risk/index.ts","../src/ratios/composite/index.ts","../src/ratios/sector/saas/index.ts","../src/ratios/sector/reit/index.ts","../src/ratios/sector/banking/index.ts","../src/ratios/sector/insurance/index.ts","../src/utils/compute-all.ts","../src/utils/scenario-dcf.ts","../src/utils/cache.ts","../src/utils/moat-score.ts","../src/utils/capital-allocation.ts","../src/utils/earnings-quality.ts","../src/utils/fair-value.ts","../src/utils/quality-score.ts","../src/utils/portfolio.ts"],"names":["enterpriseValue","g","mean","std","cv","olsSlope","estimateWacc","yearRoic","nopat","clamp","percentile"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Divides numerator by denominator.\n * Returns null instead of Infinity/NaN when denominator is 0 or either input is null/undefined.\n */\nexport function safeDivide(\n numerator: number | null | undefined,\n denominator: number | null | undefined\n): number | null {\n if (numerator == null || denominator == null) return null\n if (denominator === 0) return null\n return numerator / denominator\n}\n","import { safeDivide } from '../../utils/safe-divide.js'\n\n// ── P/E ──────────────────────────────────────────────────────────────────────\n\nexport function pe(input: {\n marketCap: number\n netIncome: number\n}): number | null {\n return safeDivide(input.marketCap, input.netIncome)\n}\npe.formula = 'Market Capitalization / Net Income'\npe.description = 'Trailing price-to-earnings ratio. How much investors pay per dollar of earnings.'\n\nexport function forwardPe(input: {\n price: number\n forwardEps: number\n}): number | null {\n return safeDivide(input.price, input.forwardEps)\n}\nforwardPe.formula = 'Stock Price / Forward EPS Estimate'\nforwardPe.description = 'P/E based on next twelve months analyst EPS estimate.'\n\n// ── PEG ──────────────────────────────────────────────────────────────────────\n\nexport function peg(input: {\n peRatio: number\n epsGrowthRatePercent: number\n}): number | null {\n return safeDivide(input.peRatio, input.epsGrowthRatePercent)\n}\npeg.formula = 'P/E Ratio / EPS Annual Growth Rate (%)'\npeg.description = 'PEG ratio. < 1 may indicate undervaluation relative to growth.'\n\n// ── P/B ──────────────────────────────────────────────────────────────────────\n\nexport function pb(input: {\n marketCap: number\n totalEquity: number\n}): number | null {\n return safeDivide(input.marketCap, input.totalEquity)\n}\npb.formula = 'Market Capitalization / Total Shareholders Equity'\npb.description = 'Price-to-book ratio. < 1 may indicate trading below net asset value.'\n\n// ── P/S ──────────────────────────────────────────────────────────────────────\n\nexport function ps(input: {\n marketCap: number\n revenue: number\n}): number | null {\n return safeDivide(input.marketCap, input.revenue)\n}\nps.formula = 'Market Capitalization / Revenue'\nps.description = 'Price-to-sales ratio. Useful when earnings are negative.'\n\n// ── P/FCF ─────────────────────────────────────────────────────────────────────\n\nexport function pFcf(input: {\n marketCap: number\n operatingCashFlow: number\n capex: number\n}): number | null {\n const fcf = input.operatingCashFlow - Math.abs(input.capex)\n return safeDivide(input.marketCap, fcf)\n}\npFcf.formula = 'Market Capitalization / (Operating Cash Flow - Capex)'\npFcf.description = 'Price-to-free-cash-flow. Often considered cleaner than P/E.'\n\n// ── Enterprise Value ──────────────────────────────────────────────────────────\n\nexport function enterpriseValue(input: {\n marketCap: number\n totalDebt: number\n cash: number\n minorityInterest?: number | null\n preferredStock?: number | null\n}): number {\n return (\n input.marketCap +\n input.totalDebt -\n input.cash +\n (input.minorityInterest ?? 0) +\n (input.preferredStock ?? 0)\n )\n}\nenterpriseValue.formula = 'Market Cap + Total Debt - Cash + Minority Interest + Preferred Stock'\nenterpriseValue.description = 'Enterprise value — the theoretical takeover price of a company.'\n\n// ── EV Multiples ─────────────────────────────────────────────────────────────\n\nexport function evEbitda(input: {\n enterpriseValue: number\n ebitda: number\n}): number | null {\n return safeDivide(input.enterpriseValue, input.ebitda)\n}\nevEbitda.formula = 'Enterprise Value / EBITDA'\nevEbitda.description = 'Capital-structure-neutral valuation multiple. Popular in LBO analysis.'\n\nexport function evEbit(input: {\n enterpriseValue: number\n ebit: number\n}): number | null {\n return safeDivide(input.enterpriseValue, input.ebit)\n}\nevEbit.formula = 'Enterprise Value / EBIT'\nevEbit.description = 'Like EV/EBITDA but accounts for depreciation-heavy businesses.'\n\nexport function evRevenue(input: {\n enterpriseValue: number\n revenue: number\n}): number | null {\n return safeDivide(input.enterpriseValue, input.revenue)\n}\nevRevenue.formula = 'Enterprise Value / Revenue'\nevRevenue.description = 'Useful for high-growth companies without positive EBITDA.'\n\nexport function evFcf(input: {\n enterpriseValue: number\n freeCashFlow: number\n}): number | null {\n return safeDivide(input.enterpriseValue, input.freeCashFlow)\n}\nevFcf.formula = 'Enterprise Value / Free Cash Flow'\nevFcf.description = 'EV-to-free-cash-flow. Preferred by value investors.'\n\nexport function evInvestedCapital(input: {\n enterpriseValue: number\n investedCapital: number\n}): number | null {\n return safeDivide(input.enterpriseValue, input.investedCapital)\n}\nevInvestedCapital.formula = 'Enterprise Value / Invested Capital'\nevInvestedCapital.description = 'Indicates whether the market values the company above its invested capital base.'\n\n// ── Tobin's Q ─────────────────────────────────────────────────────────────────\n\nexport function tobinsQ(input: {\n marketCap: number\n totalDebt: number\n totalAssets: number\n}): number | null {\n const marketValue = input.marketCap + input.totalDebt\n return safeDivide(marketValue, input.totalAssets)\n}\ntobinsQ.formula = '(Market Cap + Total Debt) / Total Assets'\ntobinsQ.description = 'Q > 1 = market values firm above replacement cost. Q < 1 = below.'\n\n// ── Graham Number ─────────────────────────────────────────────────────────────\n\nexport function grahamNumber(input: {\n eps: number\n bookValuePerShare: number\n}): number | null {\n if (input.eps <= 0 || input.bookValuePerShare <= 0) return null\n return Math.sqrt(22.5 * input.eps * input.bookValuePerShare)\n}\ngrahamNumber.formula = 'sqrt(22.5 × EPS × Book Value Per Share)'\ngrahamNumber.description = 'Ben Graham\\'s estimate of fair value. Buy below, sell above.'\n\n// ── Ben Graham Intrinsic Value ─────────────────────────────────────────────────\n\nexport function grahamIntrinsicValue(input: {\n eps: number\n growthRate: number\n aaaBondYield: number\n}): number | null {\n if (input.aaaBondYield <= 0) return null\n // Graham's revised formula: V* = EPS × (8.5 + 2g) × 4.4 / Y\n return safeDivide(\n input.eps * (8.5 + 2 * input.growthRate) * 4.4,\n input.aaaBondYield\n )\n}\ngrahamIntrinsicValue.formula = 'EPS × (8.5 + 2 × Growth Rate) × 4.4 / AAA Bond Yield'\ngrahamIntrinsicValue.description = 'Graham\\'s 1962 revised intrinsic value formula. Use growth rate as %, e.g. 15.'\n","import { safeDivide } from '../../utils/safe-divide.js'\n\n/**\n * 2-stage DCF model.\n * Stage 1: explicit FCF projections (or constant growth from base FCF).\n * Stage 2: terminal value via Gordon Growth Model.\n */\nexport function dcf2Stage(input: {\n /** Base free cash flow (TTM) */\n baseFcf: number\n /** Stage 1 annual growth rate (decimal, e.g. 0.15 for 15%) */\n growthRate: number\n /** Number of years in high-growth stage */\n years: number\n /** Terminal growth rate (decimal, e.g. 0.03 for 3%) */\n terminalGrowthRate: number\n /** Weighted average cost of capital (decimal) */\n wacc: number\n /** Net debt to subtract from enterprise value */\n netDebt?: number\n /** Shares outstanding to get per-share value */\n sharesOutstanding?: number\n}): {\n intrinsicValue: number\n intrinsicValuePerShare: number | null\n pvStage1: number\n pvTerminalValue: number\n terminalValue: number\n} | null {\n if (input.wacc <= input.terminalGrowthRate) return null\n if (input.wacc <= 0) return null\n\n let pvStage1 = 0\n let fcf = input.baseFcf\n for (let t = 1; t <= input.years; t++) {\n fcf = fcf * (1 + input.growthRate)\n pvStage1 += fcf / Math.pow(1 + input.wacc, t)\n }\n\n const terminalFcf = fcf * (1 + input.terminalGrowthRate)\n const terminalValue = terminalFcf / (input.wacc - input.terminalGrowthRate)\n const pvTerminalValue = terminalValue / Math.pow(1 + input.wacc, input.years)\n\n const enterpriseValue = pvStage1 + pvTerminalValue\n const intrinsicValue = enterpriseValue - (input.netDebt ?? 0)\n const intrinsicValuePerShare = input.sharesOutstanding\n ? safeDivide(intrinsicValue, input.sharesOutstanding)\n : null\n\n return { intrinsicValue, intrinsicValuePerShare, pvStage1, pvTerminalValue, terminalValue }\n}\ndcf2Stage.formula = 'Sum(FCF_t / (1+WACC)^t) + [FCF_n*(1+g) / (WACC-g)] / (1+WACC)^n'\ndcf2Stage.description = '2-stage DCF. Stage 1 explicit growth, Stage 2 terminal value via Gordon Growth Model.'\n\n/**\n * Gordon Growth (Dividend Discount) Model for dividend-paying stocks.\n */\nexport function gordonGrowthModel(input: {\n nextDividend: number\n requiredReturn: number\n dividendGrowthRate: number\n}): number | null {\n if (input.requiredReturn <= input.dividendGrowthRate) return null\n return safeDivide(input.nextDividend, input.requiredReturn - input.dividendGrowthRate)\n}\ngordonGrowthModel.formula = 'D1 / (r - g)'\ngordonGrowthModel.description = 'DDM for stable dividend-paying stocks. Only valid when r > g.'\n\n/**\n * Reverse DCF — solves for the implied FCF growth rate baked into the current market price.\n * Uses bisection method over 20 iterations.\n */\nexport function reverseDcf(input: {\n marketCap: number\n baseFcf: number\n years: number\n terminalGrowthRate: number\n wacc: number\n netDebt?: number\n}): { impliedGrowthRate: number; interpretation: string } | null {\n const target = input.marketCap + (input.netDebt ?? 0)\n\n const computeEV = (g: number): number | null => {\n const result = dcf2Stage({\n baseFcf: input.baseFcf,\n growthRate: g,\n years: input.years,\n terminalGrowthRate: input.terminalGrowthRate,\n wacc: input.wacc,\n })\n return result?.intrinsicValue ?? null\n }\n\n let low = -0.5\n let high = 5.0\n\n for (let i = 0; i < 50; i++) {\n const mid = (low + high) / 2\n const ev = computeEV(mid)\n if (ev == null) return null\n if (Math.abs(ev - target) < 1) break\n if (ev < target) low = mid\n else high = mid\n }\n\n const impliedGrowthRate = (low + high) / 2\n\n return {\n impliedGrowthRate,\n interpretation: `Market implies ${(impliedGrowthRate * 100).toFixed(1)}% annual FCF growth over ${input.years} years`,\n }\n}\nreverseDcf.formula = 'Solve g such that DCF(g) = Market Cap'\nreverseDcf.description = 'Reverse-engineers the FCF growth rate implied by the current stock price.'\n","import { safeDivide } from '../../utils/safe-divide.js'\n\n// ── Margin Ratios ─────────────────────────────────────────────────────────────\n\nexport function grossMargin(input: {\n grossProfit: number\n revenue: number\n}): number | null {\n return safeDivide(input.grossProfit, input.revenue)\n}\ngrossMargin.formula = 'Gross Profit / Revenue'\ngrossMargin.description = 'Percentage of revenue remaining after cost of goods sold.'\n\nexport function operatingMargin(input: {\n ebit: number\n revenue: number\n}): number | null {\n return safeDivide(input.ebit, input.revenue)\n}\noperatingMargin.formula = 'EBIT / Revenue'\noperatingMargin.description = 'Operating income as a percentage of revenue.'\n\nexport function ebitdaMargin(input: {\n ebitda: number\n revenue: number\n}): number | null {\n return safeDivide(input.ebitda, input.revenue)\n}\nebitdaMargin.formula = 'EBITDA / Revenue'\nebitdaMargin.description = 'Earnings before interest, taxes, D&A as % of revenue.'\n\nexport function netProfitMargin(input: {\n netIncome: number\n revenue: number\n}): number | null {\n return safeDivide(input.netIncome, input.revenue)\n}\nnetProfitMargin.formula = 'Net Income / Revenue'\nnetProfitMargin.description = 'Bottom-line profitability after all expenses.'\n\nexport function nopatMargin(input: {\n nopat: number\n revenue: number\n}): number | null {\n return safeDivide(input.nopat, input.revenue)\n}\nnopatMargin.formula = 'NOPAT / Revenue'\nnopatMargin.description = 'Net operating profit after tax as % of revenue.'\n\n// ── Return Ratios ─────────────────────────────────────────────────────────────\n\nexport function roe(input: {\n netIncome: number\n avgTotalEquity: number\n}): number | null {\n return safeDivide(input.netIncome, input.avgTotalEquity)\n}\nroe.formula = 'Net Income / Average Total Equity'\nroe.description = 'Return on equity — how efficiently a company uses shareholder capital.'\n\nexport function roa(input: {\n netIncome: number\n avgTotalAssets: number\n}): number | null {\n return safeDivide(input.netIncome, input.avgTotalAssets)\n}\nroa.formula = 'Net Income / Average Total Assets'\nroa.description = 'Return on assets — how efficiently assets are used to generate profit.'\n\nexport function nopat(input: {\n ebit: number\n taxRate: number\n}): number {\n return input.ebit * (1 - input.taxRate)\n}\nnopat.formula = 'EBIT × (1 - Effective Tax Rate)'\nnopat.description = 'Net operating profit after tax — removes financing effects.'\n\nexport function roic(input: {\n nopat: number\n investedCapital: number\n}): number | null {\n return safeDivide(input.nopat, input.investedCapital)\n}\nroic.formula = 'NOPAT / Invested Capital'\nroic.description = 'ROIC vs WACC determines whether a company creates or destroys value.'\n\nexport function roce(input: {\n ebit: number\n totalAssets: number\n currentLiabilities: number\n}): number | null {\n const capitalEmployed = input.totalAssets - input.currentLiabilities\n return safeDivide(input.ebit, capitalEmployed)\n}\nroce.formula = 'EBIT / (Total Assets - Current Liabilities)'\nroce.description = 'Return on capital employed. Includes both equity and long-term debt.'\n\nexport function rote(input: {\n netIncome: number\n avgTotalEquity: number\n avgGoodwill: number\n avgIntangibleAssets: number\n}): number | null {\n const tangibleEquity = input.avgTotalEquity - input.avgGoodwill - input.avgIntangibleAssets\n return safeDivide(input.netIncome, tangibleEquity)\n}\nrote.formula = 'Net Income / (Avg Equity - Avg Goodwill - Avg Intangibles)'\nrote.description = 'Return on tangible equity. Strips acquisition premiums from the denominator.'\n\n// ── DuPont Analysis ───────────────────────────────────────────────────────────\n\nexport interface DuPont3Factor {\n netProfitMargin: number | null\n assetTurnover: number | null\n equityMultiplier: number | null\n roe: number | null\n}\n\nexport function duPont3(input: {\n netIncome: number\n revenue: number\n avgTotalAssets: number\n avgTotalEquity: number\n}): DuPont3Factor {\n const margin = safeDivide(input.netIncome, input.revenue)\n const turnover = safeDivide(input.revenue, input.avgTotalAssets)\n const multiplier = safeDivide(input.avgTotalAssets, input.avgTotalEquity)\n const roeVal =\n margin != null && turnover != null && multiplier != null\n ? margin * turnover * multiplier\n : null\n return { netProfitMargin: margin, assetTurnover: turnover, equityMultiplier: multiplier, roe: roeVal }\n}\nduPont3.formula = 'ROE = Net Profit Margin × Asset Turnover × Equity Multiplier'\nduPont3.description = '3-factor DuPont decomposition of ROE.'\n\n// ── Per-Employee ──────────────────────────────────────────────────────────────\n\nexport function revenuePerEmployee(input: {\n revenue: number\n employeeCount: number\n}): number | null {\n return safeDivide(input.revenue, input.employeeCount)\n}\nrevenuePerEmployee.formula = 'Revenue / Full-Time Employees'\nrevenuePerEmployee.description = 'Measures workforce productivity.'\n\nexport function profitPerEmployee(input: {\n netIncome: number\n employeeCount: number\n}): number | null {\n return safeDivide(input.netIncome, input.employeeCount)\n}\nprofitPerEmployee.formula = 'Net Income / Full-Time Employees'\nprofitPerEmployee.description = 'Net income generated per employee.'\n\n// ── Invested Capital ──────────────────────────────────────────────────────────\n\nexport function investedCapital(input: {\n totalEquity: number\n totalDebt: number\n cash: number\n}): number {\n return input.totalEquity + input.totalDebt - input.cash\n}\ninvestedCapital.formula = 'Total Equity + Total Debt - Excess Cash'\ninvestedCapital.description = 'Capital deployed to generate operating returns.'\n","import { safeDivide } from '../../utils/safe-divide.js'\n\nexport function currentRatio(input: {\n currentAssets: number\n currentLiabilities: number\n}): number | null {\n return safeDivide(input.currentAssets, input.currentLiabilities)\n}\ncurrentRatio.formula = 'Current Assets / Current Liabilities'\ncurrentRatio.description = 'Ability to pay short-term obligations. > 1 generally healthy.'\n\nexport function quickRatio(input: {\n cash: number\n shortTermInvestments: number\n accountsReceivable: number\n currentLiabilities: number\n}): number | null {\n const liquid = input.cash + input.shortTermInvestments + input.accountsReceivable\n return safeDivide(liquid, input.currentLiabilities)\n}\nquickRatio.formula = '(Cash + ST Investments + Accounts Receivable) / Current Liabilities'\nquickRatio.description = 'Liquidity excluding inventory. More conservative than current ratio.'\n\nexport function cashRatio(input: {\n cash: number\n shortTermInvestments: number\n currentLiabilities: number\n}): number | null {\n return safeDivide(input.cash + input.shortTermInvestments, input.currentLiabilities)\n}\ncashRatio.formula = '(Cash + Short-Term Investments) / Current Liabilities'\ncashRatio.description = 'Most conservative liquidity measure. Only counts actual cash.'\n\nexport function operatingCashFlowRatio(input: {\n operatingCashFlow: number\n currentLiabilities: number\n}): number | null {\n return safeDivide(input.operatingCashFlow, input.currentLiabilities)\n}\noperatingCashFlowRatio.formula = 'Operating Cash Flow / Current Liabilities'\noperatingCashFlowRatio.description = 'How well operating cash flow covers short-term obligations.'\n\n// ── Working Capital Cycle ─────────────────────────────────────────────────────\n\nexport function dso(input: {\n accountsReceivable: number\n revenue: number\n}): number | null {\n return safeDivide(input.accountsReceivable * 365, input.revenue)\n}\ndso.formula = '(Accounts Receivable / Revenue) × 365'\ndso.description = 'Days Sales Outstanding — average days to collect payment after a sale.'\n\nexport function dio(input: {\n inventory: number\n cogs: number\n}): number | null {\n return safeDivide(input.inventory * 365, input.cogs)\n}\ndio.formula = '(Inventory / COGS) × 365'\ndio.description = 'Days Inventory Outstanding — average days inventory is held before sale.'\n\nexport function dpo(input: {\n accountsPayable: number\n cogs: number\n}): number | null {\n return safeDivide(input.accountsPayable * 365, input.cogs)\n}\ndpo.formula = '(Accounts Payable / COGS) × 365'\ndpo.description = 'Days Payable Outstanding — average days taken to pay suppliers.'\n\nexport function cashConversionCycle(input: {\n dso: number\n dio: number\n dpo: number\n}): number {\n return input.dso + input.dio - input.dpo\n}\ncashConversionCycle.formula = 'DSO + DIO - DPO'\ncashConversionCycle.description = 'Days from cash outflow (inventory) to cash inflow (collections). Lower is better.'\n\nexport function defensiveIntervalRatio(input: {\n cash: number\n shortTermInvestments: number\n accountsReceivable: number\n dailyOperatingExpenses: number\n}): number | null {\n const liquid = input.cash + input.shortTermInvestments + input.accountsReceivable\n return safeDivide(liquid, input.dailyOperatingExpenses)\n}\ndefensiveIntervalRatio.formula = '(Cash + ST Investments + AR) / Daily Operating Expenses'\ndefensiveIntervalRatio.description = 'Days the company can operate using liquid assets alone, without new revenue.'\n","import { safeDivide } from '../../utils/safe-divide.js'\n\nexport function debtToEquity(input: {\n totalDebt: number\n totalEquity: number\n}): number | null {\n return safeDivide(input.totalDebt, input.totalEquity)\n}\ndebtToEquity.formula = 'Total Debt / Total Equity'\ndebtToEquity.description = 'Financial leverage. Higher = more debt-financed.'\n\nexport function netDebtToEquity(input: {\n totalDebt: number\n cash: number\n totalEquity: number\n}): number | null {\n const netDebt = input.totalDebt - input.cash\n return safeDivide(netDebt, input.totalEquity)\n}\nnetDebtToEquity.formula = '(Total Debt - Cash) / Total Equity'\nnetDebtToEquity.description = 'Net leverage ratio. Negative = net cash position.'\n\nexport function netDebtToEbitda(input: {\n totalDebt: number\n cash: number\n ebitda: number\n}): number | null {\n const netDebt = input.totalDebt - input.cash\n return safeDivide(netDebt, input.ebitda)\n}\nnetDebtToEbitda.formula = '(Total Debt - Cash) / EBITDA'\nnetDebtToEbitda.description = 'Years to repay net debt from EBITDA. Lenders often require < 3x.'\n\nexport function debtToAssets(input: {\n totalDebt: number\n totalAssets: number\n}): number | null {\n return safeDivide(input.totalDebt, input.totalAssets)\n}\ndebtToAssets.formula = 'Total Debt / Total Assets'\ndebtToAssets.description = 'Proportion of assets financed by debt.'\n\nexport function debtToCapital(input: {\n totalDebt: number\n totalEquity: number\n}): number | null {\n return safeDivide(input.totalDebt, input.totalDebt + input.totalEquity)\n}\ndebtToCapital.formula = 'Total Debt / (Total Debt + Total Equity)'\ndebtToCapital.description = 'Proportion of capital structure that is debt.'\n\nexport function interestCoverageRatio(input: {\n ebit: number\n interestExpense: number\n}): number | null {\n return safeDivide(input.ebit, input.interestExpense)\n}\ninterestCoverageRatio.formula = 'EBIT / Interest Expense'\ninterestCoverageRatio.description = 'Times interest is covered by operating earnings. < 1.5 is risky.'\n\nexport function ebitdaCoverageRatio(input: {\n ebitda: number\n interestExpense: number\n}): number | null {\n return safeDivide(input.ebitda, input.interestExpense)\n}\nebitdaCoverageRatio.formula = 'EBITDA / Interest Expense'\nebitdaCoverageRatio.description = 'Softer coverage ratio including D&A add-back.'\n\nexport function debtServiceCoverageRatio(input: {\n netOperatingIncome: number\n annualDebtService: number\n}): number | null {\n return safeDivide(input.netOperatingIncome, input.annualDebtService)\n}\ndebtServiceCoverageRatio.formula = 'Net Operating Income / Annual Debt Service (Principal + Interest)'\ndebtServiceCoverageRatio.description = 'Lenders require DSCR > 1.25. Critical for real estate and leveraged deals.'\n\nexport function fixedChargeCoverageRatio(input: {\n ebit: number\n fixedCharges: number\n interestExpense: number\n}): number | null {\n return safeDivide(input.ebit + input.fixedCharges, input.fixedCharges + input.interestExpense)\n}\nfixedChargeCoverageRatio.formula = '(EBIT + Fixed Charges) / (Fixed Charges + Interest Expense)'\nfixedChargeCoverageRatio.description = 'Covers lease payments and other fixed obligations beyond interest.'\n\nexport function equityMultiplier(input: {\n totalAssets: number\n totalEquity: number\n}): number | null {\n return safeDivide(input.totalAssets, input.totalEquity)\n}\nequityMultiplier.formula = 'Total Assets / Total Equity'\nequityMultiplier.description = 'Leverage component of DuPont analysis.'\n","import { safeDivide } from '../../utils/safe-divide.js'\n\nexport function assetTurnover(input: {\n revenue: number\n avgTotalAssets: number\n}): number | null {\n return safeDivide(input.revenue, input.avgTotalAssets)\n}\nassetTurnover.formula = 'Revenue / Average Total Assets'\nassetTurnover.description = 'Sales generated per dollar of total assets.'\n\nexport function fixedAssetTurnover(input: {\n revenue: number\n avgNetPPE: number\n}): number | null {\n return safeDivide(input.revenue, input.avgNetPPE)\n}\nfixedAssetTurnover.formula = 'Revenue / Average Net PP&E'\nfixedAssetTurnover.description = 'Efficiency of physical asset use. Low in capital-intensive industries.'\n\nexport function inventoryTurnover(input: {\n cogs: number\n avgInventory: number\n}): number | null {\n return safeDivide(input.cogs, input.avgInventory)\n}\ninventoryTurnover.formula = 'COGS / Average Inventory'\ninventoryTurnover.description = 'How many times inventory is sold per year. Higher = less cash tied up.'\n\nexport function receivablesTurnover(input: {\n revenue: number\n avgAccountsReceivable: number\n}): number | null {\n return safeDivide(input.revenue, input.avgAccountsReceivable)\n}\nreceivablesTurnover.formula = 'Revenue / Average Accounts Receivable'\nreceivablesTurnover.description = 'How quickly the company collects what it is owed.'\n\nexport function payablesTurnover(input: {\n cogs: number\n avgAccountsPayable: number\n}): number | null {\n return safeDivide(input.cogs, input.avgAccountsPayable)\n}\npayablesTurnover.formula = 'COGS / Average Accounts Payable'\npayablesTurnover.description = 'How quickly the company pays its suppliers.'\n\nexport function workingCapitalTurnover(input: {\n revenue: number\n avgWorkingCapital: number\n}): number | null {\n return safeDivide(input.revenue, input.avgWorkingCapital)\n}\nworkingCapitalTurnover.formula = 'Revenue / Average Working Capital'\nworkingCapitalTurnover.description = 'Revenue generated from each dollar of working capital.'\n\nexport function capitalTurnover(input: {\n revenue: number\n investedCapital: number\n}): number | null {\n return safeDivide(input.revenue, input.investedCapital)\n}\ncapitalTurnover.formula = 'Revenue / Invested Capital'\ncapitalTurnover.description = 'Sales generated per dollar of invested capital.'\n\nexport function operatingLeverage(input: {\n ebitCurrent: number\n ebitPrior: number\n revenueCurrent: number\n revenuePrior: number\n}): number | null {\n const ebitChange = safeDivide(\n input.ebitCurrent - input.ebitPrior,\n Math.abs(input.ebitPrior)\n )\n const revenueChange = safeDivide(\n input.revenueCurrent - input.revenuePrior,\n Math.abs(input.revenuePrior)\n )\n return safeDivide(ebitChange, revenueChange)\n}\noperatingLeverage.formula = '% Change in EBIT / % Change in Revenue'\noperatingLeverage.description = 'Sensitivity of operating income to revenue changes. High = more fixed costs.'\n","import { safeDivide } from '../../utils/safe-divide.js'\n\nexport function freeCashFlow(input: {\n operatingCashFlow: number\n capex: number\n}): number {\n return input.operatingCashFlow - Math.abs(input.capex)\n}\nfreeCashFlow.formula = 'Operating Cash Flow - Capital Expenditures'\nfreeCashFlow.description = 'Cash available after maintaining/growing asset base. The most important cash flow metric.'\n\nexport function leveredFcf(input: {\n freeCashFlow: number\n debtIssuance: number\n debtRepayments: number\n}): number {\n return input.freeCashFlow + input.debtIssuance - input.debtRepayments\n}\nleveredFcf.formula = 'FCF + Net Debt Change (Issuance - Repayments)'\nleveredFcf.description = 'FCF after accounting for debt financing activities.'\n\nexport function unleveredFcf(input: {\n nopat: number\n depreciationAndAmortization: number\n capex: number\n changeInWorkingCapital: number\n}): number {\n return input.nopat + input.depreciationAndAmortization - Math.abs(input.capex) - input.changeInWorkingCapital\n}\nunleveredFcf.formula = 'NOPAT + D&A - Capex - Change in Working Capital'\nunleveredFcf.description = 'FCF before debt payments — used in DCF valuation as FCFF.'\n\nexport function ownerEarnings(input: {\n netIncome: number\n depreciationAndAmortization: number\n maintenanceCapex: number\n changeInWorkingCapital?: number\n}): number {\n return (\n input.netIncome +\n input.depreciationAndAmortization -\n input.maintenanceCapex -\n (input.changeInWorkingCapital ?? 0)\n )\n}\nownerEarnings.formula = 'Net Income + D&A - Maintenance Capex - Change in WC'\nownerEarnings.description = 'Buffett\\'s owner earnings — true economic earnings available to shareholders.'\n\nexport function fcfYield(input: {\n freeCashFlow: number\n marketCap: number\n}): number | null {\n return safeDivide(input.freeCashFlow, input.marketCap)\n}\nfcfYield.formula = 'Free Cash Flow / Market Capitalization'\nfcfYield.description = 'FCF per dollar invested. Inverse of P/FCF. Higher = cheaper.'\n\nexport function fcfMargin(input: {\n freeCashFlow: number\n revenue: number\n}): number | null {\n return safeDivide(input.freeCashFlow, input.revenue)\n}\nfcfMargin.formula = 'Free Cash Flow / Revenue'\nfcfMargin.description = 'FCF generated per dollar of revenue.'\n\nexport function fcfConversion(input: {\n freeCashFlow: number\n netIncome: number\n}): number | null {\n return safeDivide(input.freeCashFlow, input.netIncome)\n}\nfcfConversion.formula = 'Free Cash Flow / Net Income'\nfcfConversion.description = 'FCF conversion > 1 means earnings are backed by real cash. < 1 raises quality concerns.'\n\nexport function ocfToSales(input: {\n operatingCashFlow: number\n revenue: number\n}): number | null {\n return safeDivide(input.operatingCashFlow, input.revenue)\n}\nocfToSales.formula = 'Operating Cash Flow / Revenue'\nocfToSales.description = 'Cash generated from operations per dollar of sales.'\n\nexport function capexToRevenue(input: {\n capex: number\n revenue: number\n}): number | null {\n return safeDivide(Math.abs(input.capex), input.revenue)\n}\ncapexToRevenue.formula = 'Capital Expenditures / Revenue'\ncapexToRevenue.description = 'Investment intensity. High in capital-intensive industries like manufacturing.'\n\nexport function capexToDepreciation(input: {\n capex: number\n depreciation: number\n}): number | null {\n return safeDivide(Math.abs(input.capex), input.depreciation)\n}\ncapexToDepreciation.formula = 'Capital Expenditures / Depreciation'\ncapexToDepreciation.description = '> 1 = company is investing more than assets are aging (growth). < 1 = under-investing.'\n\nexport function cashReturnOnAssets(input: {\n operatingCashFlow: number\n totalAssets: number\n}): number | null {\n return safeDivide(input.operatingCashFlow, input.totalAssets)\n}\ncashReturnOnAssets.formula = 'Operating Cash Flow / Total Assets'\ncashReturnOnAssets.description = 'Cash-based ROA. Harder to manipulate than accrual-based ROA.'\n","/**\n * Compound Annual Growth Rate.\n * @param start - starting value\n * @param end - ending value\n * @param years - number of years\n */\nexport function cagr(\n start: number | null | undefined,\n end: number | null | undefined,\n years: number\n): number | null {\n if (start == null || end == null || years <= 0) return null\n if (start <= 0) return null\n return Math.pow(end / start, 1 / years) - 1\n}\n\n/**\n * Annualizes a sub-annual return.\n * @param returnValue - periodic return (decimal)\n * @param periodsPerYear - e.g. 252 for daily, 12 for monthly, 4 for quarterly\n */\nexport function annualizeReturn(returnValue: number, periodsPerYear: number): number {\n return Math.pow(1 + returnValue, periodsPerYear) - 1\n}\n\n/**\n * Standard deviation of an array of numbers.\n * @param values - array of returns or values\n * @param ddof - degrees of freedom (0 = population, 1 = sample). Default: 1\n */\nexport function stdDev(values: number[], ddof = 1): number | null {\n if (values.length < 2) return null\n const mean = values.reduce((a, b) => a + b, 0) / values.length\n const variance =\n values.reduce((sum, v) => sum + Math.pow(v - mean, 2), 0) / (values.length - ddof)\n return Math.sqrt(variance)\n}\n\n/**\n * Arithmetic mean of an array.\n */\nexport function mean(values: number[]): number | null {\n if (values.length === 0) return null\n return values.reduce((a, b) => a + b, 0) / values.length\n}\n\n/**\n * Percentile of a sorted or unsorted array.\n * @param values - array of numbers\n * @param percentile - 0–1 (e.g. 0.05 for 5th percentile)\n */\nexport function percentile(values: number[], p: number): number | null {\n if (values.length === 0) return null\n const sorted = [...values].sort((a, b) => a - b)\n const idx = p * (sorted.length - 1)\n const lower = Math.floor(idx)\n const upper = Math.ceil(idx)\n if (lower === upper) return sorted[lower] ?? null\n const lv = sorted[lower]\n const uv = sorted[upper]\n if (lv == null || uv == null) return null\n return lv + (uv - lv) * (idx - lower)\n}\n\n/**\n * Maximum drawdown from a series of prices or cumulative returns.\n * Returns a positive decimal, e.g. 0.3 for a 30% drawdown.\n */\nexport function maxDrawdown(prices: number[]): number | null {\n if (prices.length < 2) return null\n let peak = prices[0] ?? 0\n let maxDD = 0\n for (const price of prices) {\n if (price > peak) peak = price\n const dd = peak > 0 ? (peak - price) / peak : 0\n if (dd > maxDD) maxDD = dd\n }\n return maxDD\n}\n\n/**\n * Convert an array of prices to period returns.\n */\nexport function pricesToReturns(prices: number[]): number[] {\n const returns: number[] = []\n for (let i = 1; i < prices.length; i++) {\n const prev = prices[i - 1]\n const curr = prices[i]\n if (prev != null && curr != null && prev !== 0) {\n returns.push((curr - prev) / prev)\n }\n }\n return returns\n}\n","import { safeDivide } from '../../utils/safe-divide.js'\nimport { cagr } from '../../utils/math.js'\n\nfunction yoyGrowth(current: number, prior: number): number | null {\n if (prior === 0) return null\n return safeDivide(current - prior, Math.abs(prior))\n}\n\nexport function revenueGrowth(input: {\n revenueCurrent: number\n revenuePrior: number\n}): number | null {\n return yoyGrowth(input.revenueCurrent, input.revenuePrior)\n}\nrevenueGrowth.formula = '(Revenue_t - Revenue_t-1) / |Revenue_t-1|'\nrevenueGrowth.description = 'Year-over-year revenue growth rate.'\n\nexport function revenueCAGR(input: {\n revenueStart: number\n revenueEnd: number\n years: number\n}): number | null {\n return cagr(input.revenueStart, input.revenueEnd, input.years)\n}\nrevenueCAGR.formula = '(Revenue_end / Revenue_start)^(1/years) - 1'\nrevenueCAGR.description = 'Compound annual growth rate of revenue over multiple years.'\n\nexport function epsGrowth(input: {\n epsCurrent: number\n epsPrior: number\n}): number | null {\n return yoyGrowth(input.epsCurrent, input.epsPrior)\n}\nepsGrowth.formula = '(EPS_t - EPS_t-1) / |EPS_t-1|'\nepsGrowth.description = 'Year-over-year earnings per share growth.'\n\nexport function ebitdaGrowth(input: {\n ebitdaCurrent: number\n ebitdaPrior: number\n}): number | null {\n return yoyGrowth(input.ebitdaCurrent, input.ebitdaPrior)\n}\nebitdaGrowth.formula = '(EBITDA_t - EBITDA_t-1) / |EBITDA_t-1|'\nebitdaGrowth.description = 'Year-over-year EBITDA growth.'\n\nexport function fcfGrowth(input: {\n fcfCurrent: number\n fcfPrior: number\n}): number | null {\n return yoyGrowth(input.fcfCurrent, input.fcfPrior)\n}\nfcfGrowth.formula = '(FCF_t - FCF_t-1) / |FCF_t-1|'\nfcfGrowth.description = 'Year-over-year free cash flow growth.'\n\nexport function bvpsGrowth(input: {\n bvpsCurrent: number\n bvpsPrior: number\n}): number | null {\n return yoyGrowth(input.bvpsCurrent, input.bvpsPrior)\n}\nbvpsGrowth.formula = '(BVPS_t - BVPS_t-1) / |BVPS_t-1|'\nbvpsGrowth.description = 'Book value per share growth — tracks compounding of equity.'\n\nexport function dividendGrowthRate(input: {\n dpsCurrent: number\n dpsPrior: number\n}): number | null {\n return yoyGrowth(input.dpsCurrent, input.dpsPrior)\n}\ndividendGrowthRate.formula = '(DPS_t - DPS_t-1) / DPS_t-1'\ndividendGrowthRate.description = 'Year-over-year dividend per share growth.'\n\nexport function earningsPowerValue(input: {\n ebit: number\n taxRate: number\n wacc: number\n}): number | null {\n const nopatValue = input.ebit * (1 - input.taxRate)\n return safeDivide(nopatValue, input.wacc)\n}\nearningsPowerValue.formula = 'EBIT × (1 - Tax Rate) / WACC'\nearningsPowerValue.description = 'EPV — intrinsic value assuming zero growth. Conservative floor for valuation.'\n","import { safeDivide } from '../../utils/safe-divide.js'\nimport { stdDev, mean, percentile, maxDrawdown, pricesToReturns, annualizeReturn } from '../../utils/math.js'\n\n// ── Beta ──────────────────────────────────────────────────────────────────────\n\nexport function beta(input: {\n stockReturns: number[]\n marketReturns: number[]\n}): number | null {\n const { stockReturns, marketReturns } = input\n if (stockReturns.length !== marketReturns.length || stockReturns.length < 2) return null\n\n const n = stockReturns.length\n const meanStock = stockReturns.reduce((a, b) => a + b, 0) / n\n const meanMarket = marketReturns.reduce((a, b) => a + b, 0) / n\n\n let covariance = 0\n let varianceMarket = 0\n for (let i = 0; i < n; i++) {\n const ds = (stockReturns[i] ?? 0) - meanStock\n const dm = (marketReturns[i] ?? 0) - meanMarket\n covariance += ds * dm\n varianceMarket += dm * dm\n }\n\n return safeDivide(covariance, varianceMarket)\n}\nbeta.formula = 'Cov(r_stock, r_market) / Var(r_market)'\nbeta.description = 'Sensitivity of stock returns to market returns. Beta = 1 means moves with market.'\n\n// ── Jensen Alpha ──────────────────────────────────────────────────────────────\n\nexport function jensensAlpha(input: {\n portfolioReturn: number\n riskFreeRate: number\n beta: number\n marketReturn: number\n}): number {\n return input.portfolioReturn - (input.riskFreeRate + input.beta * (input.marketReturn - input.riskFreeRate))\n}\njensensAlpha.formula = 'Rp - [Rf + β × (Rm - Rf)]'\njensensAlpha.description = 'Excess return above what CAPM predicts. Positive = outperformance.'\n\n// ── Sharpe Ratio ──────────────────────────────────────────────────────────────\n\nexport function sharpeRatio(input: {\n returns: number[]\n riskFreeRate: number\n periodsPerYear?: number\n}): number | null {\n const { returns, riskFreeRate, periodsPerYear = 252 } = input\n const avgReturn = mean(returns)\n const vol = stdDev(returns, 1)\n if (avgReturn == null || vol == null || vol === 0) return null\n\n const annualizedReturn = annualizeReturn(avgReturn, periodsPerYear)\n const annualizedVol = vol * Math.sqrt(periodsPerYear)\n return safeDivide(annualizedReturn - riskFreeRate, annualizedVol)\n}\nsharpeRatio.formula = '(Annualized Return - Risk-Free Rate) / Annualized StdDev'\nsharpeRatio.description = 'Risk-adjusted return per unit of total volatility. > 1 is good, > 2 is excellent.'\n\n// ── Sortino Ratio ─────────────────────────────────────────────────────────────\n\nexport function sortinoRatio(input: {\n returns: number[]\n riskFreeRate: number\n mar?: number\n periodsPerYear?: number\n}): number | null {\n const { returns, riskFreeRate, mar = 0, periodsPerYear = 252 } = input\n const avgReturn = mean(returns)\n if (avgReturn == null) return null\n\n const downsideReturns = returns.filter(r => r < mar)\n if (downsideReturns.length === 0) return null\n\n const downsideVariance = downsideReturns.reduce((sum, r) => sum + Math.pow(r - mar, 2), 0) / returns.length\n const downsideDeviation = Math.sqrt(downsideVariance) * Math.sqrt(periodsPerYear)\n if (downsideDeviation === 0) return null\n\n const annualizedReturn = annualizeReturn(avgReturn, periodsPerYear)\n return safeDivide(annualizedReturn - riskFreeRate, downsideDeviation)\n}\nsortinoRatio.formula = '(Annualized Return - Rf) / Downside Deviation'\nsortinoRatio.description = 'Like Sharpe but penalizes only downside volatility. Better for asymmetric returns.'\n\n// ── Treynor Ratio ─────────────────────────────────────────────────────────────\n\nexport function treynorRatio(input: {\n portfolioReturn: number\n riskFreeRate: number\n beta: number\n}): number | null {\n return safeDivide(input.portfolioReturn - input.riskFreeRate, input.beta)\n}\ntreynorRatio.formula = '(Portfolio Return - Risk-Free Rate) / Beta'\ntreynorRatio.description = 'Risk-adjusted return per unit of market (systematic) risk.'\n\n// ── Calmar Ratio ─────────────────────────────────────────────────────────────\n\nexport function calmarRatio(input: {\n returns: number[]\n periodsPerYear?: number\n}): number | null {\n const { returns, periodsPerYear = 252 } = input\n const avgReturn = mean(returns)\n if (avgReturn == null) return null\n\n const cumulative = returns.reduce((acc, r) => acc * (1 + r), 1)\n const prices = [1]\n let cur = 1\n for (const r of returns) {\n cur *= 1 + r\n prices.push(cur)\n }\n\n const mdd = maxDrawdown(prices)\n if (mdd == null || mdd === 0) return null\n\n const annualizedReturn = annualizeReturn(avgReturn, periodsPerYear)\n return safeDivide(annualizedReturn, mdd)\n}\ncalmarRatio.formula = 'Annualized Return / Maximum Drawdown'\ncalmarRatio.description = 'Return relative to worst drawdown. Popular in hedge fund analysis.'\n\n// ── Information Ratio ─────────────────────────────────────────────────────────\n\nexport function informationRatio(input: {\n portfolioReturns: number[]\n benchmarkReturns: number[]\n}): number | null {\n const { portfolioReturns, benchmarkReturns } = input\n if (portfolioReturns.length !== benchmarkReturns.length) return null\n\n const activeReturns = portfolioReturns.map((r, i) => r - (benchmarkReturns[i] ?? 0))\n const avgActive = mean(activeReturns)\n const trackingErr = stdDev(activeReturns, 1)\n return safeDivide(avgActive, trackingErr)\n}\ninformationRatio.formula = 'Mean Active Return / Tracking Error'\ninformationRatio.description = 'Skill of an active manager. IR > 0.5 is considered good.'\n\n// ── Omega Ratio ───────────────────────────────────────────────────────────────\n\nexport function omegaRatio(input: {\n returns: number[]\n threshold?: number\n}): number | null {\n const { returns, threshold = 0 } = input\n let gains = 0\n let losses = 0\n for (const r of returns) {\n if (r > threshold) gains += r - threshold\n else losses += threshold - r\n }\n return safeDivide(gains, losses)\n}\nomegaRatio.formula = 'E[returns above threshold] / E[returns below threshold]'\nomegaRatio.description = 'Non-parametric risk-adjusted return. > 1 is desirable.'\n\n// ── Max Drawdown ──────────────────────────────────────────────────────────────\n\nexport function maximumDrawdown(input: {\n prices: number[]\n}): number | null {\n return maxDrawdown(input.prices)\n}\nmaximumDrawdown.formula = '(Peak - Trough) / Peak'\nmaximumDrawdown.description = 'Largest peak-to-trough decline. Measures worst-case loss scenario.'\n\n// ── Tracking Error ────────────────────────────────────────────────────────────\n\nexport function trackingError(input: {\n portfolioReturns: number[]\n benchmarkReturns: number[]\n periodsPerYear?: number\n}): number | null {\n const { portfolioReturns, benchmarkReturns, periodsPerYear = 252 } = input\n if (portfolioReturns.length !== benchmarkReturns.length) return null\n\n const activeReturns = portfolioReturns.map((r, i) => r - (benchmarkReturns[i] ?? 0))\n const te = stdDev(activeReturns, 1)\n if (te == null) return null\n return te * Math.sqrt(periodsPerYear)\n}\ntrackingError.formula = 'Annualized StdDev(Portfolio Returns - Benchmark Returns)'\ntrackingError.description = 'How closely a portfolio tracks its benchmark. Lower = more index-like.'\n\n// ── VaR ───────────────────────────────────────────────────────────────────────\n\nexport function historicalVaR(input: {\n returns: number[]\n confidence?: number\n}): number | null {\n const { returns, confidence = 0.95 } = input\n const p = percentile(returns, 1 - confidence)\n return p != null ? -p : null\n}\nhistoricalVaR.formula = '-Percentile(returns, 1 - confidence)'\nhistoricalVaR.description = 'Historical VaR at given confidence level. Returns a positive loss value.'\n\nexport function parametricVaR(input: {\n returns: number[]\n confidence?: number\n}): number | null {\n const { returns, confidence = 0.95 } = input\n const mu = mean(returns)\n const sigma = stdDev(returns, 1)\n if (mu == null || sigma == null) return null\n\n // Standard normal z-score for one-tailed\n const zScores: Record<number, number> = {\n 0.90: 1.282,\n 0.95: 1.645,\n 0.99: 2.326,\n 0.999: 3.090,\n }\n const z = zScores[confidence] ?? 1.645\n return -(mu - z * sigma)\n}\nparametricVaR.formula = '-(μ - z × σ) where z is the normal quantile for confidence level'\nparametricVaR.description = 'Parametric VaR assuming normal distribution.'\n\nexport function conditionalVaR(input: {\n returns: number[]\n confidence?: number\n}): number | null {\n const { returns, confidence = 0.95 } = input\n const var_ = percentile(returns, 1 - confidence)\n if (var_ == null) return null\n\n const tailReturns = returns.filter(r => r <= var_)\n const cvar = mean(tailReturns)\n return cvar != null ? -cvar : null\n}\nconditionalVaR.formula = '-Mean(returns that are ≤ VaR threshold)'\nconditionalVaR.description = 'CVaR / Expected Shortfall — average loss in the worst (1-confidence)% scenarios.'\n\n// ── Ulcer Index ───────────────────────────────────────────────────────────────\n\nexport function ulcerIndex(input: {\n prices: number[]\n}): number | null {\n const { prices } = input\n if (prices.length < 2) return null\n\n let peak = prices[0] ?? 0\n const drawdowns: number[] = []\n for (const p of prices) {\n if (p > peak) peak = p\n drawdowns.push(peak > 0 ? ((p - peak) / peak) * 100 : 0)\n }\n\n const meanSqDD = drawdowns.reduce((sum, d) => sum + d * d, 0) / drawdowns.length\n return Math.sqrt(meanSqDD)\n}\nulcerIndex.formula = 'sqrt(mean(drawdown_pct^2))'\nulcerIndex.description = 'Measures drawdown depth and duration. Lower is less stressful.'\n\n// ── Capture Ratios ────────────────────────────────────────────────────────────\n\nexport function upsideCaptureRatio(input: {\n portfolioReturns: number[]\n benchmarkReturns: number[]\n}): number | null {\n const { portfolioReturns, benchmarkReturns } = input\n const upPeriods = benchmarkReturns\n .map((b, i) => ({ b, p: portfolioReturns[i] ?? 0 }))\n .filter(({ b }) => b > 0)\n\n if (upPeriods.length === 0) return null\n const portAvg = mean(upPeriods.map(x => x.p))\n const benchAvg = mean(upPeriods.map(x => x.b))\n return safeDivide(portAvg, benchAvg)\n}\nupsideCaptureRatio.formula = 'Portfolio Return (up markets) / Benchmark Return (up markets)'\nupsideCaptureRatio.description = '> 100% means outperformed benchmark in up markets.'\n\nexport function downsideCaptureRatio(input: {\n portfolioReturns: number[]\n benchmarkReturns: number[]\n}): number | null {\n const { portfolioReturns, benchmarkReturns } = input\n const downPeriods = benchmarkReturns\n .map((b, i) => ({ b, p: portfolioReturns[i] ?? 0 }))\n .filter(({ b }) => b < 0)\n\n if (downPeriods.length === 0) return null\n const portAvg = mean(downPeriods.map(x => x.p))\n const benchAvg = mean(downPeriods.map(x => x.b))\n return safeDivide(portAvg, benchAvg)\n}\ndownsideCaptureRatio.formula = 'Portfolio Return (down markets) / Benchmark Return (down markets)'\ndownsideCaptureRatio.description = '< 100% means lost less than benchmark in down markets.'\n","import { safeDivide } from '../../utils/safe-divide.js'\n\n// ── Piotroski F-Score ─────────────────────────────────────────────────────────\n\nexport interface PiotroskiInput {\n current: {\n netIncome: number\n totalAssets: number\n operatingCashFlow: number\n longTermDebt: number\n currentAssets: number\n currentLiabilities: number\n sharesOutstanding: number\n grossProfit: number\n revenue: number\n }\n prior: {\n netIncome: number\n totalAssets: number\n longTermDebt: number\n currentAssets: number\n currentLiabilities: number\n sharesOutstanding: number\n grossProfit: number\n revenue: number\n }\n}\n\nexport interface PiotroskiResult {\n score: number\n signals: {\n // Profitability\n roa_positive: boolean\n ocf_positive: boolean\n roa_improving: boolean\n quality_earnings: boolean\n // Leverage / Liquidity\n lower_leverage: boolean\n higher_liquidity: boolean\n no_dilution: boolean\n // Operating Efficiency\n higher_gross_margin: boolean\n higher_asset_turnover: boolean\n }\n interpretation: string\n}\n\nexport function piotroskiFScore(input: PiotroskiInput): PiotroskiResult {\n const { current, prior } = input\n\n const roaCurrent = (current.netIncome / current.totalAssets)\n const roaPrior = (prior.netIncome / prior.totalAssets)\n const leverageCurrent = current.totalAssets > 0 ? current.longTermDebt / current.totalAssets : 0\n const leveragePrior = prior.totalAssets > 0 ? prior.longTermDebt / prior.totalAssets : 0\n const crCurrent = current.currentLiabilities > 0 ? current.currentAssets / current.currentLiabilities : 0\n const crPrior = prior.currentLiabilities > 0 ? prior.currentAssets / prior.currentLiabilities : 0\n const gmCurrent = current.revenue > 0 ? current.grossProfit / current.revenue : 0\n const gmPrior = prior.revenue > 0 ? prior.grossProfit / prior.revenue : 0\n const atCurrent = current.totalAssets > 0 ? current.revenue / current.totalAssets : 0\n const atPrior = prior.totalAssets > 0 ? prior.revenue / prior.totalAssets : 0\n\n const signals = {\n // F1: ROA positive\n roa_positive: roaCurrent > 0,\n // F2: Operating cash flow positive\n ocf_positive: current.operatingCashFlow > 0,\n // F3: ROA improving year over year\n roa_improving: roaCurrent > roaPrior,\n // F4: Accruals — OCF > NI (quality earnings, cash-backed)\n quality_earnings: current.operatingCashFlow > current.netIncome,\n // F5: Long-term debt / assets ratio declined\n lower_leverage: leverageCurrent < leveragePrior,\n // F6: Current ratio improved\n higher_liquidity: crCurrent > crPrior,\n // F7: No new shares issued (dilution)\n no_dilution: current.sharesOutstanding <= prior.sharesOutstanding,\n // F8: Gross margin improved\n higher_gross_margin: gmCurrent > gmPrior,\n // F9: Asset turnover improved\n higher_asset_turnover: atCurrent > atPrior,\n }\n\n const score = Object.values(signals).filter(Boolean).length\n\n let interpretation = ''\n if (score >= 8) interpretation = 'Strong (8-9): High financial strength, potential value opportunity'\n else if (score >= 6) interpretation = 'Good (6-7): Reasonably healthy fundamentals'\n else if (score >= 4) interpretation = 'Neutral (4-5): Mixed signals, further analysis needed'\n else interpretation = 'Weak (0-3): Multiple red flags, high risk'\n\n return { score, signals, interpretation }\n}\npiotroskiFScore.formula = '9 binary signals across Profitability, Leverage/Liquidity, Operating Efficiency'\npiotroskiFScore.description = 'F-Score 0-9. >= 8 is strong buy signal. <= 2 is short signal.'\n\n// ── Altman Z-Score ────────────────────────────────────────────────────────────\n\nexport interface AltmanInput {\n workingCapital: number\n retainedEarnings: number\n ebit: number\n marketCap: number\n totalLiabilities: number\n totalAssets: number\n revenue: number\n}\n\nexport interface AltmanResult {\n z: number\n x1: number\n x2: number\n x3: number\n x4: number\n x5: number\n zone: 'safe' | 'grey' | 'distress'\n interpretation: string\n}\n\nexport function altmanZScore(input: AltmanInput): AltmanResult | null {\n if (input.totalAssets === 0 || input.totalLiabilities === 0) return null\n\n const x1 = input.workingCapital / input.totalAssets\n const x2 = input.retainedEarnings / input.totalAssets\n const x3 = input.ebit / input.totalAssets\n const x4 = input.marketCap / input.totalLiabilities\n const x5 = input.revenue / input.totalAssets\n\n const z = 1.2 * x1 + 1.4 * x2 + 3.3 * x3 + 0.6 * x4 + 1.0 * x5\n\n let zone: 'safe' | 'grey' | 'distress'\n let interpretation: string\n if (z > 2.99) {\n zone = 'safe'\n interpretation = 'Safe zone (Z > 2.99): Low probability of bankruptcy'\n } else if (z > 1.81) {\n zone = 'grey'\n interpretation = 'Grey zone (1.81 < Z < 2.99): Uncertain, monitor closely'\n } else {\n zone = 'distress'\n interpretation = 'Distress zone (Z < 1.81): High probability of financial distress'\n }\n\n return { z, x1, x2, x3, x4, x5, zone, interpretation }\n}\naltmanZScore.formula = '1.2×X1 + 1.4×X2 + 3.3×X3 + 0.6×X4 + 1.0×X5 (public manufacturing)'\naltmanZScore.description = 'Bankruptcy prediction model. Safe > 2.99, Distress < 1.81.'\n\n// ── Beneish M-Score ───────────────────────────────────────────────────────────\n\nexport interface BeneishInput {\n current: {\n revenue: number\n accountsReceivable: number\n grossProfit: number\n totalAssets: number\n depreciation: number\n ppGross: number\n sgaExpense: number\n totalDebt: number\n netIncome: number\n cashFlowFromOps: number\n }\n prior: {\n revenue: number\n accountsReceivable: number\n grossProfit: number\n totalAssets: number\n depreciation: number\n ppGross: number\n sgaExpense: number\n totalDebt: number\n }\n}\n\nexport interface BeneishResult {\n mScore: number\n variables: {\n dsri: number\n gmi: number\n aqi: number\n sgi: number\n depi: number\n sgai: number\n lvgi: number\n tata: number\n }\n manipulationLikely: boolean\n interpretation: string\n}\n\nexport function beneishMScore(input: BeneishInput): BeneishResult | null {\n const { current: c, prior: p } = input\n\n if (p.revenue === 0 || p.totalAssets === 0 || p.grossProfit === 0) return null\n\n // DSRI: Days Sales Receivable Index\n const dsri = safeDivide(\n safeDivide(c.accountsReceivable, c.revenue),\n safeDivide(p.accountsReceivable, p.revenue)\n )\n // GMI: Gross Margin Index\n const gmi = safeDivide(\n safeDivide(p.grossProfit, p.revenue),\n safeDivide(c.grossProfit, c.revenue)\n )\n // AQI: Asset Quality Index\n const aqiCurrent = c.totalAssets > 0\n ? 1 - (c.accountsReceivable + c.ppGross + c.cashFlowFromOps) / c.totalAssets\n : null\n const aqiPrior = p.totalAssets > 0\n ? 1 - (p.accountsReceivable + p.ppGross) / p.totalAssets\n : null\n const aqi = safeDivide(aqiCurrent, aqiPrior)\n // SGI: Sales Growth Index\n const sgi = safeDivide(c.revenue, p.revenue)\n // DEPI: Depreciation Index\n const depiCurrent = c.ppGross > 0 ? c.depreciation / (c.depreciation + c.ppGross) : null\n const depiPrior = p.ppGross > 0 ? p.depreciation / (p.depreciation + p.ppGross) : null\n const depi = safeDivide(depiPrior, depiCurrent)\n // SGAI: SG&A Expense Index\n const sgai = safeDivide(\n safeDivide(c.sgaExpense, c.revenue),\n safeDivide(p.sgaExpense, p.revenue)\n )\n // LVGI: Leverage Index\n const lvgi = safeDivide(\n safeDivide(c.totalDebt, c.totalAssets),\n safeDivide(p.totalDebt, p.totalAssets)\n )\n // TATA: Total Accruals to Total Assets\n const tata = c.totalAssets > 0\n ? (c.netIncome - c.cashFlowFromOps) / c.totalAssets\n : null\n\n if (\n dsri == null || gmi == null || aqi == null || sgi == null ||\n depi == null || sgai == null || lvgi == null || tata == null\n ) return null\n\n const mScore =\n -4.84 +\n 0.92 * dsri +\n 0.528 * gmi +\n 0.404 * aqi +\n 0.892 * sgi +\n 0.115 * depi -\n 0.172 * sgai +\n 4.679 * tata -\n 0.327 * lvgi\n\n const manipulationLikely = mScore > -2.22\n\n return {\n mScore,\n variables: { dsri, gmi, aqi, sgi, depi, sgai, lvgi, tata },\n manipulationLikely,\n interpretation: manipulationLikely\n ? `M-Score ${mScore.toFixed(2)} > -2.22: Possible earnings manipulation`\n : `M-Score ${mScore.toFixed(2)} ≤ -2.22: No strong sign of manipulation`,\n }\n}\nbeneishMScore.formula = '-4.84 + 0.92×DSRI + 0.528×GMI + 0.404×AQI + 0.892×SGI + 0.115×DEPI - 0.172×SGAI + 4.679×TATA - 0.327×LVGI'\nbeneishMScore.description = 'Earnings manipulation detector. M-Score > -2.22 indicates likely manipulation.'\n\n// ── Greenblatt Magic Formula ───────────────────────────────────────────────────\n\nexport interface MagicFormulaResult {\n roic: number | null\n evEbit: number | null\n}\n\nexport function magicFormula(input: {\n ebit: number\n netWorkingCapital: number\n netFixedAssets: number\n enterpriseValue: number\n}): MagicFormulaResult {\n const tangibleCapital = input.netWorkingCapital + input.netFixedAssets\n return {\n roic: safeDivide(input.ebit, tangibleCapital),\n evEbit: safeDivide(input.enterpriseValue, input.ebit),\n }\n}\nmagicFormula.formula = 'ROIC = EBIT / (Net Working Capital + Net Fixed Assets); Earnings Yield = EBIT / EV'\nmagicFormula.description = 'Greenblatt\\'s Magic Formula: rank by ROIC + EV/EBIT. Best combo = buy.'\n\n// ── Ohlson O-Score ────────────────────────────────────────────────────────────\n\nexport interface OhlsonInput {\n totalAssets: number\n totalLiabilities: number\n currentAssets: number\n currentLiabilities: number\n netIncome: number\n priorNetIncome: number\n operatingCashFlow: number\n workingCapital: number\n gnp: number // GNP price level index, often approximated as 1\n}\n\nexport function ohlsonOScore(input: OhlsonInput): { oScore: number; bankruptcyProbability: number; interpretation: string } | null {\n if (input.totalAssets <= 0) return null\n\n const t1 = -1.32 - 0.407 * Math.log(input.totalAssets / input.gnp)\n const t2 = 6.03 * (input.totalLiabilities / input.totalAssets)\n const t3 = -1.43 * (input.workingCapital / input.totalAssets)\n const t4 = 0.0757 * (input.currentLiabilities / input.currentAssets)\n const t5 = input.totalLiabilities > input.totalAssets ? -1.72 * 1 : 0\n const t6 = -2.37 * (input.netIncome / input.totalAssets)\n const t7 = -1.83 * (input.operatingCashFlow / input.totalAssets)\n const t8 =\n 0.285 * ((input.netIncome + input.priorNetIncome < 0) ? 1 : 0)\n const t9 =\n -0.521 *\n safeDivide(\n input.netIncome - input.priorNetIncome,\n Math.abs(input.netIncome) + Math.abs(input.priorNetIncome)\n )!\n\n const oScore = t1 + t2 + t3 + t4 + t5 + t6 + t7 + t8 + t9\n const bankruptcyProbability = 1 / (1 + Math.exp(-oScore))\n\n return {\n oScore,\n bankruptcyProbability,\n interpretation: bankruptcyProbability > 0.5\n ? `High bankruptcy risk (${(bankruptcyProbability * 100).toFixed(1)}% probability)`\n : `Low bankruptcy risk (${(bankruptcyProbability * 100).toFixed(1)}% probability)`,\n }\n}\nohlsonOScore.formula = 'Logistic regression: -1.32 - 0.407*SIZE + 6.03*TLTA - 1.43*WCTA + 0.0757*CLCA ...'\nohlsonOScore.description = 'Bankruptcy prediction via logistic regression. Outputs probability 0-1.'\n\n// ── Montier C-Score ────────────────────────────────────────────────────────────\n\nexport interface MontierCInput {\n current: {\n netIncome: number\n operatingCashFlow: number\n accountsReceivable: number\n revenue: number\n inventory: number\n cogs: number\n cash: number\n totalAssets: number\n longTermDebt: number\n grossProfit: number\n }\n prior: {\n accountsReceivable: number\n revenue: number\n inventory: number\n cogs: number\n cash: number\n totalAssets: number\n longTermDebt: number\n grossProfit: number\n }\n}\n\nexport interface MontierCResult {\n score: number\n signals: {\n c1Accruals: boolean\n c2DsoIncreasing: boolean\n c3InventoryDaysIncreasing: boolean\n c4CashDeclining: boolean\n c5LeverageIncreasing: boolean\n c6GrossMarginDeclining: boolean\n }\n highRisk: boolean\n interpretation: string\n}\n\n/**\n * Montier C-Score (Earnings Quality / Creative Accounting Score).\n *\n * 6 binary signals — higher score = more red flags = lower earnings quality.\n *\n * Reference: Montier, J. (2008). Joining the Dark Side: Pirates, Spies and Short Sellers.\n * Société Générale Cross Asset Research.\n */\nexport function montierCScore(input: MontierCInput): MontierCResult {\n const { current: c, prior: p } = input\n\n // C1: Net income > Operating cash flow (accrual-based earnings)\n const c1Accruals = c.netIncome > c.operatingCashFlow\n\n // C2: Days sales outstanding increasing\n const dsoCurrent = c.revenue > 0 ? c.accountsReceivable / c.revenue : 0\n const dsoPrior = p.revenue > 0 ? p.accountsReceivable / p.revenue : 0\n const c2DsoIncreasing = dsoCurrent > dsoPrior\n\n // C3: Days inventory outstanding increasing\n const dioCurrent = c.cogs > 0 ? c.inventory / c.cogs : 0\n const dioPrior = p.cogs > 0 ? p.inventory / p.cogs : 0\n const c3InventoryDaysIncreasing = dioCurrent > dioPrior\n\n // C4: Cash declining as % of total assets\n const cashPctCurrent = c.totalAssets > 0 ? c.cash / c.totalAssets : 0\n const cashPctPrior = p.totalAssets > 0 ? p.cash / p.totalAssets : 0\n const c4CashDeclining = cashPctCurrent < cashPctPrior\n\n // C5: Long-term debt increasing as % of total assets\n const ltdPctCurrent = c.totalAssets > 0 ? c.longTermDebt / c.totalAssets : 0\n const ltdPctPrior = p.totalAssets > 0 ? p.longTermDebt / p.totalAssets : 0\n const c5LeverageIncreasing = ltdPctCurrent > ltdPctPrior\n\n // C6: Gross margin declining\n const gmCurrent = c.revenue > 0 ? c.grossProfit / c.revenue : 0\n const gmPrior = p.revenue > 0 ? p.grossProfit / p.revenue : 0\n const c6GrossMarginDeclining = gmCurrent < gmPrior\n\n const signals = {\n c1Accruals,\n c2DsoIncreasing,\n c3InventoryDaysIncreasing,\n c4CashDeclining,\n c5LeverageIncreasing,\n c6GrossMarginDeclining,\n }\n\n const score = Object.values(signals).filter(Boolean).length\n const highRisk = score >= 4\n\n let interpretation: string\n if (score <= 1) interpretation = `C-Score ${score}/6: High earnings quality — few red flags`\n else if (score <= 3) interpretation = `C-Score ${score}/6: Moderate concern — review signals carefully`\n else interpretation = `C-Score ${score}/6: Significant red flags — possible earnings management`\n\n return { score, signals, highRisk, interpretation }\n}\n\nmontierCScore.formula = '6 binary signals: accruals, DSO, inventory days, cash%, long-term debt%, gross margin'\nmontierCScore.description = 'Earnings quality score 0-6. Higher = more red flags. 4+ signals = high risk.'\n","import { safeDivide } from '../../../utils/safe-divide.js'\n\nexport function ruleOf40(input: {\n revenueGrowthRatePct: number\n fcfMarginPct: number\n}): number {\n return input.revenueGrowthRatePct + input.fcfMarginPct\n}\nruleOf40.formula = 'Revenue Growth Rate (%) + FCF Margin (%)'\nruleOf40.description = 'SaaS health metric. > 40 = healthy balance of growth and profitability.'\n\nexport function magicNumber(input: {\n currentQuarterRevenue: number\n priorQuarterRevenue: number\n priorQuarterSalesAndMarketingSpend: number\n}): number | null {\n const netNewArrAnnualized = (input.currentQuarterRevenue - input.priorQuarterRevenue) * 4\n return safeDivide(netNewArrAnnualized, input.priorQuarterSalesAndMarketingSpend)\n}\nmagicNumber.formula = '(Current Quarter Revenue - Prior Quarter Revenue) × 4 / Prior Quarter S&M'\nmagicNumber.description = 'SaaS go-to-market efficiency. > 0.75 is good, > 1.0 is exceptional.'\n\nexport function netRevenueRetention(input: {\n beginningArr: number\n expansion: number\n churn: number\n contraction: number\n}): number | null {\n return safeDivide(\n input.beginningArr + input.expansion - input.churn - input.contraction,\n input.beginningArr\n )\n}\nnetRevenueRetention.formula = '(Beginning ARR + Expansion - Churn - Contraction) / Beginning ARR'\nnetRevenueRetention.description = 'NRR > 100% means existing customers generate more revenue over time (net expansion).'\n\nexport function grossRevenueRetention(input: {\n beginningArr: number\n churn: number\n contraction: number\n}): number | null {\n return safeDivide(\n input.beginningArr - input.churn - input.contraction,\n input.beginningArr\n )\n}\ngrossRevenueRetention.formula = '(Beginning ARR - Churn - Contraction) / Beginning ARR'\ngrossRevenueRetention.description = 'GRR measures pure retention without expansion. Best case = 100%.'\n\nexport function customerAcquisitionCost(input: {\n salesAndMarketingSpend: number\n newCustomersAcquired: number\n}): number | null {\n return safeDivide(input.salesAndMarketingSpend, input.newCustomersAcquired)\n}\ncustomerAcquisitionCost.formula = 'Sales & Marketing Spend / New Customers Acquired'\ncustomerAcquisitionCost.description = 'Cost to acquire one new customer.'\n\nexport function customerLifetimeValue(input: {\n avgMonthlyRevenuePerCustomer: number\n grossMargin: number\n monthlyChurnRate: number\n}): number | null {\n if (input.monthlyChurnRate <= 0) return null\n return safeDivide(\n input.avgMonthlyRevenuePerCustomer * input.grossMargin,\n input.monthlyChurnRate\n )\n}\ncustomerLifetimeValue.formula = '(Avg Monthly Revenue × Gross Margin) / Monthly Churn Rate'\ncustomerLifetimeValue.description = 'Expected revenue from a customer over their lifetime.'\n\nexport function ltvCacRatio(input: {\n ltv: number\n cac: number\n}): number | null {\n return safeDivide(input.ltv, input.cac)\n}\nltvCacRatio.formula = 'LTV / CAC'\nltvCacRatio.description = 'LTV:CAC > 3 is healthy. < 1 means you lose money on every customer.'\n\nexport function cacPaybackPeriod(input: {\n cac: number\n avgMonthlyRevenuePerCustomer: number\n grossMarginPct: number\n}): number | null {\n const monthlyMargin = input.avgMonthlyRevenuePerCustomer * input.grossMarginPct\n return safeDivide(input.cac, monthlyMargin)\n}\ncacPaybackPeriod.formula = 'CAC / (Avg Monthly Revenue × Gross Margin %)'\ncacPaybackPeriod.description = 'Months to recoup customer acquisition cost. < 12 months is excellent.'\n\nexport function burnMultiple(input: {\n netBurnRate: number\n netNewArr: number\n}): number | null {\n return safeDivide(input.netBurnRate, input.netNewArr)\n}\nburnMultiple.formula = 'Net Burn Rate / Net New ARR'\nburnMultiple.description = 'Cash spent to acquire $1 of new ARR. < 1 is excellent, > 2 is concerning.'\n\nexport function saasQuickRatio(input: {\n newMrr: number\n expansionMrr: number\n churnedMrr: number\n contractionMrr: number\n}): number | null {\n const gained = input.newMrr + input.expansionMrr\n const lost = input.churnedMrr + input.contractionMrr\n return safeDivide(gained, lost)\n}\nsaasQuickRatio.formula = '(New MRR + Expansion MRR) / (Churned MRR + Contraction MRR)'\nsaasQuickRatio.description = 'Growth efficiency. > 4 is excellent, < 1 means shrinking.'\n\nexport function arrPerFte(input: {\n arr: number\n fullTimeEmployees: number\n}): number | null {\n return safeDivide(input.arr, input.fullTimeEmployees)\n}\narrPerFte.formula = 'ARR / Full-Time Employees'\narrPerFte.description = 'Productivity benchmark. > $200k/FTE is world-class.'\n","import { safeDivide } from '../../../utils/safe-divide.js'\n\nexport function ffo(input: {\n netIncome: number\n depreciation: number\n gainsOnSaleOfProperties: number\n}): number {\n return input.netIncome + input.depreciation - input.gainsOnSaleOfProperties\n}\nffo.formula = 'Net Income + Depreciation & Amortization - Gains on Sale of Properties'\nffo.description = 'Funds From Operations — the primary REIT earnings metric, strips out real estate depreciation.'\n\nexport function affo(input: {\n ffo: number\n recurringCapex: number\n straightLineRentAdjustment: number\n}): number {\n return input.ffo - input.recurringCapex + input.straightLineRentAdjustment\n}\naffo.formula = 'FFO - Recurring Capex + Straight-Line Rent Adjustment'\naffo.description = 'Adjusted FFO — closer to actual distributable cash flow.'\n\nexport function pFfo(input: {\n marketCap: number\n ffo: number\n}): number | null {\n return safeDivide(input.marketCap, input.ffo)\n}\npFfo.formula = 'Market Cap / FFO'\npFfo.description = 'Price-to-FFO — the REIT equivalent of P/E.'\n\nexport function pAffo(input: {\n marketCap: number\n affo: number\n}): number | null {\n return safeDivide(input.marketCap, input.affo)\n}\npAffo.formula = 'Market Cap / AFFO'\npAffo.description = 'Price-to-AFFO. More conservative and widely used by REIT analysts.'\n\nexport function netOperatingIncome(input: {\n revenue: number\n operatingExpenses: number\n}): number {\n return input.revenue - input.operatingExpenses\n}\nnetOperatingIncome.formula = 'Revenue - Operating Expenses (excluding D&A and interest)'\nnetOperatingIncome.description = 'NOI — the core profitability metric for real estate properties.'\n\nexport function capRate(input: {\n noi: number\n propertyValue: number\n}): number | null {\n return safeDivide(input.noi, input.propertyValue)\n}\ncapRate.formula = 'Net Operating Income / Property Value'\ncapRate.description = 'Expected annual return on a property. Higher cap rate = higher yield, often higher risk.'\n\nexport function occupancyRate(input: {\n occupiedUnits: number\n totalUnits: number\n}): number | null {\n return safeDivide(input.occupiedUnits, input.totalUnits)\n}\noccupancyRate.formula = 'Occupied Units / Total Units'\noccupancyRate.description = 'Key operational metric. > 95% is generally considered strong.'\n","import { safeDivide } from '../../../utils/safe-divide.js'\n\nexport function netInterestMargin(input: {\n interestIncome: number\n interestExpense: number\n avgEarningAssets: number\n}): number | null {\n return safeDivide(input.interestIncome - input.interestExpense, input.avgEarningAssets)\n}\nnetInterestMargin.formula = '(Interest Income - Interest Expense) / Average Earning Assets'\nnetInterestMargin.description = 'NIM — core profitability of a bank\\'s lending activity.'\n\nexport function efficiencyRatio(input: {\n nonInterestExpense: number\n netInterestIncome: number\n nonInterestIncome: number\n}): number | null {\n return safeDivide(input.nonInterestExpense, input.netInterestIncome + input.nonInterestIncome)\n}\nefficiencyRatio.formula = 'Non-Interest Expense / (Net Interest Income + Non-Interest Income)'\nefficiencyRatio.description = 'Cost to generate $1 of revenue. Lower is better. < 60% is well-run.'\n\nexport function loanToDepositRatio(input: {\n totalLoans: number\n totalDeposits: number\n}): number | null {\n return safeDivide(input.totalLoans, input.totalDeposits)\n}\nloanToDepositRatio.formula = 'Total Loans / Total Deposits'\nloanToDepositRatio.description = 'Liquidity indicator. > 100% means more loans than deposits (reliant on borrowing).'\n\nexport function nplRatio(input: {\n nonPerformingLoans: number\n totalLoans: number\n}): number | null {\n return safeDivide(input.nonPerformingLoans, input.totalLoans)\n}\nnplRatio.formula = 'Non-Performing Loans / Total Loans'\nnplRatio.description = 'Asset quality metric. > 2-3% warrants scrutiny.'\n\nexport function provisionCoverageRatio(input: {\n loanLossReserves: number\n nonPerformingLoans: number\n}): number | null {\n return safeDivide(input.loanLossReserves, input.nonPerformingLoans)\n}\nprovisionCoverageRatio.formula = 'Loan Loss Reserves / Non-Performing Loans'\nprovisionCoverageRatio.description = 'How much of bad loans are reserved for. > 100% is conservative.'\n\nexport function tier1CapitalRatio(input: {\n tier1Capital: number\n riskWeightedAssets: number\n}): number | null {\n return safeDivide(input.tier1Capital, input.riskWeightedAssets)\n}\ntier1CapitalRatio.formula = 'Tier 1 Capital / Risk-Weighted Assets'\ntier1CapitalRatio.description = 'Core capital adequacy. Regulatory minimum is 6%, well-capitalized is > 8%.'\n\nexport function cet1Ratio(input: {\n commonEquityTier1: number\n riskWeightedAssets: number\n}): number | null {\n return safeDivide(input.commonEquityTier1, input.riskWeightedAssets)\n}\ncet1Ratio.formula = 'Common Equity Tier 1 / Risk-Weighted Assets'\ncet1Ratio.description = 'Highest-quality capital ratio. Regulatory minimum is 4.5%.'\n\nexport function tangibleBookValuePerShare(input: {\n totalEquity: number\n goodwill: number\n intangibleAssets: number\n sharesOutstanding: number\n}): number | null {\n const tbv = input.totalEquity - input.goodwill - input.intangibleAssets\n return safeDivide(tbv, input.sharesOutstanding)\n}\ntangibleBookValuePerShare.formula = '(Equity - Goodwill - Intangibles) / Shares Outstanding'\ntangibleBookValuePerShare.description = 'TBVPS — the most conservative per-share book value for banks.'\n","import { safeDivide } from '../../../utils/safe-divide.js'\n\nexport function lossRatio(input: {\n lossesIncurred: number\n premiumsEarned: number\n}): number | null {\n return safeDivide(input.lossesIncurred, input.premiumsEarned)\n}\nlossRatio.formula = 'Losses Incurred / Premiums Earned'\nlossRatio.description = 'Portion of premiums paid out as claims. < 60% is generally good for P&C.'\n\nexport function expenseRatio(input: {\n underwritingExpenses: number\n premiumsWritten: number\n}): number | null {\n return safeDivide(input.underwritingExpenses, input.premiumsWritten)\n}\nexpenseRatio.formula = 'Underwriting Expenses / Net Premiums Written'\nexpenseRatio.description = 'Cost of writing insurance. Lower is more efficient.'\n\nexport function combinedRatio(input: {\n lossRatio: number\n expenseRatio: number\n}): number {\n return input.lossRatio + input.expenseRatio\n}\ncombinedRatio.formula = 'Loss Ratio + Expense Ratio'\ncombinedRatio.description = 'The key insurance profitability metric. < 100% = underwriting profit. > 100% = loss.'\n\nexport function underwritingProfitMargin(input: {\n combinedRatio: number\n}): number {\n return 1 - input.combinedRatio\n}\nunderwritingProfitMargin.formula = '1 - Combined Ratio'\nunderwritingProfitMargin.description = 'Positive = underwriting profit. Most insurers also earn investment income.'\n\nexport function premiumsToSurplus(input: {\n netPremiumsWritten: number\n policyholderSurplus: number\n}): number | null {\n return safeDivide(input.netPremiumsWritten, input.policyholderSurplus)\n}\npremiumsToSurplus.formula = 'Net Premiums Written / Policyholder Surplus'\npremiumsToSurplus.description = 'Leverage ratio for insurers. > 3x is considered risky.'\n","/**\n * Batch compute all applicable ratios from a single financial data object.\n *\n * Usage:\n * import { computeAll } from 'fin-ratios'\n *\n * const data = await fetchYahoo('AAPL')\n * const ratios = computeAll(data)\n * console.log(ratios.pe) // 28.3\n * console.log(ratios.roic) // 0.55\n * console.log(ratios.altmanZ) // { zScore: 4.8, zone: 'safe', ... }\n */\n\nimport { safeDivide } from './safe-divide.js'\n\n// Import all ratio functions\nimport {\n pe, pb, ps, peg, pFcf, evEbitda, evEbit, evRevenue, evFcf, tobinsQ, grahamNumber,\n} from '../ratios/valuation/index.js'\nimport {\n grossMargin, operatingMargin, ebitdaMargin, netProfitMargin,\n roe, roa, nopat, roic, roce, investedCapital,\n} from '../ratios/profitability/index.js'\nimport {\n currentRatio, quickRatio, dso, dio, dpo, cashConversionCycle,\n} from '../ratios/liquidity/index.js'\nimport {\n debtToEquity, netDebtToEquity, netDebtToEbitda,\n debtToAssets, interestCoverageRatio, equityMultiplier,\n} from '../ratios/solvency/index.js'\nimport {\n assetTurnover, receivablesTurnover, inventoryTurnover, payablesTurnover,\n} from '../ratios/efficiency/index.js'\nimport {\n freeCashFlow, fcfYield, fcfMargin, fcfConversion, ocfToSales, capexToRevenue,\n} from '../ratios/cashflow/index.js'\nimport {\n altmanZScore, piotroskiFScore,\n} from '../ratios/composite/index.js'\n\n// ── Input type ────────────────────────────────────────────────────────────────\n\nexport interface FinancialData {\n // Income Statement\n revenue?: number\n grossProfit?: number\n ebit?: number\n ebitda?: number\n netIncome?: number\n interestExpense?: number\n incomeTaxExpense?: number\n ebt?: number\n cogs?: number\n // Balance Sheet\n totalAssets?: number\n totalEquity?: number\n totalDebt?: number\n currentAssets?: number\n currentLiabilities?: number\n cash?: number\n accountsReceivable?: number\n inventory?: number\n retainedEarnings?: number\n totalLiabilities?: number\n accountsPayable?: number\n longTermDebt?: number\n sharesOutstanding?: number\n // Cash Flow\n operatingCashFlow?: number\n capex?: number\n // Market\n marketCap?: number\n enterpriseValue?: number\n epsGrowthPct?: number\n // Prior period (for Piotroski)\n prior?: Omit<FinancialData, 'prior' | 'marketCap' | 'enterpriseValue' | 'epsGrowthPct'>\n}\n\n// ── Output type ───────────────────────────────────────────────────────────────\n\nexport interface RatioResults {\n // Valuation\n pe?: number | null\n pb?: number | null\n ps?: number | null\n peg?: number | null\n pFcf?: number | null\n enterpriseValue?: number | null\n evEbitda?: number | null\n evEbit?: number | null\n evRevenue?: number | null\n evFcf?: number | null\n tobinsQ?: number | null\n grahamNumber?: number | null\n // Profitability\n grossMargin?: number | null\n operatingMargin?: number | null\n netMargin?: number | null\n ebitdaMargin?: number | null\n roe?: number | null\n roa?: number | null\n roic?: number | null\n roce?: number | null\n nopat?: number | null\n investedCapital?: number | null\n // Cash Flow\n freeCashFlow?: number | null\n fcfMargin?: number | null\n fcfConversion?: number | null\n ocfToSales?: number | null\n capexToRevenue?: number | null\n fcfYield?: number | null\n // Liquidity\n currentRatio?: number | null\n quickRatio?: number | null\n dso?: number | null\n dio?: number | null\n dpo?: number | null\n cashConversionCycle?: number | null\n // Solvency\n debtToEquity?: number | null\n netDebtToEquity?: number | null\n netDebtToEbitda?: number | null\n debtToAssets?: number | null\n interestCoverage?: number | null\n equityMultiplier?: number | null\n // Efficiency\n assetTurnover?: number | null\n receivablesTurnover?: number | null\n inventoryTurnover?: number | null\n payablesTurnover?: number | null\n // Composite\n altmanZ?: ReturnType<typeof altmanZScore>\n piotroski?: ReturnType<typeof piotroskiFScore> | null\n}\n\n// ── Helper ────────────────────────────────────────────────────────────────────\n\nfunction g(data: FinancialData, key: keyof FinancialData): number {\n const v = data[key]\n if (v === undefined || v === null || typeof v === 'object') return 0\n return (v as number) || 0\n}\n\nfunction gn(data: FinancialData, key: keyof FinancialData): number | undefined {\n const v = data[key]\n if (v === undefined || v === null || typeof v === 'object') return undefined\n return (v as number) || undefined\n}\n\n// ── Main function ─────────────────────────────────────────────────────────────\n\n/**\n * Compute all applicable financial ratios from a data object.\n *\n * Returns a flat object with 40+ ratio values. Complex scores (Altman, Piotroski)\n * are nested objects. Returns undefined for unavailable ratios.\n *\n * @param data Financial data object with income/balance/cashflow/market fields\n * @returns Flat object of ratio name → value\n *\n * @example\n * const data = await fetchYahoo('AAPL')\n * const r = computeAll(data)\n * console.log(r.grossMargin) // 0.433\n * console.log(r.roic) // 0.55\n * console.log(r.altmanZ?.zone) // 'safe'\n */\nexport function computeAll(data: FinancialData): RatioResults {\n const result: RatioResults = {}\n\n const revenue = g(data, 'revenue')\n const grossProfit = g(data, 'grossProfit')\n const ebit = g(data, 'ebit')\n const ebitda = g(data, 'ebitda')\n const netIncome = g(data, 'netIncome')\n const totalAssets = g(data, 'totalAssets')\n const totalEquity = g(data, 'totalEquity')\n const totalDebt = g(data, 'totalDebt')\n const currentAssets = g(data, 'currentAssets')\n const currentLiabilities = g(data, 'currentLiabilities')\n const cash = g(data, 'cash')\n const accountsReceivable = g(data, 'accountsReceivable')\n const inventory = g(data, 'inventory')\n const marketCap = g(data, 'marketCap')\n const operatingCashFlow = g(data, 'operatingCashFlow')\n const capexRaw = g(data, 'capex')\n const interestExpense = g(data, 'interestExpense')\n const incomeTaxExpense = g(data, 'incomeTaxExpense')\n const ebt = g(data, 'ebt')\n const cogs = g(data, 'cogs')\n const accountsPayable = g(data, 'accountsPayable')\n const retainedEarnings = g(data, 'retainedEarnings')\n const totalLiabilities = g(data, 'totalLiabilities')\n const sharesOutstanding = g(data, 'sharesOutstanding')\n\n const fcf = freeCashFlow({ operatingCashFlow, capex: capexRaw })\n const ev = data.enterpriseValue || (marketCap + totalDebt - cash) || undefined\n\n const taxRate = ebt ? Math.min(Math.max(safeDivide(incomeTaxExpense, ebt) ?? 0.21, 0), 0.5) : 0.21\n const nopatVal = nopat({ ebit, taxRate })\n const icVal = investedCapital({ totalEquity, totalDebt, cash })\n\n // ── Valuation ───────────────────────────────────────────────────────────────\n result.pe = pe({ marketCap, netIncome })\n result.pb = pb({ marketCap, totalEquity })\n result.ps = ps({ marketCap, revenue })\n if (result.pe && data.epsGrowthPct) {\n result.peg = peg({ peRatio: result.pe, epsGrowthRatePercent: data.epsGrowthPct })\n }\n if (operatingCashFlow) result.pFcf = pFcf({ marketCap, operatingCashFlow, capex: capexRaw })\n result.enterpriseValue = ev ?? null\n if (ev && ebitda) result.evEbitda = evEbitda({ enterpriseValue: ev, ebitda })\n if (ev && ebit) result.evEbit = evEbit({ enterpriseValue: ev, ebit })\n if (ev && revenue) result.evRevenue = evRevenue({ enterpriseValue: ev, revenue })\n if (ev && fcf) result.evFcf = evFcf({ enterpriseValue: ev, freeCashFlow: fcf })\n result.tobinsQ = tobinsQ({ marketCap, totalDebt, totalAssets })\n if (sharesOutstanding) {\n const eps = safeDivide(netIncome, sharesOutstanding)\n const bvps = safeDivide(totalEquity, sharesOutstanding)\n if (eps && bvps) result.grahamNumber = grahamNumber({ eps, bookValuePerShare: bvps })\n }\n\n // ── Profitability ────────────────────────────────────────────────────────────\n result.grossMargin = grossMargin({ grossProfit, revenue })\n result.operatingMargin = operatingMargin({ ebit, revenue })\n result.netMargin = netProfitMargin({ netIncome, revenue })\n if (ebitda) result.ebitdaMargin = ebitdaMargin({ ebitda, revenue })\n result.roe = roe({ netIncome, avgTotalEquity: totalEquity })\n result.roa = roa({ netIncome, avgTotalAssets: totalAssets })\n result.nopat = nopatVal\n result.investedCapital = icVal\n if (nopatVal && icVal) result.roic = roic({ nopat: nopatVal, investedCapital: icVal })\n result.roce = roce({ ebit, totalAssets, currentLiabilities })\n\n // ── Cash Flow ────────────────────────────────────────────────────────────────\n result.freeCashFlow = fcf ?? null\n if (fcf) {\n result.fcfMargin = fcfMargin({ freeCashFlow: fcf, revenue })\n result.fcfConversion = fcfConversion({ freeCashFlow: fcf, netIncome })\n if (marketCap) result.fcfYield = fcfYield({ freeCashFlow: fcf, marketCap })\n }\n\n result.ocfToSales = ocfToSales({ operatingCashFlow, revenue })\n result.capexToRevenue = capexToRevenue({ capex: capexRaw, revenue })\n\n // ── Liquidity ────────────────────────────────────────────────────────────────\n result.currentRatio = currentRatio({ currentAssets, currentLiabilities })\n result.quickRatio = quickRatio({ cash, shortTermInvestments: 0, accountsReceivable, currentLiabilities })\n result.dso = dso({ accountsReceivable, revenue })\n if (cogs) {\n result.dio = dio({ inventory, cogs })\n result.dpo = dpo({ accountsPayable, cogs })\n }\n if (result.dso != null) {\n result.cashConversionCycle = cashConversionCycle({\n dso: result.dso,\n dio: result.dio ?? 0,\n dpo: result.dpo ?? 0,\n })\n }\n\n // ── Solvency ─────────────────────────────────────────────────────────────────\n result.debtToEquity = debtToEquity({ totalDebt, totalEquity })\n result.netDebtToEquity = netDebtToEquity({ totalDebt, cash, totalEquity })\n if (ebitda) result.netDebtToEbitda = netDebtToEbitda({ totalDebt, cash, ebitda })\n result.debtToAssets = debtToAssets({ totalDebt, totalAssets })\n result.interestCoverage = interestCoverageRatio({ ebit, interestExpense })\n result.equityMultiplier = equityMultiplier({ totalAssets, totalEquity })\n\n // ── Efficiency ───────────────────────────────────────────────────────────────\n result.assetTurnover = assetTurnover({ revenue, avgTotalAssets: totalAssets })\n result.receivablesTurnover = receivablesTurnover({ revenue, avgAccountsReceivable: accountsReceivable })\n if (cogs) {\n result.inventoryTurnover = inventoryTurnover({ cogs, avgInventory: inventory })\n result.payablesTurnover = payablesTurnover({ cogs, avgAccountsPayable: accountsPayable })\n }\n\n // ── Composite ────────────────────────────────────────────────────────────────\n if (totalAssets && totalLiabilities) {\n result.altmanZ = altmanZScore({\n workingCapital: currentAssets - currentLiabilities,\n retainedEarnings,\n ebit,\n marketCap,\n totalLiabilities,\n totalAssets,\n revenue,\n })\n }\n\n if (data.prior) {\n const p = data.prior\n const pGet = (key: keyof typeof p): number => {\n const v = p[key]\n return (typeof v === 'number' ? v : 0) || 0\n }\n try {\n result.piotroski = piotroskiFScore({\n current: {\n netIncome,\n totalAssets,\n operatingCashFlow,\n longTermDebt: g(data, 'longTermDebt'),\n currentAssets,\n currentLiabilities,\n sharesOutstanding,\n grossProfit,\n revenue,\n },\n prior: {\n netIncome: pGet('netIncome'),\n totalAssets: pGet('totalAssets'),\n longTermDebt: pGet('longTermDebt'),\n currentAssets: pGet('currentAssets'),\n currentLiabilities: pGet('currentLiabilities'),\n sharesOutstanding: pGet('sharesOutstanding'),\n grossProfit: pGet('grossProfit'),\n revenue: pGet('revenue'),\n },\n })\n } catch {\n result.piotroski = null\n }\n }\n\n return result\n}\n","/**\n * Scenario-based DCF valuation (bull / base / bear).\n *\n * Usage:\n * import { scenarioDcf } from 'fin-ratios'\n *\n * const result = scenarioDcf({\n * baseFcf: 100e9,\n * sharesOutstanding: 15.7e9,\n * currentPrice: 185,\n * scenarios: {\n * bear: { growthRate: 0.04, wacc: 0.12, terminalGrowth: 0.02, years: 10 },\n * base: { growthRate: 0.08, wacc: 0.09, terminalGrowth: 0.03, years: 10 },\n * bull: { growthRate: 0.14, wacc: 0.08, terminalGrowth: 0.04, years: 10 },\n * },\n * })\n *\n * console.log(result.base.intrinsicValuePerShare) // 198.75\n * console.log(result.base.upsidePct) // 0.074 (+7.4%)\n */\n\nimport { safeDivide } from './safe-divide.js'\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport interface ScenarioParams {\n /** Annual FCF growth rate during projection period (e.g. 0.08 = 8%) */\n growthRate?: number\n /** Weighted average cost of capital / discount rate (e.g. 0.09 = 9%) */\n wacc?: number\n /** Terminal/perpetual growth rate after projection period (e.g. 0.02 = 2%) */\n terminalGrowth?: number\n /** Number of projection years (default: 10) */\n years?: number\n}\n\nexport interface ScenarioResult {\n /** Total equity intrinsic value */\n intrinsicValue: number\n /** Intrinsic value per diluted share */\n intrinsicValuePerShare: number | null\n /** PV of projected FCFs */\n pvFcfs: number\n /** PV of terminal value */\n pvTerminal: number\n /** Terminal value (undiscounted) */\n terminalValue: number\n /** Upside/downside vs current price (e.g. 0.07 = +7%) */\n upsidePct: number | null\n /** Input parameters used */\n params: Required<ScenarioParams>\n}\n\nexport interface ScenarioDcfInput {\n /** Most recent trailing FCF (absolute dollars, not per-share) */\n baseFcf: number\n /** Total diluted shares outstanding */\n sharesOutstanding: number\n /** Per-scenario parameters */\n scenarios?: Record<string, ScenarioParams>\n /** Optional ticker for display */\n ticker?: string\n /** Optional current market price per share for upside calculation */\n currentPrice?: number\n}\n\nexport type ScenarioDcfResult = Record<string, ScenarioResult>\n\nconst DEFAULT_SCENARIOS: Record<string, ScenarioParams> = {\n bear: { growthRate: 0.03, wacc: 0.12, terminalGrowth: 0.02, years: 10 },\n base: { growthRate: 0.07, wacc: 0.09, terminalGrowth: 0.02, years: 10 },\n bull: { growthRate: 0.12, wacc: 0.08, terminalGrowth: 0.03, years: 10 },\n}\n\n// ── Main function ──────────────────────────────────────────────────────────────\n\n/**\n * Compute scenario-based DCF intrinsic value (bull / base / bear).\n *\n * Each scenario projects FCFs for N years, then applies a Gordon Growth Model\n * terminal value. Results are discounted back to present value at the scenario WACC.\n *\n * @param input FCF, shares, optional current price, and per-scenario parameters\n * @returns Map of scenario name → ScenarioResult\n *\n * @example\n * const r = scenarioDcf({ baseFcf: 100e9, sharesOutstanding: 15.7e9 })\n * r.base.intrinsicValuePerShare // computed base case IV per share\n */\nexport function scenarioDcf(input: ScenarioDcfInput): ScenarioDcfResult {\n const {\n baseFcf,\n sharesOutstanding,\n currentPrice,\n scenarios = DEFAULT_SCENARIOS,\n } = input\n\n const result: ScenarioDcfResult = {}\n\n for (const [name, params] of Object.entries(scenarios)) {\n const growthRate = params.growthRate ?? 0.07\n const wacc = params.wacc ?? 0.09\n const terminalGrowth = params.terminalGrowth ?? 0.02\n const years = params.years ?? 10\n\n // Project FCFs and discount to PV\n let fcf = baseFcf\n let pvSum = 0\n for (let t = 1; t <= years; t++) {\n fcf = fcf * (1 + growthRate)\n pvSum += fcf / Math.pow(1 + wacc, t)\n }\n\n // Terminal value (Gordon Growth)\n let terminalValue = 0\n if (wacc > terminalGrowth) {\n const terminalFcf = fcf * (1 + terminalGrowth)\n terminalValue = terminalFcf / (wacc - terminalGrowth)\n }\n const pvTerminal = terminalValue / Math.pow(1 + wacc, years)\n\n const intrinsicValue = pvSum + pvTerminal\n const intrinsicValuePerShare = safeDivide(intrinsicValue, sharesOutstanding) ?? null\n\n let upsidePct: number | null = null\n if (currentPrice && currentPrice > 0 && intrinsicValuePerShare !== null) {\n upsidePct = (intrinsicValuePerShare - currentPrice) / currentPrice\n }\n\n result[name] = {\n intrinsicValue,\n intrinsicValuePerShare,\n pvFcfs: pvSum,\n pvTerminal,\n terminalValue,\n upsidePct,\n params: { growthRate, wacc, terminalGrowth, years },\n }\n }\n\n return result\n}\n","/**\n * In-memory caching layer for fin-ratios fetchers.\n *\n * Prevents redundant network calls and respects API rate limits.\n *\n * Usage:\n * import { setCache, cached, clearCache } from 'fin-ratios/utils/cache'\n *\n * setCache({ ttlMs: 60 * 60 * 1000 }) // 1 hour TTL\n *\n * const fetchCached = cached('yahoo', fetchYahoo)\n * const data = await fetchCached('AAPL') // first call: network\n * const data2 = await fetchCached('AAPL') // instant from cache\n */\n\nexport interface CacheOptions {\n /** Time-to-live in milliseconds (default: 24 hours) */\n ttlMs?: number\n /** Maximum number of entries before eviction (default: 500) */\n maxSize?: number\n}\n\ninterface CacheEntry<T> {\n expiry: number\n value: T\n}\n\nlet _ttlMs = 24 * 60 * 60 * 1000\nlet _maxSize = 500\nconst _store = new Map<string, CacheEntry<unknown>>()\n\n/**\n * Configure the global cache settings.\n *\n * @example\n * setCache({ ttlMs: 60 * 60 * 1000 }) // 1 hour\n * setCache({ ttlMs: 0 }) // disable (TTL = 0 means no caching)\n */\nexport function setCache(options: CacheOptions): void {\n if (options.ttlMs !== undefined) _ttlMs = options.ttlMs\n if (options.maxSize !== undefined) _maxSize = options.maxSize\n}\n\n/**\n * Wrap an async fetcher function with transparent caching.\n *\n * The cache key is derived from the namespace + all arguments (JSON-serialized).\n *\n * @param namespace A unique prefix for this fetcher (e.g. 'yahoo', 'edgar')\n * @param fn The async function to wrap\n * @returns The wrapped function with identical signature\n *\n * @example\n * const fetchYahooCached = cached('yahoo', fetchYahoo)\n * const data = await fetchYahooCached('AAPL')\n */\nexport function cached<TArgs extends unknown[], TReturn>(\n namespace: string,\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn> {\n return async (...args: TArgs): Promise<TReturn> => {\n if (_ttlMs === 0) return fn(...args)\n\n const key = _makeKey(namespace, args)\n const entry = _store.get(key) as CacheEntry<TReturn> | undefined\n\n if (entry && entry.expiry > Date.now()) {\n return entry.value\n }\n\n const value = await fn(...args)\n _evict()\n _store.set(key, { expiry: Date.now() + _ttlMs, value })\n return value\n }\n}\n\n/** Remove all cached entries. */\nexport function clearCache(): void {\n _store.clear()\n}\n\n/**\n * Remove cached entries for a specific ticker (case-insensitive).\n * Returns the number of entries removed.\n */\nexport function invalidate(ticker: string): number {\n const lower = ticker.toLowerCase()\n let removed = 0\n for (const [key] of _store) {\n if (key.includes(lower)) {\n _store.delete(key)\n removed++\n }\n }\n return removed\n}\n\n/** Return cache statistics. */\nexport function cacheStats(): { total: number; valid: number; ttlMs: number; maxSize: number } {\n const now = Date.now()\n let valid = 0\n for (const entry of _store.values()) {\n if ((entry as CacheEntry<unknown>).expiry > now) valid++\n }\n return { total: _store.size, valid, ttlMs: _ttlMs, maxSize: _maxSize }\n}\n\n// ── internals ──────────────────────────────────────────────────────────────────\n\nfunction _makeKey(namespace: string, args: unknown[]): string {\n return `${namespace}:${JSON.stringify(args)}`\n}\n\nfunction _evict(): void {\n if (_store.size < _maxSize) return\n const now = Date.now()\n // First evict expired entries\n for (const [key, entry] of _store) {\n if ((entry as CacheEntry<unknown>).expiry <= now) {\n _store.delete(key)\n }\n }\n // If still over limit, evict oldest entries\n if (_store.size >= _maxSize) {\n const oldest = Array.from(_store.keys()).slice(0, Math.floor(_maxSize * 0.2))\n for (const key of oldest) _store.delete(key)\n }\n}\n","/**\n * Quantitative Economic Moat Score.\n *\n * Scores a company's competitive moat from 0–100 using five financial signals\n * derived entirely from multi-year financial statements — no analyst opinions,\n * no qualitative inputs, fully reproducible.\n *\n * Signals\n * -------\n * 1. ROIC Persistence — fraction of years ROIC > WACC, penalised for volatility\n * 2. Pricing Power — gross margin level × stability\n * 3. Reinvestment Quality — incremental return on invested capital (ΔEBIT / net reinvestment)\n * 4. Operating Leverage — degree of operating leverage (fixed-cost structure proxy)\n * 5. CAP Estimate — statistical projection of competitive advantage period\n *\n * Weights: 30 / 25 / 20 / 15 / 10\n *\n * References\n * ----------\n * Mauboussin & Johnson (1997) — Competitive Advantage Period, CSFB\n * Greenwald & Kahn (2001) — Competition Demystified, Portfolio/Penguin\n * Koller, Goedhart & Wessels (2020) — Valuation (7th ed.), McKinsey & Company\n */\n\nimport { safeDivide } from './safe-divide.js'\n\n// ── Input / Output types ───────────────────────────────────────────────────────\n\n/** One year of financial data for moat analysis. */\nexport interface AnnualFinancialData {\n // Income statement\n revenue?: number\n grossProfit?: number\n ebit?: number\n netIncome?: number\n ebt?: number\n interestExpense?: number\n incomeTaxExpense?: number\n // Balance sheet\n totalAssets?: number\n totalEquity?: number\n totalDebt?: number\n cash?: number\n currentAssets?: number\n currentLiabilities?: number\n // Cash flow\n capex?: number\n depreciation?: number\n // Optional\n year?: number | string\n}\n\nexport interface MoatComponents {\n roicPersistence: number // 0–1\n pricingPower: number // 0–1\n reinvestmentQuality: number // 0–1\n operatingLeverage: number // 0–1\n capScore: number // 0–1 (normalised CAP)\n}\n\nexport interface MoatScoreResult {\n score: number // 0–100\n width: 'wide' | 'narrow' | 'none'\n components: MoatComponents\n capEstimateYears: number // projected years of above-normal returns\n waccUsed: number // WACC estimate applied\n yearsAnalyzed: number\n evidence: string[]\n interpretation: string\n}\n\nexport interface MoatScoreOptions {\n /** Override the WACC used in analysis (e.g. 0.09 for 9%). */\n wacc?: number\n}\n\n// ── Statistical helpers ────────────────────────────────────────────────────────\n\nfunction mean(xs: number[]): number {\n return xs.length ? xs.reduce((a, b) => a + b, 0) / xs.length : 0\n}\n\nfunction std(xs: number[]): number {\n if (xs.length < 2) return 0\n const m = mean(xs)\n return Math.sqrt(xs.reduce((s, x) => s + (x - m) ** 2, 0) / (xs.length - 1))\n}\n\nfunction cv(xs: number[]): number {\n const m = mean(xs)\n return Math.abs(m) > 1e-9 ? std(xs) / Math.abs(m) : 1\n}\n\nfunction olsSlope(ys: number[]): number {\n const n = ys.length\n if (n < 2) return 0\n const xm = (n - 1) / 2\n const ym = mean(ys)\n const ssXX = Array.from({ length: n }, (_, i) => (i - xm) ** 2).reduce((a, b) => a + b, 0)\n const ssXY = Array.from({ length: n }, (_, i) => (i - xm) * ((ys[i] ?? 0) - ym)).reduce((a, b) => a + b, 0)\n return ssXX ? ssXY / ssXX : 0\n}\n\n// ── Per-year ROIC ──────────────────────────────────────────────────────────────\n\nfunction g(d: AnnualFinancialData, key: keyof AnnualFinancialData): number {\n const v = d[key]\n return (typeof v === 'number' && !isNaN(v)) ? v : 0\n}\n\nfunction yearRoic(d: AnnualFinancialData): number | null {\n const ebit = g(d, 'ebit')\n const equity = g(d, 'totalEquity')\n const debt = g(d, 'totalDebt')\n const cash = g(d, 'cash')\n const ic = equity + debt - cash\n if (ic <= 0 || ebit <= 0) return null\n\n const ebt = g(d, 'ebt') || (ebit - g(d, 'interestExpense'))\n const tax = g(d, 'incomeTaxExpense')\n const taxRate = ebt > 0 && tax > 0 ? Math.min(Math.max(tax / ebt, 0), 0.5) : 0.21\n return (ebit * (1 - taxRate)) / ic\n}\n\n// ── WACC estimation ────────────────────────────────────────────────────────────\n\nfunction estimateWacc(series: AnnualFinancialData[], override?: number): number {\n if (override !== undefined) return override\n const d = series[series.length - 1]!\n const equity = g(d, 'totalEquity')\n const debt = g(d, 'totalDebt')\n const totalCap = equity + debt\n if (totalCap <= 0) return 0.09\n\n const we = equity / totalCap\n const wd = debt / totalCap\n\n const costEquity = 0.045 + 1.0 * 0.055 // CAPM: rf=4.5%, beta=1, ERP=5.5% → 10%\n\n const interest = g(d, 'interestExpense')\n const preCostDebt = debt > 0 && interest > 0 ? Math.min(interest / debt, 0.15) : 0.05\n const ebt = g(d, 'ebt') || (g(d, 'ebit') - interest)\n const tax = g(d, 'incomeTaxExpense')\n const taxRate = ebt > 0 && tax > 0 ? Math.min(Math.max(tax / ebt, 0), 0.4) : 0.21\n const costDebt = preCostDebt * (1 - taxRate)\n\n return Math.max(Math.min(we * costEquity + wd * costDebt, 0.20), 0.06)\n}\n\n// ── Five signal scorers ────────────────────────────────────────────────────────\n\nfunction scoreRoicPersistence(\n roicSeries: number[], wacc: number,\n): [number, string[]] {\n if (!roicSeries.length) return [0, ['Insufficient ROIC data']]\n\n const above = roicSeries.filter(r => r > wacc).length\n const pctAbove = above / roicSeries.length\n const roicCv = cv(roicSeries)\n const meanRoic = mean(roicSeries)\n const spread = meanRoic - wacc\n\n const stability = Math.max(0, 1 - roicCv * 0.4)\n const score = Math.min(Math.max(pctAbove * stability, 0), 1)\n\n return [score, [\n `ROIC exceeded WACC in ${above}/${roicSeries.length} years (${(pctAbove * 100).toFixed(0)}%)`,\n `Mean ROIC ${(meanRoic * 100).toFixed(1)}% vs WACC ${(wacc * 100).toFixed(1)}% (spread ${spread >= 0 ? '+' : ''}${(spread * 100).toFixed(1)}%)`,\n `ROIC volatility (CV): ${roicCv.toFixed(2)} — ${roicCv < 0.15 ? 'highly stable' : roicCv < 0.30 ? 'stable' : 'volatile'}`,\n ]]\n}\n\nfunction scorePricingPower(gmSeries: number[]): [number, string[]] {\n if (!gmSeries.length) return [0.5, ['Gross margin unavailable — pricing power assumed neutral']]\n\n const meanGm = mean(gmSeries)\n const gmCv = cv(gmSeries)\n const slope = olsSlope(gmSeries)\n\n const level = Math.min(Math.max((meanGm - 0.20) / 0.40, 0), 1)\n const stability = Math.max(0, 1 - gmCv * 2.5)\n const trendAdj = Math.max(Math.min(slope * 10, 0.1), -0.1)\n const score = Math.min(Math.max(0.6 * level + 0.4 * stability + trendAdj, 0), 1)\n\n const trendLbl = slope > 0.005 ? 'improving' : slope < -0.005 ? 'declining' : 'stable'\n\n return [score, [\n `Mean gross margin ${(meanGm * 100).toFixed(1)}% over ${gmSeries.length} years`,\n `Gross margin CV ${gmCv.toFixed(3)} — ${gmCv < 0.05 ? 'excellent stability' : gmCv < 0.15 ? 'moderate' : 'high variability'}`,\n `Gross margin trend: ${trendLbl}`,\n ]]\n}\n\nfunction scoreReinvestmentQuality(series: AnnualFinancialData[]): [number, string[]] {\n if (series.length < 2) return [0.5, ['Insufficient data for reinvestment quality — assumed neutral']]\n\n const roiicVals: number[] = []\n let negativeCount = 0\n for (let i = 1; i < series.length; i++) {\n const prev = series[i - 1]!\n const curr = series[i]!\n const deltaEbit = g(curr, 'ebit') - g(prev, 'ebit')\n const netReinvest =\n (g(curr, 'capex') - g(curr, 'depreciation'))\n + (g(curr, 'currentAssets') - g(curr, 'currentLiabilities'))\n - (g(prev, 'currentAssets') - g(prev, 'currentLiabilities'))\n\n if (netReinvest > 1e6) {\n roiicVals.push(Math.max(Math.min(deltaEbit / netReinvest, 5), -1))\n } else {\n negativeCount++\n }\n }\n\n const totalPeriods = series.length - 1\n const capitalLight = !roiicVals.length || (negativeCount / totalPeriods > 0.5)\n\n if (capitalLight) {\n const ebitGrowth: number[] = []\n for (let i = 1; i < series.length; i++) {\n const prevEbit = g(series[i - 1]!, 'ebit')\n if (prevEbit > 0) ebitGrowth.push(g(series[i]!, 'ebit') / prevEbit - 1)\n }\n if (ebitGrowth.length && mean(ebitGrowth) > 0.05) {\n return [0.82, [\n 'Capital-light model: EBIT growing with minimal net reinvestment',\n 'Low reinvestment requirement is a strong moat signal',\n ]]\n }\n return [0.5, ['Reinvestment quality indeterminate (limited reinvestment data)']]\n }\n\n const meanRoiic = mean(roiicVals)\n const score = Math.min(Math.max(0.30 + meanRoiic * 0.70, 0), 1)\n\n return [score, [\n `Mean incremental ROIC (ROIIC): ${(meanRoiic * 100).toFixed(1)}%`,\n `Based on ${roiicVals.length} reinvestment period(s)`,\n meanRoiic > 0.5\n ? 'Excellent capital reinvestment efficiency'\n : meanRoiic > 0.15\n ? 'Adequate reinvestment returns'\n : 'Low incremental returns on reinvestment',\n ]]\n}\n\nfunction scoreOperatingLeverage(series: AnnualFinancialData[]): [number, string[]] {\n if (series.length < 2) return [0.5, ['Insufficient data for operating leverage']]\n\n const dolVals: number[] = []\n for (let i = 1; i < series.length; i++) {\n const prev = series[i - 1]!\n const curr = series[i]!\n if (g(prev, 'revenue') <= 0 || Math.abs(g(prev, 'ebit')) < 1e5) continue\n const pctRev = (g(curr, 'revenue') - g(prev, 'revenue')) / g(prev, 'revenue')\n const pctEbit = (g(curr, 'ebit') - g(prev, 'ebit')) / Math.abs(g(prev, 'ebit'))\n if (Math.abs(pctRev) > 0.005) {\n const dol = pctEbit / pctRev\n if (dol > 0 && dol < 25) dolVals.push(dol)\n }\n }\n\n if (!dolVals.length) return [0.4, ['Operating leverage indeterminate (insufficient revenue variance)']]\n\n const meanDol = mean(dolVals)\n const cvDol = cv(dolVals)\n const level = Math.min(Math.max((meanDol - 1) / 5, 0), 1)\n const consistency = Math.max(0, 1 - cvDol * 0.5)\n const score = Math.min(Math.max(0.65 * level + 0.35 * consistency, 0), 1)\n\n const quality = meanDol > 3\n ? 'High fixed-cost structure — strong scale advantages'\n : meanDol > 1.5\n ? 'Moderate operating leverage'\n : 'Variable cost structure — limited scale advantage'\n\n return [score, [\n `Mean degree of operating leverage (DOL): ${meanDol.toFixed(2)}×`,\n `DOL consistency: ${(consistency * 100).toFixed(0)}%`,\n quality,\n ]]\n}\n\nfunction scoreCap(\n roicSeries: number[], wacc: number,\n): [number, number, string[]] {\n if (!roicSeries.length) return [0.3, 5, ['Insufficient data for CAP estimate']]\n\n const meanRoic = mean(roicSeries)\n const spread = meanRoic - wacc\n\n if (spread <= 0) {\n return [0, 0, [`ROIC ${(meanRoic * 100).toFixed(1)}% ≤ WACC ${(wacc * 100).toFixed(1)}%: no competitive advantage detected`]]\n }\n\n const slope = olsSlope(roicSeries)\n let capYears: number\n let direction: string\n\n if (slope < -0.005) {\n capYears = Math.min(Math.max(spread / Math.abs(slope), 0), 30)\n direction = 'declining'\n } else if (slope > 0.005) {\n capYears = Math.min(spread * 80 + 5, 30)\n direction = 'improving'\n } else {\n const roicCv = cv(roicSeries)\n capYears = Math.min(Math.max(spread * 60 / Math.max(roicCv, 0.1), 3), 25)\n direction = 'stable'\n }\n\n const capScore = Math.min(capYears / 20, 1)\n return [capScore, capYears, [\n `Estimated competitive advantage period: ${capYears.toFixed(1)} years`,\n `ROIC trend: ${direction} (slope ${slope >= 0 ? '+' : ''}${slope.toFixed(3)}/yr)`,\n `ROIC spread above WACC: ${spread >= 0 ? '+' : ''}${(spread * 100).toFixed(1)}%`,\n ]]\n}\n\n// ── Weights ────────────────────────────────────────────────────────────────────\n\nconst W = {\n roicPersistence: 0.30,\n pricingPower: 0.25,\n reinvestmentQuality:0.20,\n operatingLeverage: 0.15,\n cap: 0.10,\n}\n\n// ── Public API ─────────────────────────────────────────────────────────────────\n\n/**\n * Compute a quantitative economic moat score from a sequence of annual data.\n *\n * @param annualData Array of annual financial data objects, ordered chronologically\n * (oldest first). Minimum 2 years; 5–10 recommended.\n * @param options Optional configuration (wacc override)\n *\n * @returns MoatScoreResult with score 0–100, width classification, and evidence\n *\n * @example\n * const result = moatScore([\n * { year: 2020, revenue: 274e9, grossProfit: 105e9, ebit: 66e9,\n * totalEquity: 65e9, totalDebt: 112e9, totalAssets: 323e9, cash: 38e9,\n * capex: 7e9, depreciation: 11e9 },\n * { year: 2021, revenue: 365e9, grossProfit: 153e9, ebit: 109e9,\n * totalEquity: 63e9, totalDebt: 122e9, totalAssets: 351e9, cash: 62e9,\n * capex: 11e9, depreciation: 11e9 },\n * // ... more years\n * ])\n * console.log(result.score) // 82\n * console.log(result.width) // 'wide'\n */\nexport function moatScore(\n annualData: AnnualFinancialData[],\n options: MoatScoreOptions = {},\n): MoatScoreResult {\n if (annualData.length < 2) {\n throw new Error('moatScore requires at least 2 years of data (3–10 recommended).')\n }\n\n const estWacc = estimateWacc(annualData, options.wacc)\n\n const roicSeries: number[] = annualData\n .map(yearRoic)\n .filter((r): r is number => r !== null)\n\n const gmSeries: number[] = annualData\n .filter(d => g(d, 'revenue') > 0)\n .map(d => (safeDivide(g(d, 'grossProfit'), g(d, 'revenue')) ?? 0))\n\n const [sRp, evRp] = scoreRoicPersistence(roicSeries, estWacc)\n const [sPp, evPp] = scorePricingPower(gmSeries)\n const [sRq, evRq] = scoreReinvestmentQuality(annualData)\n const [sOl, evOl] = scoreOperatingLeverage(annualData)\n const [sCp, capYears, evCp] = scoreCap(roicSeries, estWacc)\n\n const raw =\n W.roicPersistence * sRp\n + W.pricingPower * sPp\n + W.reinvestmentQuality * sRq\n + W.operatingLeverage * sOl\n + W.cap * sCp\n\n const score = Math.round(Math.min(Math.max(raw * 100, 0), 100))\n const width: 'wide' | 'narrow' | 'none' =\n score >= 70 ? 'wide' : score >= 40 ? 'narrow' : 'none'\n\n const desc = {\n wide: 'Durable competitive advantage likely to persist for 10+ years',\n narrow: 'Real but limited or potentially fading competitive advantage',\n none: 'No detectable financial signature of a durable economic moat',\n }\n\n return {\n score,\n width,\n components: {\n roicPersistence: parseFloat(sRp.toFixed(4)),\n pricingPower: parseFloat(sPp.toFixed(4)),\n reinvestmentQuality: parseFloat(sRq.toFixed(4)),\n operatingLeverage: parseFloat(sOl.toFixed(4)),\n capScore: parseFloat(sCp.toFixed(4)),\n },\n capEstimateYears: parseFloat(capYears.toFixed(1)),\n waccUsed: parseFloat(estWacc.toFixed(4)),\n yearsAnalyzed: annualData.length,\n evidence: [...evRp, ...evPp, ...evRq, ...evOl, ...evCp],\n interpretation: `Score ${score}/100: ${desc[width]}`,\n }\n}\n","/**\n * Capital Allocation Quality Score.\n *\n * Measures how effectively management deploys the capital entrusted to it.\n * A company that consistently earns above-WACC returns, converts NOPAT to FCF\n * efficiently, grows assets proportionally with revenue, and handles shareholder\n * distributions with discipline scores highest.\n *\n * Signals\n * -------\n * 1. Value Creation (35%) — ROIC vs WACC spread level and trend\n * 2. FCF Quality (25%) — NOPAT-to-FCF conversion rate and consistency\n * 3. Reinvestment Yield (25%) — incremental revenue per dollar of incremental assets\n * 4. Payout Discipline (15%) — dividend FCF coverage; FCF retention vs ROIC logic\n *\n * Score: 0–100\n * Rating: 'excellent' (75–100), 'good' (50–74), 'fair' (25–49), 'poor' (0–24)\n */\n\nimport { safeDivide } from './safe-divide.js'\n\n// ── Input / Output types ───────────────────────────────────────────────────────\n\n/** One year of financial data for capital allocation analysis. */\nexport interface AnnualCapitalData {\n revenue?: number\n ebit?: number\n ebt?: number\n interestExpense?: number\n incomeTaxExpense?: number\n totalAssets?: number\n totalEquity?: number\n totalDebt?: number\n cash?: number\n capex?: number\n depreciation?: number\n dividendsPaid?: number\n year?: number | string\n}\n\nexport interface CapitalAllocationComponents {\n valueCreation: number // 0–1\n fcfQuality: number // 0–1\n reinvestmentYield: number // 0–1\n payoutDiscipline: number // 0–1\n}\n\nexport interface CapitalAllocationResult {\n score: number // 0–100\n rating: 'excellent' | 'good' | 'fair' | 'poor'\n components: CapitalAllocationComponents\n waccUsed: number\n yearsAnalyzed: number\n evidence: string[]\n}\n\nexport interface CapitalAllocationOptions {\n wacc?: number\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nfunction mean(xs: number[]): number {\n return xs.length ? xs.reduce((a, b) => a + b, 0) / xs.length : 0\n}\n\nfunction std(xs: number[]): number {\n if (xs.length < 2) return 0\n const m = mean(xs)\n return Math.sqrt(xs.reduce((a, x) => a + (x - m) ** 2, 0) / (xs.length - 1))\n}\n\nfunction cv(xs: number[]): number {\n const m = mean(xs)\n return Math.abs(m) > 1e-9 ? std(xs) / Math.abs(m) : 1\n}\n\nfunction olsSlope(ys: number[]): number {\n const n = ys.length\n if (n < 2) return 0\n const xm = (n - 1) / 2\n const ym = mean(ys)\n const ssXX = Array.from({ length: n }, (_, i) => (i - xm) ** 2).reduce((a, b) => a + b, 0)\n const ssXY = Array.from({ length: n }, (_, i) => (i - xm) * ((ys[i] ?? 0) - ym)).reduce((a, b) => a + b, 0)\n return ssXX ? ssXY / ssXX : 0\n}\n\nfunction clamp(x: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, x))\n}\n\nfunction g(d: AnnualCapitalData, k: keyof AnnualCapitalData): number {\n const v = d[k]\n return typeof v === 'number' && isFinite(v) ? v : 0\n}\n\n// ── WACC estimation ────────────────────────────────────────────────────────────\n\nfunction estimateWacc(series: AnnualCapitalData[], provided?: number): number {\n if (provided !== undefined) return provided\n const d = series[series.length - 1]!\n const equity = g(d, 'totalEquity')\n const debt = g(d, 'totalDebt')\n const cash = g(d, 'cash')\n const totalCap = equity + debt - cash\n if (totalCap <= 0) return 0.10\n const costEquity = 0.045 + 0.055\n const interest = g(d, 'interestExpense')\n let costDebt = 0.04\n if (debt > 0 && interest > 0) {\n const preTax = clamp(interest / debt, 0.02, 0.15)\n const ebt = g(d, 'ebt') || g(d, 'ebit') - interest\n const tax = g(d, 'incomeTaxExpense')\n const taxRate = ebt > 0 && tax > 0 ? clamp(tax / ebt, 0, 0.40) : 0.21\n costDebt = preTax * (1 - taxRate)\n }\n const wE = clamp(equity / totalCap, 0, 1)\n return clamp(wE * costEquity + (1 - wE) * costDebt, 0.06, 0.20)\n}\n\n// ── ROIC ──────────────────────────────────────────────────────────────────────\n\nfunction yearRoic(d: AnnualCapitalData): number | null {\n const ebit = g(d, 'ebit')\n const ic = g(d, 'totalEquity') + g(d, 'totalDebt') - g(d, 'cash')\n if (ic <= 0) return null\n const ebt = g(d, 'ebt') || ebit - g(d, 'interestExpense')\n const tax = g(d, 'incomeTaxExpense')\n const taxRate = ebt > 0 && tax > 0 ? clamp(tax / ebt, 0, 0.50) : 0.21\n return (ebit * (1 - taxRate)) / ic\n}\n\n// ── Signal 1: Value Creation ──────────────────────────────────────────────────\n\nfunction scoreValueCreation(series: AnnualCapitalData[], wacc: number): [number, string[]] {\n const roicVals = series.map(yearRoic).filter((r): r is number => r !== null)\n if (!roicVals.length) return [0.30, ['Value creation: insufficient ROIC data (neutral score)']]\n\n const spreads = roicVals.map(r => r - wacc)\n const ms = mean(spreads)\n const slope = olsSlope(spreads)\n const level = clamp((ms + 0.05) / 0.25, 0, 1)\n const trendAdj = slope > 0.01 ? 0.10 : slope < -0.01 ? -0.10 : 0\n const consistency = Math.max(0, 1 - cv(spreads) * 0.5)\n const score = clamp(0.60 * level + 0.40 * consistency + trendAdj, 0, 1)\n\n const pos = spreads.filter(s => s > 0).length\n const dir = slope > 0.01 ? 'improving' : slope < -0.01 ? 'declining' : 'stable'\n return [score, [\n `Value creation: mean ROIC-WACC spread ${(ms * 100).toFixed(1)}% (${pos}/${spreads.length} years positive)`,\n `Spread trend: ${dir} (OLS ${(slope * 100).toFixed(2)}%/yr)`,\n ]]\n}\n\n// ── Signal 2: FCF Quality ─────────────────────────────────────────────────────\n\nfunction scoreFcfQuality(series: AnnualCapitalData[]): [number, string[]] {\n const conversions: number[] = []\n for (const d of series) {\n const ebit = g(d, 'ebit')\n if (ebit <= 0) continue\n const ebt = g(d, 'ebt') || ebit - g(d, 'interestExpense')\n const tax = g(d, 'incomeTaxExpense')\n const taxRate = ebt > 0 && tax > 0 ? clamp(tax / ebt, 0, 0.50) : 0.21\n const nopat = ebit * (1 - taxRate)\n if (nopat <= 0) continue\n const fcf = nopat + g(d, 'depreciation') - g(d, 'capex')\n conversions.push(fcf / nopat)\n }\n if (!conversions.length) return [0.40, ['FCF quality: insufficient data (neutral score)']]\n\n const mc = mean(conversions)\n const level = clamp(mc / 1.2, 0, 1)\n const stability = Math.max(0, 1 - cv(conversions) * 1.5)\n const score = clamp(0.65 * level + 0.35 * stability, 0, 1)\n const quality = mc >= 1.0 ? 'capital-light' : mc < 0.5 ? 'capital-heavy' : 'moderate'\n return [score, [`FCF quality: mean NOPAT-to-FCF conversion ${(mc * 100).toFixed(0)}% (${quality})`]]\n}\n\n// ── Signal 3: Reinvestment Yield ──────────────────────────────────────────────\n\nfunction scoreReinvestmentYield(series: AnnualCapitalData[]): [number, string[]] {\n const yields: number[] = []\n for (let i = 1; i < series.length; i++) {\n const prev = series[i - 1]!\n const curr = series[i]!\n const da = g(curr, 'totalAssets') - g(prev, 'totalAssets')\n const dr = g(curr, 'revenue') - g(prev, 'revenue')\n if (da > 1e6) yields.push(dr / da)\n }\n if (!yields.length) return [0.40, ['Reinvestment yield: insufficient data (neutral score)']]\n\n const my = mean(yields)\n const level = clamp((my + 0.2) / 1.7, 0, 1)\n const consistency = Math.max(0, 1 - cv(yields) * 0.5)\n const score = clamp(0.65 * level + 0.35 * consistency, 0, 1)\n const pos = yields.filter(y => y > 0).length\n return [score, [\n `Reinvestment yield: mean incremental revenue/asset ${my.toFixed(2)}x (${pos}/${yields.length} periods productive)`,\n ]]\n}\n\n// ── Signal 4: Payout Discipline ───────────────────────────────────────────────\n\nfunction scorePayoutDiscipline(series: AnnualCapitalData[], wacc: number): [number, string[]] {\n const coverages: number[] = []\n for (const d of series) {\n const ebit = g(d, 'ebit')\n if (ebit <= 0) continue\n const ebt = g(d, 'ebt') || ebit - g(d, 'interestExpense')\n const tax = g(d, 'incomeTaxExpense')\n const taxRate = ebt > 0 && tax > 0 ? clamp(tax / ebt, 0, 0.50) : 0.21\n const nopat = ebit * (1 - taxRate)\n const fcf = nopat + g(d, 'depreciation') - g(d, 'capex')\n const div = g(d, 'dividendsPaid')\n if (div > 0) coverages.push(fcf > 0 ? fcf / div : 0)\n }\n if (coverages.length) {\n const mc = mean(coverages)\n const score = clamp((mc - 0.5) / 2.0, 0, 1)\n const health = mc >= 2.0 ? 'healthy' : mc >= 1.0 ? 'tight' : 'stressed'\n return [score, [`Payout discipline: mean FCF/dividend coverage ${mc.toFixed(1)}x (${health})`]]\n }\n\n const roicVals = series.map(yearRoic).filter((r): r is number => r !== null)\n const mr = mean(roicVals)\n if (mr > wacc * 1.2) return [0.70, ['Payout discipline: retaining FCF in above-WACC business (good reinvestment)']]\n if (mr <= wacc) return [0.35, ['Payout discipline: retaining FCF despite below-WACC returns (concerning)']]\n return [0.50, ['Payout discipline: no dividend data available (neutral score)']]\n}\n\n// ── Main function ─────────────────────────────────────────────────────────────\n\n/**\n * Compute Capital Allocation Score from a sequence of annual financial records.\n *\n * @param annualData - Array of annual records in chronological order (oldest first).\n * Minimum 2 years required.\n * @param options - Optional: `{ wacc }` to override WACC estimation.\n * @returns CapitalAllocationResult with score (0–100), rating, components, and evidence.\n */\nexport function capitalAllocationScore(\n annualData: AnnualCapitalData[],\n options: CapitalAllocationOptions = {},\n): CapitalAllocationResult {\n if (annualData.length < 2) {\n throw new Error('capitalAllocationScore requires at least 2 years of data.')\n }\n\n const wacc = estimateWacc(annualData, options.wacc)\n\n const [vcScore, vcEv] = scoreValueCreation(annualData, wacc)\n const [fcfScore, fcfEv] = scoreFcfQuality(annualData)\n const [riScore, riEv] = scoreReinvestmentYield(annualData)\n const [pdScore, pdEv] = scorePayoutDiscipline(annualData, wacc)\n\n const raw = 0.35 * vcScore + 0.25 * fcfScore + 0.25 * riScore + 0.15 * pdScore\n const score = Math.round(clamp(raw, 0, 1) * 100)\n\n const rating: CapitalAllocationResult['rating'] =\n score >= 75 ? 'excellent' :\n score >= 50 ? 'good' :\n score >= 25 ? 'fair' : 'poor'\n\n return {\n score,\n rating,\n components: {\n valueCreation: Math.round(vcScore * 1e4) / 1e4,\n fcfQuality: Math.round(fcfScore * 1e4) / 1e4,\n reinvestmentYield: Math.round(riScore * 1e4) / 1e4,\n payoutDiscipline: Math.round(pdScore * 1e4) / 1e4,\n },\n waccUsed: wacc,\n yearsAnalyzed: annualData.length,\n evidence: [...vcEv, ...fcfEv, ...riEv, ...pdEv],\n }\n}\n","/**\n * Earnings Quality Score.\n *\n * Quantifies how reliable and sustainable a company's reported earnings are.\n * High-quality earnings are predominantly cash-backed, derived from core\n * operations, and free of aggressive accounting.\n *\n * Signals\n * -------\n * 1. Accruals Ratio (30%) — (NI − CFO) / Avg Assets; Sloan (1996)\n * 2. Cash Earnings Quality (25%) — CFO / NI; Richardson et al. (2005)\n * 3. Revenue Recognition (20%) — Revenue growth vs AR growth spread\n * 4. Gross Margin Stability (15%) — stable margins signal genuine pricing\n * 5. Asset Efficiency Trend (10%) — declining asset turnover = potential concern\n *\n * Score: 0–100\n * Rating: 'high' (75–100), 'medium' (50–74), 'low' (25–49), 'poor' (0–24)\n */\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\n/** One year of financial data for earnings quality analysis. */\nexport interface AnnualEarningsData {\n revenue?: number\n grossProfit?: number\n netIncome?: number\n operatingCashFlow?: number\n totalAssets?: number\n accountsReceivable?: number\n year?: number | string\n}\n\nexport interface EarningsQualityComponents {\n accrualsRatio: number // 0–1\n cashEarnings: number // 0–1\n revenueRecognition: number // 0–1\n grossMarginStability: number // 0–1\n assetEfficiency: number // 0–1\n}\n\nexport interface EarningsQualityResult {\n score: number // 0–100\n rating: 'high' | 'medium' | 'low' | 'poor'\n components: EarningsQualityComponents\n yearsAnalyzed: number\n evidence: string[]\n}\n\nexport interface EarningsQualityOptions {\n // reserved for future use\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nfunction mean(xs: number[]): number {\n return xs.length ? xs.reduce((a, b) => a + b, 0) / xs.length : 0\n}\n\nfunction std(xs: number[]): number {\n if (xs.length < 2) return 0\n const m = mean(xs)\n return Math.sqrt(xs.reduce((a, x) => a + (x - m) ** 2, 0) / (xs.length - 1))\n}\n\nfunction cv(xs: number[]): number {\n const m = mean(xs)\n return Math.abs(m) > 1e-9 ? std(xs) / Math.abs(m) : 1\n}\n\nfunction olsSlope(ys: number[]): number {\n const n = ys.length\n if (n < 2) return 0\n const xm = (n - 1) / 2\n const ym = mean(ys)\n const ssXX = Array.from({ length: n }, (_, i) => (i - xm) ** 2).reduce((a, b) => a + b, 0)\n const ssXY = Array.from({ length: n }, (_, i) => (i - xm) * ((ys[i] ?? 0) - ym)).reduce((a, b) => a + b, 0)\n return ssXX ? ssXY / ssXX : 0\n}\n\nfunction clamp(x: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, x))\n}\n\nfunction g(d: AnnualEarningsData, k: keyof AnnualEarningsData): number {\n const v = d[k]\n return typeof v === 'number' && isFinite(v) ? v : 0\n}\n\n// ── Signal 1: Accruals Ratio ──────────────────────────────────────────────────\n\nfunction scoreAccruals(series: AnnualEarningsData[]): [number, string[]] {\n const ratios: number[] = []\n for (let i = 0; i < series.length; i++) {\n const d = series[i]!\n const ni = g(d, 'netIncome')\n const cfo = g(d, 'operatingCashFlow')\n if (ni === 0 && cfo === 0) continue\n const prevAssets = i > 0 ? g(series[i - 1]!, 'totalAssets') : g(d, 'totalAssets')\n const avgAssets = (g(d, 'totalAssets') + prevAssets) / 2\n if (avgAssets <= 0) continue\n ratios.push((ni - cfo) / avgAssets)\n }\n if (!ratios.length) return [0.40, ['Accruals ratio: operating cash flow not available (neutral score)']]\n\n const ma = mean(ratios)\n const level = clamp(1 - (ma + 0.05) / 0.15, 0, 1)\n const stability = Math.max(0, 1 - cv(ratios))\n const score = clamp(0.70 * level + 0.30 * stability, 0, 1)\n const quality = ma < 0 ? 'cash-backed' : ma < 0.05 ? 'modest accruals' : 'high accruals'\n return [score, [\n `Accruals ratio: mean ${(ma * 100).toFixed(1)}% of assets (${quality})`,\n ma < 0.02 ? 'Earnings predominantly backed by cash flows' : 'Elevated accruals — verify cash conversion',\n ]]\n}\n\n// ── Signal 2: Cash Earnings Quality ───────────────────────────────────────────\n\nfunction scoreCashEarnings(series: AnnualEarningsData[]): [number, string[]] {\n const ratios: number[] = []\n for (const d of series) {\n const ni = g(d, 'netIncome')\n const cfo = g(d, 'operatingCashFlow')\n if (ni > 0) ratios.push(cfo / ni)\n }\n if (!ratios.length) return [0.40, ['Cash earnings quality: insufficient CFO/NI data (neutral score)']]\n\n const mr = mean(ratios)\n const level = clamp((mr - 0.5) / 1.0, 0, 1)\n const stability = Math.max(0, 1 - cv(ratios) * 0.8)\n const score = clamp(0.65 * level + 0.35 * stability, 0, 1)\n const above = ratios.filter(r => r >= 1).length\n const quality = mr >= 1.2 ? 'excellent' : mr >= 0.9 ? 'good' : 'weak'\n return [score, [\n `CFO/NI conversion: mean ${mr.toFixed(2)}× (${above}/${ratios.length} years ≥ 1.0)`,\n `Cash earnings quality: ${quality}`,\n ]]\n}\n\n// ── Signal 3: Revenue Recognition ─────────────────────────────────────────────\n\nfunction scoreRevenueRecognition(series: AnnualEarningsData[]): [number, string[]] {\n const spreads: number[] = []\n for (let i = 1; i < series.length; i++) {\n const prev = series[i - 1]!\n const curr = series[i]!\n if (g(prev, 'revenue') <= 0) continue\n const revGrowth = (g(curr, 'revenue') - g(prev, 'revenue')) / g(prev, 'revenue')\n const arPrev = g(prev, 'accountsReceivable')\n const arCurr = g(curr, 'accountsReceivable')\n if (arPrev > 0 && arCurr > 0) {\n spreads.push(revGrowth - (arCurr - arPrev) / arPrev)\n }\n }\n if (!spreads.length) return [0.45, ['Revenue recognition: accounts receivable data unavailable (neutral score)']]\n\n const ms = mean(spreads)\n const level = clamp((ms + 0.15) / 0.25, 0, 1)\n const consistency = Math.max(0, 1 - cv(spreads) * 0.5)\n const score = clamp(0.65 * level + 0.35 * consistency, 0, 1)\n const quality = ms > 0.05 ? 'conservative' : ms > -0.05 ? 'neutral' : 'aggressive'\n const pos = spreads.filter(s => s >= 0).length\n return [score, [\n `Revenue recognition: revenue-AR spread ${(ms * 100).toFixed(1)}%/yr (${quality})`,\n `Revenue outpaced receivables in ${pos}/${spreads.length} periods`,\n ]]\n}\n\n// ── Signal 4: Gross Margin Stability ──────────────────────────────────────────\n\nfunction scoreGrossMarginStability(series: AnnualEarningsData[]): [number, string[]] {\n const gms = series\n .filter(d => g(d, 'revenue') > 0 && g(d, 'grossProfit') > 0)\n .map(d => g(d, 'grossProfit') / g(d, 'revenue'))\n if (gms.length < 2) return [0.45, ['Gross margin stability: insufficient data (neutral score)']]\n\n const mgm = mean(gms)\n const cvGm = cv(gms)\n const slope = olsSlope(gms)\n const stability = clamp(1 - cvGm * 3, 0, 1)\n const trendAdj = slope > 0.005 ? 0.08 : slope < -0.005 ? -0.08 : 0\n const score = clamp(stability + trendAdj, 0, 1)\n const trend = slope > 0.005 ? 'improving' : slope < -0.005 ? 'eroding' : 'stable'\n const quality = cvGm < 0.05 ? 'high' : cvGm < 0.15 ? 'moderate' : 'low'\n return [score, [\n `Gross margin: mean ${(mgm * 100).toFixed(1)}% stability ${quality} (CV ${cvGm.toFixed(3)})`,\n `Gross margin trend: ${trend}`,\n ]]\n}\n\n// ── Signal 5: Asset Efficiency ────────────────────────────────────────────────\n\nfunction scoreAssetEfficiency(series: AnnualEarningsData[]): [number, string[]] {\n const tos = series\n .filter(d => g(d, 'totalAssets') > 0 && g(d, 'revenue') > 0)\n .map(d => g(d, 'revenue') / g(d, 'totalAssets'))\n if (tos.length < 2) return [0.45, ['Asset efficiency: insufficient data (neutral score)']]\n\n const slope = olsSlope(tos)\n const mto = mean(tos)\n const trendScore = clamp(0.5 + slope * 5, 0, 1)\n const level = clamp((mto - 0.2) / 1.5, 0, 1)\n const score = clamp(0.50 * trendScore + 0.50 * level, 0, 1)\n const dir = slope > 0.02 ? 'improving' : slope < -0.02 ? 'declining' : 'stable'\n return [score, [`Asset turnover: mean ${mto.toFixed(2)}× trend ${dir} (slope ${slope.toFixed(3)}/yr)`]]\n}\n\n// ── Main function ─────────────────────────────────────────────────────────────\n\n/**\n * Compute Earnings Quality Score from a sequence of annual financial records.\n *\n * @param annualData - Array in chronological order (oldest first). Min 2 years.\n * @returns EarningsQualityResult with score (0–100), rating, components, evidence.\n */\nexport function earningsQualityScore(\n annualData: AnnualEarningsData[],\n _options: EarningsQualityOptions = {},\n): EarningsQualityResult {\n if (annualData.length < 2) {\n throw new Error('earningsQualityScore requires at least 2 years of data.')\n }\n\n const [accScore, accEv] = scoreAccruals(annualData)\n const [cfeScore, cfeEv] = scoreCashEarnings(annualData)\n const [revScore, revEv] = scoreRevenueRecognition(annualData)\n const [gmsScore, gmsEv] = scoreGrossMarginStability(annualData)\n const [effScore, effEv] = scoreAssetEfficiency(annualData)\n\n const raw = 0.30 * accScore + 0.25 * cfeScore + 0.20 * revScore + 0.15 * gmsScore + 0.10 * effScore\n const score = Math.round(clamp(raw, 0, 1) * 100)\n const rating: EarningsQualityResult['rating'] =\n score >= 75 ? 'high' :\n score >= 50 ? 'medium' :\n score >= 25 ? 'low' : 'poor'\n\n return {\n score,\n rating,\n components: {\n accrualsRatio: Math.round(accScore * 1e4) / 1e4,\n cashEarnings: Math.round(cfeScore * 1e4) / 1e4,\n revenueRecognition: Math.round(revScore * 1e4) / 1e4,\n grossMarginStability: Math.round(gmsScore * 1e4) / 1e4,\n assetEfficiency: Math.round(effScore * 1e4) / 1e4,\n },\n yearsAnalyzed: annualData.length,\n evidence: [...accEv, ...cfeEv, ...revEv, ...gmsEv, ...effEv],\n }\n}\n","/**\n * Fair Value Range.\n *\n * Synthesises multiple valuation methods into a bull/base/bear fair value\n * estimate. No single method is reliable in isolation — the composite range\n * reflects where multiple frameworks converge.\n *\n * Methods\n * -------\n * 1. DCF (2-stage) — discounted cash flow with explicit + terminal stage\n * 2. Graham Number — Benjamin Graham's geometric mean intrinsic value\n * 3. FCF Yield — normalise FCF at a target yield\n * 4. EV/EBITDA Multiple — EBITDA × target multiple, bridge to equity\n * 5. Earnings Power Value — no-growth: NOPAT / WACC\n *\n * References\n * ----------\n * Graham & Dodd (1934) — Security Analysis\n * Koller et al. (2020) — Valuation (7th ed.), McKinsey & Company\n * Greenwald et al. (2001) — Value Investing: From Graham to Buffett\n */\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport interface FairValueOptions {\n // DCF\n fcf?: number\n shares?: number\n growthRate?: number // default 0.08\n terminalGrowth?: number // default 0.03\n wacc?: number // default 0.09\n dcfYears?: number // default 10\n // Graham Number\n eps?: number\n bvps?: number\n // FCF Yield\n targetYield?: number // default 0.04\n // EV/EBITDA\n ebitda?: number\n totalDebt?: number\n cash?: number\n evEbitdaMultiple?: number // default 12\n // EPV\n ebit?: number\n taxRate?: number // default 0.21\n // Market context\n currentPrice?: number\n}\n\nexport interface FairValueRange {\n estimates: Record<string, number> // per-method fair value per share\n baseValue: number // trimmed median\n bullValue: number // 75th percentile\n bearValue: number // 25th percentile\n methodsUsed: number\n currentPrice?: number\n upsidePct?: number\n marginOfSafety?: number\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nfunction percentile(xs: number[], p: number): number {\n if (!xs.length) return 0\n const sorted = [...xs].sort((a, b) => a - b)\n const idx = (p / 100) * (sorted.length - 1)\n const lo = Math.floor(idx)\n const hi = Math.min(lo + 1, sorted.length - 1)\n return (sorted[lo] ?? 0) + ((sorted[hi] ?? 0) - (sorted[lo] ?? 0)) * (idx - lo)\n}\n\nfunction trimmedMean(xs: number[]): number {\n if (xs.length <= 3) return xs.reduce((a, b) => a + b, 0) / xs.length\n const sorted = [...xs].sort((a, b) => a - b).slice(1, -1)\n return sorted.reduce((a, b) => a + b, 0) / sorted.length\n}\n\nfunction round2(x: number): number {\n return Math.round(x * 100) / 100\n}\n\n// ── Per-method calculators ─────────────────────────────────────────────────────\n\nfunction dcfValue(\n fcf: number, growthRate: number, terminalGrowth: number,\n wacc: number, shares: number, years: number,\n): number | null {\n if (wacc <= terminalGrowth || fcf <= 0 || shares <= 0) return null\n let pv = 0\n let cf = fcf\n for (let i = 1; i <= years; i++) {\n cf *= (1 + growthRate)\n pv += cf / (1 + wacc) ** i\n }\n const terminal = cf * (1 + terminalGrowth) / (wacc - terminalGrowth)\n pv += terminal / (1 + wacc) ** years\n return pv / shares\n}\n\nfunction grahamValue(eps: number, bvps: number): number | null {\n return eps > 0 && bvps > 0 ? Math.sqrt(22.5 * eps * bvps) : null\n}\n\nfunction fcfYieldValue(fcf: number, shares: number, targetYield: number): number | null {\n return fcf > 0 && shares > 0 && targetYield > 0 ? (fcf / targetYield) / shares : null\n}\n\nfunction evEbitdaValue(\n ebitda: number, totalDebt: number, cash: number, shares: number, multiple: number,\n): number | null {\n if (ebitda <= 0 || shares <= 0) return null\n const equityValue = ebitda * multiple - totalDebt + cash\n return equityValue > 0 ? equityValue / shares : null\n}\n\nfunction epvValue(\n ebit: number, taxRate: number, wacc: number,\n shares: number, cash: number, totalDebt: number,\n): number | null {\n if (ebit <= 0 || wacc <= 0 || shares <= 0) return null\n const equityValue = ebit * (1 - taxRate) / wacc + cash - totalDebt\n return equityValue > 0 ? equityValue / shares : null\n}\n\n// ── Main function ─────────────────────────────────────────────────────────────\n\n/**\n * Compute a composite fair value range from multiple valuation methods.\n *\n * All monetary inputs must be in the same unit (e.g. total dollars or millions).\n * `fcf`, `ebitda`, and `ebit` are total company values; `shares` converts to per-share.\n *\n * @throws Error if no method can be computed from the provided inputs.\n */\nexport function fairValueRange(options: FairValueOptions): FairValueRange {\n const {\n fcf, shares,\n growthRate = 0.08, terminalGrowth = 0.03, wacc = 0.09, dcfYears = 10,\n eps, bvps,\n targetYield = 0.04,\n ebitda, totalDebt = 0, cash = 0, evEbitdaMultiple = 12,\n ebit, taxRate = 0.21,\n currentPrice,\n } = options\n\n const estimates: Record<string, number> = {}\n\n if (fcf && fcf > 0 && shares && shares > 0) {\n const v = dcfValue(fcf, growthRate, terminalGrowth, wacc, shares, dcfYears)\n if (v && v > 0) estimates['DCF (2-stage)'] = v\n\n const fy = fcfYieldValue(fcf, shares, targetYield)\n if (fy && fy > 0) estimates[`FCF Yield (${(targetYield * 100).toFixed(0)}%)`] = fy\n }\n\n if (eps && bvps) {\n const g = grahamValue(eps, bvps)\n if (g && g > 0) estimates['Graham Number'] = g\n }\n\n if (ebitda && ebitda > 0 && shares && shares > 0) {\n const v = evEbitdaValue(ebitda, totalDebt, cash, shares, evEbitdaMultiple)\n if (v && v > 0) estimates[`EV/EBITDA (${evEbitdaMultiple.toFixed(0)}×)`] = v\n }\n\n if (ebit && ebit > 0 && shares && shares > 0) {\n const v = epvValue(ebit, taxRate, wacc, shares, cash, totalDebt)\n if (v && v > 0) estimates['Earnings Power Value'] = v\n }\n\n if (!Object.keys(estimates).length) {\n throw new Error(\n 'No valuation methods could be computed. ' +\n 'Provide at least one of: (fcf + shares), (eps + bvps), (ebitda + shares), (ebit + shares).'\n )\n }\n\n const vals = Object.values(estimates)\n const baseValue = round2(trimmedMean(vals))\n const bearValue = round2(percentile(vals, 25))\n const bullValue = round2(percentile(vals, 75))\n\n const result: FairValueRange = {\n estimates: Object.fromEntries(Object.entries(estimates).map(([k, v]) => [k, round2(v)])),\n baseValue,\n bearValue,\n bullValue,\n methodsUsed: vals.length,\n }\n\n if (currentPrice !== undefined && currentPrice > 0) {\n result.currentPrice = currentPrice\n result.upsidePct = Math.round((baseValue / currentPrice - 1) * 1000) / 10\n result.marginOfSafety = Math.round((bearValue / currentPrice - 1) * 1000) / 10\n }\n\n return result\n}\n","/**\n * Quality Factor Score.\n *\n * Synthesises three complementary quality dimensions into a single score:\n * 1. Earnings Quality (35%) — reliability of reported earnings\n * 2. Economic Moat (35%) — durability of competitive advantage\n * 3. Capital Allocation (30%) — effectiveness of management's capital use\n *\n * Score: 0–100\n * Grade: 'exceptional' (80–100), 'strong' (60–79), 'moderate' (40–59),\n * 'weak' (20–39), 'poor' (0–19)\n *\n * References\n * ----------\n * Asness, Frazzini & Pedersen (2019) — Quality Minus Junk. Review of Accounting Studies.\n */\n\nimport { earningsQualityScore, type EarningsQualityResult } from './earnings-quality.js'\nimport { moatScore, type MoatScoreResult } from './moat-score.js'\nimport { capitalAllocationScore, type CapitalAllocationResult } from './capital-allocation.js'\nimport type { AnnualFinancialData } from './moat-score.js'\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport interface QualityComponents {\n earningsQuality: number // 0–1\n moat: number // 0–1\n capitalAllocation: number // 0–1\n}\n\nexport interface QualityFactorResult {\n score: number // 0–100\n grade: 'exceptional' | 'strong' | 'moderate' | 'weak' | 'poor'\n components: QualityComponents\n subScores: {\n earningsQuality: EarningsQualityResult\n moat: MoatScoreResult\n capitalAllocation: CapitalAllocationResult\n }\n yearsAnalyzed: number\n evidence: string[]\n}\n\n/** Input type that satisfies all three sub-score calculators. */\nexport type AnnualQualityData = AnnualFinancialData & {\n netIncome?: number\n operatingCashFlow?: number\n accountsReceivable?: number\n}\n\nexport interface QualityScoreOptions {\n wacc?: number\n}\n\n// ── Main function ─────────────────────────────────────────────────────────────\n\n/**\n * Compute Quality Factor Score from a sequence of annual financial records.\n *\n * @param annualData - Array in chronological order (oldest first). Min 2 years.\n * @param options - Optional: `{ wacc }` to override WACC estimation.\n * @returns QualityFactorResult with score (0–100), grade, sub-scores, evidence.\n */\nexport function qualityScore(\n annualData: AnnualQualityData[],\n options: QualityScoreOptions = {},\n): QualityFactorResult {\n if (annualData.length < 2) {\n throw new Error('qualityScore requires at least 2 years of data.')\n }\n\n const eq = earningsQualityScore(annualData as any)\n const ms = moatScore(annualData, options)\n const ca = capitalAllocationScore(annualData as any, options)\n\n const eqNorm = eq.score / 100\n const msNorm = ms.score / 100\n const caNorm = ca.score / 100\n\n const raw = 0.35 * eqNorm + 0.35 * msNorm + 0.30 * caNorm\n const score = Math.round(raw * 100)\n\n const grade: QualityFactorResult['grade'] =\n score >= 80 ? 'exceptional' :\n score >= 60 ? 'strong' :\n score >= 40 ? 'moderate' :\n score >= 20 ? 'weak' : 'poor'\n\n return {\n score,\n grade,\n components: {\n earningsQuality: Math.round(eqNorm * 1e4) / 1e4,\n moat: Math.round(msNorm * 1e4) / 1e4,\n capitalAllocation: Math.round(caNorm * 1e4) / 1e4,\n },\n subScores: { earningsQuality: eq, moat: ms, capitalAllocation: ca },\n yearsAnalyzed: annualData.length,\n evidence: [\n `Earnings Quality: ${eq.score}/100 [${eq.rating.toUpperCase()}]`,\n `Economic Moat: ${ms.score}/100 [${ms.width.toUpperCase()}]`,\n `Capital Allocation: ${ca.score}/100 [${ca.rating.toUpperCase()}]`,\n ],\n }\n}\n","/**\n * Portfolio Quality Analysis.\n *\n * Aggregates quality scores across a portfolio of holdings weighted by\n * position size. Provides a composite view of portfolio quality tilt.\n *\n * Usage (bring your own data):\n * const result = portfolioQuality([\n * { ticker: 'AAPL', weight: 0.30, annualData: [...] },\n * { ticker: 'MSFT', weight: 0.70, annualData: [...] },\n * ])\n */\n\nimport { qualityScore, type QualityFactorResult, type AnnualQualityData } from './quality-score.js'\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport interface HoldingInput {\n ticker: string\n weight: number\n annualData: AnnualQualityData[]\n}\n\nexport interface HoldingResult {\n ticker: string\n weight: number // normalised weight\n quality: QualityFactorResult | null\n error?: string\n}\n\nexport interface PortfolioQualityResult {\n holdings: HoldingResult[]\n weightedQualityScore: number // 0–100\n weightedMoatScore: number // 0–100\n weightedEarningsQuality: number // 0–100\n weightedCapitalAllocation: number // 0–100\n effectiveWeight: number // fraction of portfolio successfully analysed\n grade: 'exceptional' | 'strong' | 'moderate' | 'weak' | 'poor'\n errors: string[]\n}\n\nexport interface PortfolioOptions {\n wacc?: number\n}\n\n// ── Main function ─────────────────────────────────────────────────────────────\n\n/**\n * Compute portfolio-level quality scores from pre-loaded holding data.\n *\n * Weights are normalised automatically — they need not sum to 1.\n * Holdings whose data fails to compute are excluded from weighted averages\n * and reported in `errors`.\n *\n * @param holdings - Array of { ticker, weight, annualData } objects.\n * @param options - Optional: `{ wacc }` override applied to all holdings.\n */\nexport function portfolioQuality(\n holdings: HoldingInput[],\n options: PortfolioOptions = {},\n): PortfolioQualityResult {\n if (!holdings.length) throw new Error('holdings must be a non-empty array.')\n\n const totalWeight = holdings.reduce((s, h) => s + h.weight, 0)\n if (totalWeight <= 0) throw new Error('Sum of holding weights must be positive.')\n\n const results: HoldingResult[] = holdings.map(h => {\n const normWeight = h.weight / totalWeight\n try {\n const q = qualityScore(h.annualData, options)\n return { ticker: h.ticker, weight: normWeight, quality: q }\n } catch (err) {\n return {\n ticker: h.ticker,\n weight: normWeight,\n quality: null,\n error: err instanceof Error ? err.message : String(err),\n }\n }\n })\n\n const successful = results.filter((r): r is HoldingResult & { quality: QualityFactorResult } =>\n r.quality !== null\n )\n\n if (!successful.length) {\n throw new Error('All holdings failed to compute. Check data and minimum year requirements.')\n }\n\n const effWeight = successful.reduce((s, h) => s + h.weight, 0)\n const renorm = effWeight > 0 ? 1 / effWeight : 1\n\n const wavg = (fn: (q: QualityFactorResult) => number): number =>\n Math.round(successful.reduce((s, h) => s + h.weight * fn(h.quality) * renorm, 0) * 10) / 10\n\n const wq = wavg(q => q.score)\n const wm = wavg(q => q.subScores.moat.score)\n const weq = wavg(q => q.subScores.earningsQuality.score)\n const wca = wavg(q => q.subScores.capitalAllocation.score)\n\n const grade: PortfolioQualityResult['grade'] =\n wq >= 80 ? 'exceptional' :\n wq >= 60 ? 'strong' :\n wq >= 40 ? 'moderate' :\n wq >= 20 ? 'weak' : 'poor'\n\n return {\n holdings: results,\n weightedQualityScore: wq,\n weightedMoatScore: wm,\n weightedEarningsQuality: weq,\n weightedCapitalAllocation: wca,\n effectiveWeight: Math.round(effWeight * 1e4) / 1e4,\n grade,\n errors: results.filter(r => r.error).map(r => `${r.ticker}: ${r.error}`),\n }\n}\n"]}
|