← all research

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.

VariantSegmentRet (cum)Sharpe(252)MaxDDpCorrMktCorrEqMomResidSharpe
PEAD any positive (baseline, hold60)IS+40.36%0.38-14.22%0.1160.410.380.32
PEAD any positive (baseline, hold60)OOS+187.15%0.86-21.77%0.0010.410.380.32
PEAD top quintile surprise hold60IS+40.36%0.38-14.22%0.1160.410.390.45
PEAD top quintile surprise hold60OOS+343.39%1.04-22.96%0.0010.410.390.45
PEAD top quintile + low-volIS+40.36%0.38-14.22%0.1160.400.380.44
PEAD top quintile + low-volOOS+300.73%1.03-19.79%0.0010.400.380.44
EqMomcredit spread <2.5%IS+235.20%0.73-42.21%0.0110.730.96
EqMomcredit spread <2.5%OOS+1004.91%1.06-38.55%0.0010.730.96
EqMomyield curve >0 (T10Y3M>0)IS+195.59%0.62-54.71%0.0280.790.93
EqMomyield curve >0 (T10Y3M>0)OOS+376.04%0.81-33.25%0.0040.790.93
EqMomVIX < trailing 1y medianIS+79.38%0.58-24.43%0.0350.340.54
EqMomVIX < trailing 1y medianOOS+138.59%0.68-22.18%0.0140.340.54
EqMom baseline (12-1 top decile, hold21, net10bps)IS+195.59%0.62-54.71%0.0281.001.000.00
EqMom baseline (12-1 top decile, hold21, net10bps)OOS+1004.91%1.06-38.55%0.0011.001.000.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.