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.
| Variant | Segment | Ret (cum) | Sharpe(252) | MaxDD | p | CorrMkt | CorrEqMom | ResidSharpe |
|---|---|---|---|---|---|---|---|---|
| Accrual low (bottom decile, hold63) | IS | +0.00% | 0.00 | 0.00% | 1.000 | nan | nan | 0.00 |
| Accrual low (bottom decile, hold63) | OOS | +0.00% | 0.00 | 0.00% | 1.000 | nan | nan | 0.00 |
| Asset growth low (bottom decile, hold63) | IS | +0.00% | 0.00 | 0.00% | 1.000 | nan | nan | 0.00 |
| Asset growth low (bottom decile, hold63) | OOS | +0.00% | 0.00 | 0.00% | 1.000 | nan | nan | 0.00 |
| Earnings momentum high (top decile, hold63) | IS | +0.00% | 0.00 | 0.00% | 1.000 | nan | nan | 0.00 |
| Earnings momentum high (top decile, hold63) | OOS | +0.00% | 0.00 | 0.00% | 1.000 | nan | nan | 0.00 |
| EqMom baseline (12-1 top decile, hold21, net10bps) | IS | +706.66% | 0.67 | -54.71% | 0.003 | 1.00 | 1.00 | 0.00 |
| EqMom baseline (12-1 top decile, hold21, net10bps) | OOS | +304.87% | 1.63 | -26.04% | 0.001 | 1.00 | 1.00 | 0.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.pynow 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.