fin-ratios 0.1.0

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.
@@ -0,0 +1 @@
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"],"names":["enterpriseValue","mean"],"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","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"]}