Same split/costs/fill as expand1. Dynamic $1M liquidity gate. SPY excluded from tradables.
| Variant | IS Sharpe | IS maxDD | OOS Sharpe | OOS maxDD | OOS ret | turn/yr |
|---|---|---|---|---|---|---|
| W0 BASE raw/H21/k10 | 0.88 | -54.7% | 1.74 | -28.5% | +221.9% | 8.5 |
| W1 +SMA gate | 0.80 | -68.4% | 1.73 | -32.4% | +292.7% | 11.1 |
| W2 resid+SMA | 0.80 | -68.4% | 1.73 | -32.4% | +292.7% | 11.1 |
| W3 +sector | 0.82 | -68.5% | 1.83 | -31.9% | +321.2% | 11.2 |
| W4 H42 | 0.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=1restores 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.