Intraday momentum into the close
The effect from the papers is there before costs: about 1.4 basis points a day. The spread is 0.6.
Why it failed: Positive before costs, negative after them, on two data sources. See the scorecard
Cumulative result
R per trade (net of cost). One trade per day: 15:30 to 16:00 ET in the direction of the move since yesterday's close.
Show the data as a table
| Year | Trades | Sum R | Mean R |
|---|---|---|---|
| 2005 | 255 | −2.9 | −0.011 |
| 2006 | 252 | −12.3 | −0.049 |
| 2007 | 257 | +42.7 | +0.166 |
| 2008 | 259 | +22.5 | +0.087 |
| 2009 | 258 | −19.0 | −0.074 |
| 2010 | 259 | −1.7 | −0.007 |
| 2011 | 258 | +8.7 | +0.034 |
| 2012 | 257 | −7.1 | −0.027 |
| 2013 | 251 | −13.7 | −0.055 |
| 2014 | 256 | −5.4 | −0.021 |
| 2015 | 259 | −18.4 | −0.071 |
| 2016 | 256 | −10.3 | −0.040 |
| 2017 | 256 | −18.8 | −0.073 |
| 2018 | 258 | +7.2 | +0.028 |
| 2019 | 258 | −5.5 | −0.021 |
| 2020 | 257 | +21.2 | +0.083 |
| 2021 | 257 | +4.6 | +0.018 |
| 2022 | 258 | +21.5 | +0.084 |
| 2023 | 257 | −13.5 | −0.053 |
| 2024 | 258 | −15.0 | −0.058 |
| 2025 | 252 | −25.2 | −0.100 |
| 2026 | 159 | −2.8 | −0.017 |
The claim
The direction of the market from yesterday's close into the afternoon predicts the last half hour, because option dealers and leveraged ETFs hedge into the close.
Source: Gao, Han, Li and Zhou (2018), Market intraday momentum, Journal of Financial Economics; Baltussen, Da, Lammers and Martens (2021), Hedging demand and market intraday momentum, Journal of Financial Economics
What we tested
- Signal: the sign of the move from yesterday's close to 15:30 New York time.
- Entry at 15:30 in that direction, exit at 16:00.
- Stop 1.5 x ATR; one trade a day, every day.
- Paper-spec check (separately): the same signal held 15:30-16:00, and the published 10:00 variant, measured in basis points at the real spread.
Costs and fills
- US100 CFD: the real spread from the file (median 0.0198R a trade, about 0.57 bp). Futures: exchange cost of 0.725 index points per round trip, scaled to price.
Data
- US100 CFD minute bid/ask, true clock 2005-2026
- LSE NQ futures 2016-2026
- NSX / SPX minute data 2010-2025 (paper-spec check)
The effect is real, and tiny
Without a stop, trading in the direction of the day earns +1.41 basis points a day over 21 years (t 2.87). The papers are right that the pattern exists.
A retail CFD spread costs about 0.57 basis points per round trip, and the stop and recent years take the rest. Net of cost the rule makes −0.008R a trade (t −0.78); at twice the cost, t −3.38. 2023, 2024 and 2025 are all negative.
Two data sources, one answer
Nasdaq futures from a second vendor, 2016 to 2026, at futures cost: −0.006R (t −0.42). The daily results of the CFD and the futures agree with a correlation of 0.975.
We also tested the papers' exact specifications in basis points at the real FTMO spread, 2010 to 2025. The Baltussen version (close to 15:30, hold the last 30 minutes) nets 0.00 bp on Nasdaq and +0.02 bp on the S&P. The Gao version (signal at 10:00) is negative on both.
A variant that looked better
One of our research agents tested a different window: the move from 10:00 to 15:00 predicting 15:00 to 16:00. On Nasdaq it nets +1.17 bp (t 1.78). At a stop of one standard deviation that is +0.030R a trade, below our +0.05R floor for adverse fills, and all of it came after 2018 (2010-2017 t −0.73). A period chosen after looking at the data is not a holdout.
The 12-gate scorecard
1 passed · 6 failed · 5 not run or not reached. A gate is "not reached" when the strategy had already failed a veto: there is nothing left for it to test.
Is the backtest real?
Absolute veto. These gates look for bugs and physical limits, not for statistical evidence, so one failure ends the test.
True clock; bar phase −3 to +3 minutes all flat or negative after cost; signal lagged 1 and 2 days checked.
Best variant (10:00-15:00 signal) is +0.030R a trade at a one-standard-deviation stop, below the +0.05R floor.
Is the edge more than luck?
G12, one pre-registered holdout, is the only statistical veto. G1 to G5 and the regime test G6 are always reported; G6 vetoes only a regime that is significantly negative. A strategy with no edge after costs never reaches G12, because there is nothing to confirm.
Net t −0.78 on 5,547 trades against a bar of 3.43.
Random signs, 10,000 draws: p 0.11. Always long or always short: t 0.63 and 0.67 before cost.
Gross +0.018R becomes −0.008R at 1x cost and −0.034R at 2x (t −3.38).
2023, 2024 and 2025 negative; the best years are 2007, 2008, 2020 and 2022.
Not pre-registered as a holdout, but the years after publication (2019-2026) are out of the authors' sample: t −0.44.
Can it survive a prop-firm account?
Absolute veto, for strategies meant for funded accounts. The account rules are simulated event by event, not at the end of the day.
A published effect is not a tradeable edge
Academic results are measured before costs, on futures or ETFs, often on close prices. A 1.4 bp effect against a 0.6 bp spread leaves a Sharpe ratio too small to survive a stop, a few bad years or a retail account.
Receipts
Every number on this page comes from one of these files: the test script, its saved output, the trade list and, where the test was pre-registered, the registration and its hash lock. Download them and check our work. Numbers that also appear in the chart are recomputed from the trade list when this page is built, and the build fails if they disagree.
| File | Kind | Size | Status | sha256 |
|---|---|---|---|---|
| IDMOM02_PREREG.md pillar2_hunt/IDMOM02_PREREG.md | Pre-registration | 4 KB | 4 lines withheld (private strategy) | add5fe58f493 |
| _idmom02.py pillar2_hunt/_idmom02.py | Script | 13 KB | 3 lines withheld (private strategy) | 11a56a5d0d94 |
| _idmom02.out pillar2_hunt/_idmom02.out | Saved output | 4 KB | 1 line withheld (private strategy); 7 lines withheld (data licence) | ef0bd88b412d |
| _baltussen_recheck_20261018.py experiments/_baltussen_recheck_20261018.py | Script | 5 KB | 1 line withheld (private strategy) | 11dc9e8ab509 |
| _baltussen_recheck_20261018.out experiments/_baltussen_recheck_20261018.out | Saved output | 2 KB | Complete | b984e4949d13 |
| ANTIGRAVITY_ZENOM_RUUJ_AUDIT_2026-10-18.md reports/2026-10/ANTIGRAVITY_ZENOM_RUUJ_AUDIT_2026-10-18.md | Report | Withheld: sections 2-3 are about the owner's prop-firm plan and live bot; the test's own output is published | ||
| _idmom02_trades_cfd.csv pillar2_hunt/_idmom02_trades_cfd.csv | Trade list | 864 KB | Prices removed (data licence) | afad587ca03c |
| _bar_boundary_audit_20261009.py _bar_boundary_audit_20261009.py | Lab module | Withheld: loads the code of the lab's private live strategy |
Price data is not included: the vendors' licences do not allow it, so the scripts run only with your own copy of the data, and the trade lists show dates, direction, R and costs, not prices. Lines that refer to the lab's private live strategy are replaced by a marker; the receipts page explains the rules and lists the sha256 of every original file.
Related tests
60/40 rebalancing pressure
A real flow effect from a 2025 NBER paper. Too small for an intraday trade after costs.
Nasdaq breakouts on high-fear days
Passed eleven of twelve gates, then lost money on the holdout nobody had seen.