← all research

Pre-reg: 5-min OR 09:30-09:35 ET, first-CLOSE-above-high -> next-open, exit 15:50, 1 trade/name/day, long-only. V3 PRIMARY = bullish first candle + RV>=1.0 + top-20/day. IS < 2025-01-01, OOS >= 2025-01-01. Costs per-trade 2x one-way; verdict on net10. Non-OK symbol-days ineligible; days with <5 eligible BLOCKED (0), separate from flat-no-trigger days.

Window: 2020-07-27 .. 2026-09-10 (1538 days, 692 tradeable, 846 blocked). Symbols: 50.

VariantSegmentDaysTradeDaysRetSharpeNet10 SharpeNet25 SharpeTrades
V0 unfiltered long-breakIS1116284-20.88%-0.44-1.66-3.381229
V0 unfiltered long-breakOOS422401+6.23%+0.34-2.78-7.432419
V0 unfiltered long-breakFULL1538685-15.95%-0.15-2.02-4.683648
V1 +bullish-candleIS1116247+12.92%+0.34-0.74-2.30684
V1 +bullish-candleOOS422389+24.88%+0.88-1.76-5.711476
V1 +bullish-candleFULL1538636+41.00%+0.53-1.10-3.482160
V2 +RV>=100%IS1116127+4.88%+0.18-0.43-1.33199
V2 +RV>=100%OOS422274+63.21%+1.72-0.05-2.70501
V2 +RV>=100%FULL1538401+71.18%+0.79-0.26-1.81700
V3 PRIMARY +top20IS1116127+4.88%+0.18-0.43-1.33199
V3 PRIMARY +top20OOS422274+63.21%+1.72-0.05-2.70501
V3 PRIMARY +top20FULL1538401+71.18%+0.79-0.26-1.81700

OOS verdict (V3 PRIMARY, net10, incl. flat zeros)

  • net10 Sharpe -0.05 (gross +1.72), ret -5.61%, maxDD -23.31%
  • bootstrap p (all days) 0.532; traded-days p 0.526 (274 traded of 422 OOS days)
  • beta vs BH: +0.55 | corr: +0.43 | resid Sharpe -0.74 (ret -21.40%, maxDD -30.08%) (beta +0.55, resid Sharpe -0.74)
  • OOS blocked-day fraction 4.7%
  • DSR(K=4) 0.17 | haircut -0.05 | PSR 0.48
  • per-trade gross edge 12.6bps over 501 OOS trades (vs 20bps RT @10bps/side, 50bps RT @25bps/side)

Verdict: REJECT (net10 Sharpe -0.05 <= 0; p 0.532 NOT < 0.05; resid Sharpe -0.74 <= 0; blocked 4.7% < 20%)

Reading

  • PASS needs all four (net edge, significance, not-beta, not-sitting-out). IS shown for consistency only; OOS decides.
  • Net10 is the verdict basis (25bps stress alongside). A skip/select filter trades LESS, so net flatters selection — gross must also be sane.
  • Coverage asymmetry: IS tradeable 26.0% of days vs OOS 95.3% (early-window IEX-thin names fail the trailing ADV gate; OOS decides on the cleaner window).
  • Top20 rank never binds (V2==V3 every day: <=20 names/day clear RV>=1.0) — the RV>=100% filter does the selection work, ranking adds nothing here.
  • Failure anatomy: gross edge (+1.72 OOS) is real but thin per-trade and rides beta (+0.55, resid -0.74) — a bull-window intraday-long tilt, not alpha. Costs (20bps RT @10bps) erase it.
  • Next on PASS: walk-forward + 30d observe-only shadow (scripts/orb_play_shadow.py); on REJECT: ledger entry, move on. Revisit only on a NEW mechanism (e.g. maker-entry cost cut, short leg, overnight-gap interaction) — not a re-grid of RV/topK.

Time: 696s. Symbols 50; OOS trades V3 501 (V0 2419 / V1 1476 / V2 501).