Markets › Futures · ES futures (1-minute bars, US session)
Intraday Momentum Backtest: First Half-Hour to Last Half-Hour on ES Futures
Does the first half-hour of the US session predict the last one? We tested the rule on E-mini S&P 500 futures (ES), 2020 to 2026, with costs and a matched control.
Buried · No proven edgeThe first half-hour said nothing about the last.
Variants tried: 4 · Passed every gate: 0 · Holdout opened: yes (already used)
Short answer: not on ES futures from 2020 to 2026. We tested whether the first half-hour of the US session predicts the last half-hour, measured from the previous close and from the 09:30 open, long and short and long only. None of the four variants passed; each lost money before costs, and the signal did worse than the same signals moved to other days.How much costs took here, compared across all 54 of our tests →Did the same rules work on other markets? The cross-market scoreboard →
00The verdict in three lines
- "Intraday momentum" is a published result (Gao, Han, Li and Zhou, 2018): on the S&P 500, the return of the first half-hour of the US session, from the previous close to 10:00 New York, predicted the return of the last half-hour. We turned it into a rule (long or short for the last half-hour in the direction of the first) and tested it on ES futures from 2020 to 2026, measuring the first half-hour from the previous close and from the 09:30 open, long and short and long only, with the rules, costs, gates and a control fixed in a dated specification.
- None passed, and each variant lost money before costs (from -$15.67 to -$6.85 a trade), then more after $30.76 of costs a trade.
- The signal did not beat the same signals moved to other days (percentiles 20.6 to 38.8). On these years the first half-hour said nothing useful about the last. The same test on NQ: read the NQ post.
01What we tested
Signal at 10:00 New York: the price at 10:00 against a reference, either the close of the previous US session (OV, as in the paper, so the night is included) or the 09:30 open (RTH, the session only). Up: long; down: short (no trade in the long-only versions); unchanged: no trade. Trade: in at the open of the minute starting 15:30, out at the close of the minute ending 16:00; on early-close days the same half-hour before the exchange's earlier close. One contract, one trade a day at most. Days missing a needed minute have no trade.
Four variants: IM-ES-OV-LS, IM-ES-OV-L, IM-ES-RTH-LS, IM-ES-RTH-L. With the same four on NQ, eight variants of the idea were tried, so the protocol requires a development t-statistic of 2.5.
02Data and costs
E-mini S&P 500 futures (ES), NinjaTrader's back-adjusted 1-minute history, January 2020 to 25 September 2026 (back-adjustment shifts prices by constants at rolls, which changes no move inside a day). Periods: development 2020 to 2023, validation January 2024 to March 2025, holdout April 2025 to September 2026. These periods are not new: the same file and years were used by our earlier ES tests, so the holdout is reported as already used. Costs: $30.76 a trade ($5.76 commission plus one tick of slippage on each fill), $50 a point. Engine check: ih_selftest.js checked hand-built days (both signals, long, short, an unchanged price, an early close, a missing minute), the exchange calendar against the data, and all eight variants trade by trade against an independent re-implementation (ih_selftest_result.txt).
03Results
Dollars per contract. The 95% range is the Wilson interval for the win rate. The drawdown is on closed trades; a position lasts 30 minutes.
| Variant | First half-hour measured | Trades | Net after costs | Net per trade | Gross per trade | Winners (95% range) | Profit factor | Drawdown on closed trades | Verdict |
|---|---|---|---|---|---|---|---|---|---|
| IM-ES-OV-LS | from the previous close, long and short | 1,728 | -$64,991 | -$37.61 | -$6.85 | 45.3% (43% to 48%) | 0.84 | -$92,017 | Buried |
| IM-ES-OV-L | from the previous close, long only | 959 | -$37,661 | -$39.27 | -$8.51 | 44.8% (42% to 48%) | 0.82 | -$58,207 | Buried |
| IM-ES-RTH-LS | from the 09:30 open, long and short | 1,715 | -$76,078 | -$44.36 | -$13.60 | 45.1% (43% to 47%) | 0.82 | -$78,134 | Buried |
| IM-ES-RTH-L | from the 09:30 open, long only | 912 | -$42,341 | -$46.43 | -$15.67 | 44.3% (41% to 48%) | 0.79 | -$51,398 | Buried |
Cumulative net dollars per contract by month. * Holdout already used before this test.
By period
| Variant | Development 2020 to 2023 (trades) | Validation 2024 to Mar 2025 (trades) | Holdout* Apr 2025 to Sep 2026 (trades) | Development t | Validation PF |
|---|---|---|---|---|---|
| IM-ES-OV-LS | -$45,892 (1,025) | -$4,093 (320) | -$15,006 (383) | -2.08 | 0.94 |
| IM-ES-OV-L | -$31,379 (565) | -$1,511 (182) | -$4,771 (212) | -2.18 | 0.95 |
| IM-ES-RTH-LS | -$40,000 (1,020) | -$15,726 (317) | -$20,352 (378) | -1.82 | 0.79 |
| IM-ES-RTH-L | -$28,179 (541) | -$6,529 (157) | -$7,633 (214) | -2.11 | 0.81 |
Every variant lost in every period.
04The last half-hour on its own
Over the 1,736 days that could trade, the last half-hour of ES went up on 49.1% of them, with an average move of -0.08 points. Buying it every day would have ended at -$60,412 after costs. There was no steady drift for a signal to ride.
| Variant | Longs: trades / gross / net | Shorts: trades / gross / net |
|---|---|---|
| IM-ES-OV-LS | 959 / -$8,163 / -$37,661 | 769 / -$3,675 / -$27,329 |
| IM-ES-OV-L | 959 / -$8,163 / -$37,661 | – |
| IM-ES-RTH-LS | 912 / -$14,288 / -$42,341 | 803 / -$9,038 / -$33,738 |
| IM-ES-RTH-L | 912 / -$14,288 / -$42,341 | – |
05Is it the signal or the market?
The benchmark is a shifted-signal control: the series of daily signals (long, short or none) is moved by a random offset of at least 5% of the days, so the same mix of longs and shorts lands on other days, and applied to the real last half-hours with the same costs. 500 runs with fixed seeds; the bar is the 95th percentile of the average net result per trade.
| Variant | Trades | Real average per trade | Control median | Control 5th to 95th | Percentile (95 needed) |
|---|---|---|---|---|---|
| IM-ES-OV-LS | 1,728 | -$37.61 | -$31.74 | -$55.94 to -$6.17 | 35.4 |
| IM-ES-OV-L | 959 | -$39.27 | -$35.47 | -$56.70 to -$12.72 | 38.8 |
| IM-ES-RTH-LS | 1,715 | -$44.36 | -$31.28 | -$55.97 to -$6.53 | 20.6 |
| IM-ES-RTH-L | 912 | -$46.43 | -$34.98 | -$58.94 to -$11.72 | 21.2 |
Every variant sits in the lower half of the control: placed on its own days, the signal did slightly worse than on random days.
06The gates
| Variant | Trades | 1. PF ≥ 1.2 in validation | 2. ≥ 50 trades in each period | 3. t ≥ 2.5 on development | 4. Above the 95th percentile of the shifted-signal control | 5. Positive without the 10 best trades | 6. Holdout net positive (already used) |
|---|---|---|---|---|---|---|---|
| IM-ES-OV-LS | 1,728 | fail | pass | fail | fail | fail | fail |
| IM-ES-OV-L | 959 | fail | pass | fail | fail | fail | fail |
| IM-ES-RTH-LS | 1,715 | fail | pass | fail | fail | fail | fail |
| IM-ES-RTH-L | 912 | fail | pass | fail | fail | fail | fail |
07Verdict by variant
| Variant | Cause | Gates failed | Verdict |
|---|---|---|---|
| IM-ES-OV-LS | No proven edge | 1, 3, 4, 5, 6 | Buried |
| IM-ES-OV-L | No proven edge | 1, 3, 4, 5, 6 | Buried |
| IM-ES-RTH-LS | No proven edge | 1, 3, 4, 5, 6 | Buried |
| IM-ES-RTH-L | No proven edge | 1, 3, 4, 5, 6 | Buried |
No proven edge: negative before costs and below the control. Not tested: other years, volatility or news filters, other entry times, other sessions.
TWhat this shows, and what to take into your own tests
What the results show
- None of the four variants passed, and each lost money before costs as well as after: the first half-hour did not predict the last half-hour on ES from 2020 to 2026.
- The rule did worse than the same signals moved to other days (percentiles 20.6 to 38.8; 95 needed).
- The last half-hour itself was a coin toss: up on 49.1% of 1,736 days, with an average move of -0.08 points.
- Every variant also lost in the holdout.
What remains unknown
- Earlier years: the published result used S&P 500 ETF data from 1993 to 2013, which we do not have.
- Filters the paper and later work discuss, such as trading only on volatile days or around news.
- Other entry times, such as the half-hour before the last one.
Why it failed
A signal has to say something about what comes next before costs can matter. Here the sign of the first half-hour carried no information about the last half-hour: the gross result per trade was negative in all four variants, and the same signals placed on other days did slightly better.
What you can apply to your own tests
- Look at the result before costs first. If it is not positive, no cost assumption will rescue the idea.
- Test a published effect on the years after the paper. Effects found in one period often fade once they are known.
- Compare with the same signals moved to other days: it shows whether the signal or the market made the result.
A note on the numbers: drawdown figures are measured on closed trades unless a table says it includes open losses. Open losses inside a trade are not counted in a closed-trade drawdown, so real account risk is higher, especially for systems with no stop. Backtests are not live trading.
FAQCommon questions
Does the first half-hour predict the last half-hour on ES?
Not in our test. Trading the last half-hour in the direction of the first made -$64,991 (measured from the previous close) and -$76,078 (from the 09:30 open) per contract over 2020 to 2026, long and short, after costs, and both were negative before costs too.
What is intraday momentum?
A result published by Gao, Han, Li and Zhou (2018): on the S&P 500 ETF from 1993 to 2013, the return from the previous close to 10:00 New York predicted the return of the last half-hour of the session. We tested it as a trading rule on recent futures data.
How was intraday momentum tested?
On ES futures 1-minute data from 2020 to 2026, entering at 15:30 and exiting at the close, with rules written and dated before the data was run, costs included on every trade, results split into development, validation and holdout periods, a random-entry control as the benchmark, and every variant reported. Read the protocol.
08Check our arithmetic
ih_spec.md
ih_lib.js · ih_ref.js · ih_selftest.js · ih_run.js
control_audit_lib.js · em_lib.js · gh_lib.js · hourly_lib.js · ma_lib.js · rb_lib.js · rsi2_protocol.js
ih_selftest_result.txt · ih_ES_results.txt · ih_ES_summary.json
IM-ES-OV-LS · IM-ES-OV-L · IM-ES-RTH-LS · IM-ES-RTH-L
Code provenance: our own code, written from the rule described in the published paper. No third-party source code is used or published.
09Data notes
The ES file has known holes (data_holes.json). Days missing a minute the rule needs have no trade; removing the trades whose signal window or trade touches a known hole changes no verdict:
| Variant | Trades | Removed | Net per trade | Verdict |
|---|---|---|---|---|
| IM-ES-OV-LS | 1,728 | 14 | -$37.61 → -$38.72 | Buried → Buried |
| IM-ES-OV-L | 959 | 5 | -$39.27 → -$40.13 | Buried → Buried |
| IM-ES-RTH-LS | 1,715 | 1 | -$44.36 → -$44.02 | Buried → Buried |
| IM-ES-RTH-L | 912 | 0 | -$46.43 → -$46.43 | Buried → Buried |
10Corrections
None yet. 22 Oct 2026, navigation: added a link to the new guide comparing trading costs across all our tests. No result changed. 22 Oct 2026, navigation: added a link to the new cross-market scoreboard, which includes this test. No result changed. 22 Oct 2026, navigation: added a link to the new guide comparing trend following and mean reversion across all our tests. No result changed.
+More tests and guides
- Intraday momentum strategy nq
- RSI 2 strategy backtest
- Macd crossover strategy backtest
- Ema 9 21 crossover backtest
- Trend following vs mean reversion: this test next to the others of its style
- Free prop firm challenge calculator
- What all the backtests found so far
- The backtesting protocol
- How to backtest a trading strategy without fooling yourself
- Backtesting glossary