← all research

Same split/costs/fill as expand1. Dynamic $1M liquidity gate. SPY excluded from tradables.

VariantIS SharpeIS maxDDOOS SharpeOOS maxDDOOS retturn/yr
W0 BASE raw/H21/k100.88-54.7%1.74-28.5%+221.9%8.5
W1 +SMA gate0.80-68.4%1.73-32.4%+292.7%11.1
W2 resid+SMA0.80-68.4%1.73-32.4%+292.7%11.1
W3 +sector0.82-68.5%1.83-31.9%+321.2%11.2
W4 H420.81-56.7%1.80-25.6%+249.2%5.9

IS winner on Sharpe: W0 BASE raw/H21/k10.

  • W1 +SMA gate: IS p=0.421, OOS Sharpe delta -0.01
  • W2 resid+SMA: IS p=0.421, OOS Sharpe delta -0.01
  • W3 +sector: IS p=0.385, OOS Sharpe delta +0.09
  • W4 H42: IS p=0.795, OOS Sharpe delta +0.06

Verdicts (2026-09-09)

ADOPT: nothing. DEMOTE: the SMA gate (default OFF).

  • Absolute levels are now realistic (IS 0.88 ≈ P5a BASE OOS 1.07 ballpark) — expand1's 1.0+ readings were survivorship-flattered as suspected. Only relative ordering was ever used, and it holds.
  • W0 BASE wins IS outright (0.88); nothing is significant (all p > 0.38).
  • W2==W1 bit-identical AGAIN → resid-nullo CONFIRMED on the broad universe. Residualization under an EW-market proxy preserves ranks. resid stays opt-in only.
  • W3 sector: neutral-ish here (IS -0.06, OOS +0.09, both n.s.) vs clearly negative in expand1. Net: no promotion case → stays opt-in. Do NOT touch live eqmom on this evidence (different universe/setup).
  • W1 SMA gate: no edge, extra cost. IS -0.08 (n.s.), OOS tied, DD worse (-68% vs -55%), turnover +30%. Two studies net to zero evidence for the MTF overlay → simplest wins: testbot default is now pure BASE (TESTBOT_SMA_GATE=1 restores the gate for experiments).
  • W4 H42 stays the approved cost-fallback (turnover 5.9 vs 8.5/yr, OOS +0.06, DD comparable). Flip to H42 if live costs rise.

Forward shadow (pending wall-clock)

30d forward shadow still required before any promotion. Procedure (no new infra): run python -m production.testbot_regime --once daily post-close (cron 16:20 ET); shadow NAV is reconstructible any time from logs/testbot_regime_decisions.jsonl selected + parquet closes (EW forward returns of each holdings vintage, next-open fill). Re-run scripts/forward_tracker.py --report cadence at 30/60/90d.