← all research

eqmom rule (126d momentum, top decile, 21d hold), 234 rebalances, 2,351 name-events over 1-min caches. saved_bps = later price − open (BUY: positive = the open fill was the better price, i.e. waiting would have cost more). 50% IEX haircut.

schedulenmean bpshaircut meanp(mean<=0)
0935551+8.31+4.160.001
1030540+11.51+5.760.033
1550612+22.22+11.110.003
close648+19.90+9.950.004

Per-year (best schedule by |haircut mean|)

schedule = 1550

yearnmean bps
202042-69.85
2021106+68.66
2022103+32.97
2023102-20.13
2024103+29.81
202594+45.69
202662+8.84

Reading

  • Positive mean = the open (actual fill) was at a BETTER price than waiting -> immediacy wins; negative = waiting would have saved cost.
  • Caveat: 1550/close are confounded by intraday momentum drift (winners rise into the close), so those means overstate 'savings'. The 09:35 (5-min delay) estimate is the cleanest.
  • The live shadow (scripts/exec_timing_shadow.py) applies the same quantity to real fills; bar: haircut mean > 2 bps, p<0.05, n>=100. Time 597s.