← all research

All studies use validation/framework.py (lag>=1, next_open, dead-stock-safe, cost_bps decimal). IS <2023-01-01, OOS >=2023-01-01 is the honest window because scripts/fetch_fundamentals.py only serves ~5 recent quarters per name (yfinance depth); earlier IS has no fundamentals data (flat). Bootstrap n=5000, beta audit vs EW market and vs EqMom.

VariantSegmentRet (cum)Sharpe(252)MaxDDpCorrMktCorrEqMomResidSharpe
Accrual low (bottom decile, hold63)IS+0.00%0.000.00%1.000nannan0.00
Accrual low (bottom decile, hold63)OOS+0.00%0.000.00%1.000nannan0.00
Asset growth low (bottom decile, hold63)IS+0.00%0.000.00%1.000nannan0.00
Asset growth low (bottom decile, hold63)OOS+0.00%0.000.00%1.000nannan0.00
Earnings momentum high (top decile, hold63)IS+0.00%0.000.00%1.000nannan0.00
Earnings momentum high (top decile, hold63)OOS+0.00%0.000.00%1.000nannan0.00
EqMom baseline (12-1 top decile, hold21, net10bps)IS+706.66%0.67-54.71%0.0031.001.000.00
EqMom baseline (12-1 top decile, hold21, net10bps)OOS+304.87%1.63-26.04%0.0011.001.000.00

Verdicts (OOS only, p<0.05 and resid>0 and corrEqMom<0.7 required for PASS)

  • Accrual low (bottom decile, hold63): REJECT (p=1.000, Sharpe 0.00, corrEqMom nan, resid 0.00) — resid~0.
  • Asset growth low (bottom decile, hold63): REJECT (p=1.000, Sharpe 0.00, corrEqMom nan, resid 0.00) — resid~0.
  • Earnings momentum high (top decile, hold63): REJECT (p=1.000, Sharpe 0.00, corrEqMom nan, resid 0.00) — resid~0.
  • EqMom baseline (12-1 top decile, hold21, net10bps): — (p=0.001, Sharpe 1.63) — reference.

Notes

  • Accrual = (NI_ttm - OCF_ttm)/Assets, point-in-time lag 45d, signal = -accrual, bottom decile long, hold63, net 10bps.
  • Asset growth = Assets[t]/Assets[t-1y]-1, signal = -growth, bottom decile long.
  • Earnings momentum = NI_ttm[t]/NI_ttm[t-1y]-1, signal = growth, top decile long.
  • All three families were never explored in prior rounds (Round 9 tested EP/BP/ROE levels, not quality/growth). The extended scripts/fetch_fundamentals.py now fetches OCF and Assets for accruals (previously only NI/rev/book).
  • Data horizon is the binding constraint: fundamentals cache covers S&P 500 with ~5 recent quarters per name, so even OOS 2023+ is only ~2 years of signal (2023-2025) — a tiny sample vs 20y price factors. A real test needs a paid 20y PIT database.