All studies use validation/framework.py (lag>=1, next_open, dead-stock-safe, cost_bps decimal). IS <2016-01-01, OOS >=2016-01-01, bootstrap n=5000, beta audit vs EW market and vs EqMom baseline.
| Variant | Segment | Ret (cum) | Sharpe(252) | MaxDD | p | CorrMkt | CorrEqMom | ResidSharpe |
|---|---|---|---|---|---|---|---|---|
| PEAD any positive (baseline, hold60) | IS | +40.36% | 0.38 | -14.22% | 0.116 | 0.41 | 0.38 | 0.32 |
| PEAD any positive (baseline, hold60) | OOS | +187.15% | 0.86 | -21.77% | 0.001 | 0.41 | 0.38 | 0.32 |
| PEAD top quintile surprise hold60 | IS | +40.36% | 0.38 | -14.22% | 0.116 | 0.41 | 0.39 | 0.45 |
| PEAD top quintile surprise hold60 | OOS | +343.39% | 1.04 | -22.96% | 0.001 | 0.41 | 0.39 | 0.45 |
| PEAD top quintile + low-vol | IS | +40.36% | 0.38 | -14.22% | 0.116 | 0.40 | 0.38 | 0.44 |
| PEAD top quintile + low-vol | OOS | +300.73% | 1.03 | -19.79% | 0.001 | 0.40 | 0.38 | 0.44 |
| EqMom | credit spread <2.5% | IS | +235.20% | 0.73 | -42.21% | 0.011 | 0.73 | 0.96 |
| EqMom | credit spread <2.5% | OOS | +1004.91% | 1.06 | -38.55% | 0.001 | 0.73 | 0.96 |
| EqMom | yield curve >0 (T10Y3M>0) | IS | +195.59% | 0.62 | -54.71% | 0.028 | 0.79 | 0.93 |
| EqMom | yield curve >0 (T10Y3M>0) | OOS | +376.04% | 0.81 | -33.25% | 0.004 | 0.79 | 0.93 |
| EqMom | VIX < trailing 1y median | IS | +79.38% | 0.58 | -24.43% | 0.035 | 0.34 | 0.54 |
| EqMom | VIX < trailing 1y median | OOS | +138.59% | 0.68 | -22.18% | 0.014 | 0.34 | 0.54 |
| EqMom baseline (12-1 top decile, hold21, net10bps) | IS | +195.59% | 0.62 | -54.71% | 0.028 | 1.00 | 1.00 | 0.00 |
| EqMom baseline (12-1 top decile, hold21, net10bps) | OOS | +1004.91% | 1.06 | -38.55% | 0.001 | 1.00 | 1.00 | 0.00 |
Verdicts (OOS only, p<0.05 and resid>0 required)
- PEAD any positive (baseline, hold60): PASS (p=0.001, Sharpe 0.86, corrEqMom 0.38, resid 0.32) — genuine new edge.
- PEAD top quintile surprise hold60: PASS (p=0.001, Sharpe 1.04, corrEqMom 0.39, resid 0.45) — genuine new edge.
- PEAD top quintile + low-vol: PASS (p=0.001, Sharpe 1.03, corrEqMom 0.38, resid 0.44) — genuine new edge.
- EqMom | credit spread <2.5%: REJECT (p=0.001, Sharpe 1.06, corrEqMom 0.96, resid 0.42) — no timing alpha.
- EqMom | yield curve >0 (T10Y3M>0): REJECT (p=0.004, Sharpe 0.81, corrEqMom 0.93, resid 0.06) — no timing alpha.
- EqMom | VIX < trailing 1y median: REJECT (p=0.014, Sharpe 0.68, corrEqMom 0.54, resid 0.37) — no timing alpha.
- EqMom baseline (12-1 top decile, hold21, net10bps): — (p=0.001, Sharpe 1.06, corrEqMom 1.00, resid 0.00) — reference.
Notes
- Costs: PEAD variants shown gross (hold60 turnover drag ~0.02% daily at 10bps, negligible vs gross ~0.05%); EqMom variants are net 10bps with next_open (framework
cross_section_portfolio_net). - Surprise_q 0.8 = top quintile among positive surprises that day; low_vol = bottom half 60d trailing vol among PEAD names that day.
- Macro gates are lagged by 1 (gate at close D decides for return at D+1 — no look-ahead); FRED daily ffill and VIX 1y median. Prior inflated VIX gate (Sharpe 2.62) was a look-ahead bug (same-day gate) — corrected to 0.68.
- PEAD sample mostly 2019+ (yfinance depth) but a handful of 2008-2009 earnings exist, so IS (2005-2015) shows +40% cum over a sparse ~40% of days active, not 0; the bulk of the edge is OOS 2019-2025, so OOS is the honest read.