Is intraday momentum still alive?

Two published last-half-hour effects, retested on 1,085 sessions, 2022–2026

Published 2026-08-27 · Sample SPX regular session, 2022-04-14 to 2026-08-20, 1,085 trading days, one observation per day · Sources Gao, Han, Li, Zhou, "Market intraday momentum" (JFE 2018); Baltussen, Da, Lammers, Martens, "Hedging demand and market intraday momentum" (JFE 2021) · Data one-minute index prints and the 0DTE aggressor-signed volume grid from the public session files · Status replication — measurement, not a signal

Two peer-reviewed papers say the last half hour of the US session continues the day's direction. Gao, Han, Li and Zhou measured it on SPY 1993–2013: the first half hour predicts the last one. Baltussen, Da, Lammers and Martens widened it to sixty futures markets over 1974–2020: the rest-of-day return predicts the final thirty minutes, and they attribute the continuation to gamma-hedging demand — hedgers who are short gamma have to trade with the day's move into the close. Both samples end before 0DTE options became half the SPX tape. Ours starts there.

The unconditional effect is gone

For each session: r_rod, the log return from the open to thirty minutes before the close, and r_last, the log return of those final thirty minutes. One regression, one observation per day:

sampledaysslope of r_last on r_rodt
2022 (from Apr 14)175+0.009+0.4
2023250+0.002+0.1
2024252−0.016−0.7
2025249+0.016+1.0
2026 (to Aug 20)159−0.012−0.6
all1,085+0.006 ± 0.009+0.6

Flat overall, flat in every single year, signs alternating. Whatever carried the published effect — Baltussen et al.'s own story is hedging flow — it does not survive into the 2022–2026 regime as an unconditional pattern. Anyone still trading "the last half hour continues the day" on the index is trading a sample that ended before the market they are in existed.

The one place it still shows, and its caveats

Baltussen et al.'s mechanism makes a sharper prediction than their data could test: continuation should live where dealers are short gamma, and be absent — or revert — where they are long. They inferred the hedging state; the archive here carries a measured one: the 0DTE dealer book built by signing every print by its aggressor (the one construction of seven whose sign has predicted forward volatility out of sample). Interacting the slope with that book's sign at 15:30:

slopet
long-gamma closes (919 days)−0.017−1.5
added when the measured book is short (166 days)+0.055+3.1
same interaction with the OI-convention book−0.008−0.4

Under a short measured book the last half hour continues the day (net slope +0.038); under a long one it leans the other way; and the public open-interest convention sees none of this — the same split as every other measurement on this site: the tape-signed book carries information, the convention book decorates.

The caveats are load-bearing, so they go in the same section as the result. Short closes are only 15% of sessions — 166 days in four and a half years. The year-by-year interaction is positive all five years (+0.05, +0.01, +0.21, +0.04, +0.07) but the magnitude swings by an order of magnitude and 2024 dominates. And the final-40-session holdout contains just four short closes, so its headline t-statistic dissolves under leave-one-out. Five-for-five on sign is worth reporting; it is not worth a position. The unconditional death above is the robust finding; the conditional revival is the lead we publish so it can be checked, not a claim we defend.

What this is not

Not a trading rule and not advice — see the Terms. The conditional slope is an average over 166 days with real dispersion around it, and the transaction-cost question is not even reached here.

Reproduce it

Everything is in the public session files at https://gex.live/snapshots/YYYY-MM-DD.json (dates listed at /sessions; ~7 MB per day — please fetch sequentially). The unconditional half needs only minutes and spot:

pythonreproduce
s = np.array(day["spot"], float)
cut = len(s) - 31
r_rod, r_last = np.log(s[cut] / s[0]), np.log(s[-1] / s[cut])   # then OLS across days

The measured 0DTE book rebuilds from the same file: the vol block holds per-strike cumulative customer buys and sells (cb, cs, pb, ps) at five-minute frames, and each frames entry carries per-strike implied vols (ivc, ivp). Per frame: dealer position per strike is minus the customer net, Black–Scholes gamma from the frame's own IV, spot and time to 16:00, and the book is the gamma-weighted sum. Its sign at the frame at or before 15:30 is the conditioning dummy. Read the sign only from frames at or before the minute you condition on — the grids are cumulative, so reading a later frame is lookahead.

Part of gex.live research. Measured on the free session archive; every session is free to replay.