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.

ES futures · 1-minute bars, US session · Protocol v1.0 plus the 8 Oct 2026 rules

Buried · No proven edge

The first half-hour said nothing about the last.

BornRules, variants, costs and gates frozen 11 Oct 2026 (ih_spec.md), before any half-hour return was computed
Died11 Oct 2026

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.

VariantFirst half-hour measuredTradesNet after costsNet per tradeGross per tradeWinners (95% range)Profit factorDrawdown on closed tradesVerdict
IM-ES-OV-LSfrom the previous close, long and short1,728-$64,991-$37.61-$6.8545.3% (43% to 48%)0.84-$92,017Buried
IM-ES-OV-Lfrom the previous close, long only959-$37,661-$39.27-$8.5144.8% (42% to 48%)0.82-$58,207Buried
IM-ES-RTH-LSfrom the 09:30 open, long and short1,715-$76,078-$44.36-$13.6045.1% (43% to 47%)0.82-$78,134Buried
IM-ES-RTH-Lfrom the 09:30 open, long only912-$42,341-$46.43-$15.6744.3% (41% to 48%)0.79-$51,398Buried
-$50,000+$0202120222023202420252026validationholdout*IM-ES-OV-LSIM-ES-RTH-LS

Cumulative net dollars per contract by month. * Holdout already used before this test.

By period

VariantDevelopment 2020 to 2023 (trades)Validation 2024 to Mar 2025 (trades)Holdout* Apr 2025 to Sep 2026 (trades)Development tValidation PF
IM-ES-OV-LS-$45,892 (1,025)-$4,093 (320)-$15,006 (383)-2.080.94
IM-ES-OV-L-$31,379 (565)-$1,511 (182)-$4,771 (212)-2.180.95
IM-ES-RTH-LS-$40,000 (1,020)-$15,726 (317)-$20,352 (378)-1.820.79
IM-ES-RTH-L-$28,179 (541)-$6,529 (157)-$7,633 (214)-2.110.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.

VariantLongs: trades / gross / netShorts: trades / gross / net
IM-ES-OV-LS959 / -$8,163 / -$37,661769 / -$3,675 / -$27,329
IM-ES-OV-L959 / -$8,163 / -$37,661–
IM-ES-RTH-LS912 / -$14,288 / -$42,341803 / -$9,038 / -$33,738
IM-ES-RTH-L912 / -$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.

VariantTradesReal average per tradeControl medianControl 5th to 95thPercentile (95 needed)
IM-ES-OV-LS1,728-$37.61-$31.74-$55.94 to -$6.1735.4
IM-ES-OV-L959-$39.27-$35.47-$56.70 to -$12.7238.8
IM-ES-RTH-LS1,715-$44.36-$31.28-$55.97 to -$6.5320.6
IM-ES-RTH-L912-$46.43-$34.98-$58.94 to -$11.7221.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

VariantTrades1. PF ≥ 1.2 in validation2. ≥ 50 trades in each period3. t ≥ 2.5 on development4. Above the 95th percentile of the shifted-signal control5. Positive without the 10 best trades6. Holdout net positive (already used)
IM-ES-OV-LS1,728failpassfailfailfailfail
IM-ES-OV-L959failpassfailfailfailfail
IM-ES-RTH-LS1,715failpassfailfailfailfail
IM-ES-RTH-L912failpassfailfailfailfail

07Verdict by variant

VariantCauseGates failedVerdict
IM-ES-OV-LSNo proven edge1, 3, 4, 5, 6Buried
IM-ES-OV-LNo proven edge1, 3, 4, 5, 6Buried
IM-ES-RTH-LSNo proven edge1, 3, 4, 5, 6Buried
IM-ES-RTH-LNo proven edge1, 3, 4, 5, 6Buried

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

Frozen specificationRules, variants, costs, gates and control for ES and NQ, dated before any half-hour return was computed.
ih_spec.md
CodeThe engine, the independent re-implementation, the self-test and the run. Needs your own ES and NQ 1-minute files.
ih_lib.js · ih_ref.js · ih_selftest.js · ih_run.js
Shared code it usesThe futures loader, the exchange calendar, statistics and control helpers.
control_audit_lib.js · em_lib.js · gh_lib.js · hourly_lib.js · ma_lib.js · rb_lib.js · rsi2_protocol.js
ResultsSelf-test result, the console output of the run and all numbers as one file.
ih_selftest_result.txt · ih_ES_results.txt · ih_ES_summary.json
Trade logs (CSV)Every trade of every variant, in points and dollars.
IM-ES-OV-LS · IM-ES-OV-L · IM-ES-RTH-LS · IM-ES-RTH-L
Data recordFile hashes and the list of holes in the data.
data_manifest.md · data_holes.json

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:

VariantTradesRemovedNet per tradeVerdict
IM-ES-OV-LS1,72814-$37.61 → -$38.72Buried → Buried
IM-ES-OV-L9595-$39.27 → -$40.13Buried → Buried
IM-ES-RTH-LS1,7151-$44.36 → -$44.02Buried → Buried
IM-ES-RTH-L9120-$46.43 → -$46.43Buried → 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