The short answer

No, not at any size this test could see. Averaged over 18 stocks and index funds and over many days, no half hour of the trading day beat or trailed the day’s average half hour by as much as 2 basis points (a basis point is one hundredth of one percent).

The test could have caught a lead or lag of roughly 2.5 to 4.6 basis points, depending on the half hour, about four times in five if it were the same in both periods. Smaller ones cannot be ruled out.

One pattern held up in both periods we compared (through 2021, then 2022 to 2024): AAPL’s first half hour, mostly its first minute. It is before costs, and nothing here shows a trade could capture it. SPY and QQQ on their own showed no half hour that held up.

What to do with this

  • Read a time of day as context, not a forecast: at the sizes this test could see, no half hour moved reliably. This page measured clock time only, so it says nothing about walls, flips or regime at particular times of day.
  • Before you believe a time-of-day pattern, ask how many were tried and whether it held in later years. Here 2 of 234 cells (one stock in one half hour) passed the first window (through 2021), shuffled runs of the same search averaged 0.2 passing, and 1 held.
  • Do not read AAPL’s first half hour as a signal. Its plain average return was +7.6 basis points in 2022 to 2024, before costs, and GEXfreak’s earlier study, which this page re-measures, charges 10 basis points of cost per stock trade (4 per ETF trade), more than 7.6.
  • A log of your own on one ticker cannot settle this quickly: after 100 sessions (about 5 months), SPY’s average must reach 3.4 to 5.8 basis points before its 95% range leaves out zero, 1.8 to 3.1 times the largest all-ticker drift here.
REAL HISTORICAL DATA

Drift in each half hour of the trading day

18 tickers · 2016-09 to 2024-12

This figure measures recorded prices; no trade is placed or simulated.

Show
Drift, bps (dot: average; bar: 95% range)−4−20+2+409:3010:0010:3011:0011:3012:0012:3013:0013:3014:0014:3015:0015:30
  • Through 2021 (circle)
  • 2022 to 2024 (open diamond)
All 18 tickers together (equal weight, from May 1, 2018): no half hour passed the first window. The largest average move in either window was +1.9 bps at 14:30 to 15:00, in 2022 to 2024. The two windows had the same sign in 7 of 13 half hours. The smallest drift this search would have picked out about four times in five, if the same in both windows, was 2.5 to 4.6 bps depending on the half hour; a smaller drift is not ruled out.
All 18 tickers together: drift against the day’s average half hour, in bps, with the 95% range. 913 sessions in the first window and 746 in the second. A shaded row passed the first window.
Half hourThrough 20212022 to 2024
09:30 to 10:00+0.6 (−1.9 to 3.1)+0.6 (−2.1 to 3.2)
10:00 to 10:30+0.9 (−1.2 to 3.0)−1.0 (−3.4 to 1.3)
10:30 to 11:00−1.4 (−3.5 to 0.7)−1.1 (−3.1 to 0.9)
11:00 to 11:30+0.6 (−1.2 to 2.5)+1.1 (−0.7 to 2.9)
11:30 to 12:00+0.5 (−1.0 to 2.0)+0.6 (−0.9 to 2.2)
12:00 to 12:30+0.3 (−1.1 to 1.8)−1.8 (−3.4 to −0.1)
12:30 to 13:00+0.2 (−1.2 to 1.7)+0.3 (−1.1 to 1.7)
13:00 to 13:30−0.9 (−2.3 to 0.5)−0.6 (−2.1 to 0.9)
13:30 to 14:00−1.2 (−2.5 to 0.1)+1.1 (−0.5 to 2.6)
14:00 to 14:30+0.5 (−1.1 to 2.0)−1.2 (−3.0 to 0.5)
14:30 to 15:00+0.6 (−0.9 to 2.1)+1.9 (0.2 to 3.6)
15:00 to 15:30−0.7 (−2.2 to 0.9)+0.1 (−1.6 to 1.7)
15:30 to 16:00−0.1 (−2.5 to 2.3)+0.1 (−2.0 to 2.1)
The 2 cells, of 234, that passed the first window. Across all 234 cells the two windows had the same sign in 58%, at most a faint tendency: chance alone would give about half, and the cells move together, so they are not 234 separate tests.
CellThrough 20212022 to 2024Result
AAPL 09:30 to 10:00+9.7 (4.9 to 14.5)+6.8 (1.9 to 11.7)Held
BAC 15:30 to 16:00−4.2 (−6.6 to −1.9)−0.6 (−3.1 to 2.0)Did not hold

One recorded session, cut into half hours

09:3010:3011:3012:3013:3014:3015:30

SPY, Dec 31, 2024: the close of every minute, with a line where each half hour ends. The check-it-yourself steps below use this session.

Table, method and data source
  • Basis points (bps): one hundredth of one percent of the price. A half-hour's return is 10,000 times the natural log of its end price over its start price.
  • A half-hour's drift against that day's average half-hour: the half-hour's return minus the mean of the day's 13 half-hour returns, averaged over sessions. The first half-hour starts at the day's first print; each later one starts where the last ended; the last ends at the close of the 15:59 bar.
Data receipt: 15 sources, built 2026-09-28

Each source is fingerprinted with SHA-256, so a changed file changes the fingerprint. A single file shows its own hash; a source of several files shows one hash of their names and hashes.

  • The study's rules and code, frozen before any statistic was computed · 23d0b48dbb717a11…
  • The study's written report · 9e33eeac188856b7…
  • Study table: every ticker and half-hour, both windows · 23e47365805706eb…
  • Study table: all tickers together, by window · f82fef54588e8eb5…
  • Study table: all tickers together, by year · 4e21db8838c71753…
  • Study table: the held cell by year · 86c49ba460c031a0…
  • Study table: 500 shuffle runs · 90ee1c972eaa12af…
  • Study record of the run (settings, windows, sessions per ticker) · 8367eb60d1ddaa26…
  • Study record of sessions kept and dropped · 9ae89c3342efea76…
  • Study table: per-session half-hour returns · 8035dfadd8b0d8dc…
  • Study checks on the opening half-hour of one stock · 4136a2dd78830650…
  • Study table: the opening minute by ticker · 9a8f30754f6ece94…
  • Study check against a second price feed · 6f3c08d9d4aa8ca3…
  • Regular-hours one-minute bars, 18 tickers, 2016-09 to 2024-12 (1598 files) · deb806eb6d39822d…
  • Daily bar files with the early-close flags, 18 tickers (18 files) · 98614095c21931fe…

How we tested

This page re-measures an earlier GEXfreak study (“the study”), which reported 1 held cell of 234, from the recorded prices. We took 18 tickers (3 index funds, known as ETFs, and 15 stocks) and every one-minute price bar of the regular session, 09:30 to 16:00, from September 2016 to December 2024. We dropped sessions that were not full days (early closes, missing bars) and 24 January 2023, when opening prices were corrupt: 392 of 33,361 ticker-sessions (one ticker on one day), leaving 32,969. All-ticker figures average the tickers with equal weight, in basis points, from 1 May 2018, when every ticker has prices. Prices after 31 December 2024 were left unread.

The study’s record says its rules were fixed before any result was computed: years through 2021 are the first window and 2022 to 2024 the second. “Could see” means the size of a true drift, the same in both windows, that the study’s rule (pass the first window, then hold in the second) would pick out about four times in five.

As a check, we shuffled which half hour is which inside each day and ran the same search 500 times. At least one cell held in 5 of the 500 shuffled runs (1.0%): chance alone rarely produces a held cell.

Check it yourself with a spreadsheet

Your log tests one half hour of one ticker on your broker’s one-minute chart. Choose both before you look at any data, and keep one ticker per sheet: choosing after you see a pattern is how false leads are made.

Set the chart to one-minute bars, Eastern time, regular hours only (09:30 to 16:00), and skip half days and days with a missing bar. A half hour runs from C, the close of the bar just before it, to D, the close of its last bar: on a chart that stamps each bar with its start time, for 14:30 those are the 14:29 and 14:59 bars, and on one that stamps the end time, the 14:30 and 15:00 bars. For the 09:30 half hour, C is B.

Fill in every session your chart still shows, then add a row after each close. To check your formulas, type the worked row’s date and four prices into row 2 (a recorded day you will not find on a recent chart); results can differ in the last digit, because the recorded prices carry half cents.

Columns of the log
ColumnWhat to writeWhere it comes from
ASession dateCalendar
BFirst price of the day: the open of the 09:30 barBroker chart
CPrice where your half hour starts (see the set-up above). For the 09:30 half hour it is B, as in the study, which includes the first minute; to leave that minute out, use the close of the 09:30 barBroker chart
DPrice where your half hour ends: the close of its last barBroker chart
ELast price of the day: the close of the last bar (stamped 15:59, or 16:00 on an end-stamped chart)Broker chart
FHalf-hour return, bpsFormula in step 2
GThe day’s average half hour, bpsFormula in step 3
HDrift against the day’s average, bpsFormula in step 4

The steps

  • 1. After each close fill A to E. Worked row, SPY on 31 December 2024, the 09:30 half hour, from the recorded one-minute bars: A 2024-12-31, B 589.90, C 589.90, D 590.01, E 586.01.
  • 2. F2 =10000*LN(D2/C2), the half hour’s return in basis points. Worked row: +1.9.
  • 3. G2 =10000*LN(E2/B2)/13, because the day’s 13 half-hour returns add up to the whole day’s return. Worked row: 10000*LN(586.01/589.90)/13 is −5.1.
  • 4. H2 =F2-G2. Worked row: +7.0, so that day’s 09:30 half hour beat the day’s average half hour by 7.0 basis points.
  • 5. Read the log with =AVERAGE(H:H) and =COUNT(H:H); its 95% range runs from =AVERAGE(H:H)-1.96*STDEV.S(H:H)/SQRT(COUNT(H:H)) to the same with a plus, where STDEV.S is the spread: how far one session’s drift typically sits from the average. Worked check, AAPL 09:30 in 2022 to 2024: an average of +6.76 and a spread of 68.35 over 746 sessions give 1.9 to 11.7.
  • 6. Put your target drift in K1 (4 is the study’s ETF cost) and write =(1.96*STDEV.S(H:H)/K1)^2: the sessions after which an average of K1 just clears zero, though a true drift of that size would still be missed about half the time (2.8 in place of 1.96 gives four times in five). Worked, at K1 = 4 with SPY’s recorded spreads (17.2 at 12:30 to 29.4 at 15:30): 72 to 208 sessions.

What a small log can say

For scale, the largest all-ticker drift was +1.89 at 14:30 in 2022 to 2024, and SPY’s spread at 14:30 is 19.86: =(1.96*19.86/1.89)^2 is about 425 sessions (1.7 years at 249 sessions a year), and with 2.8 about 870 (3.5 years). For AAPL’s first half hour, average 6.76 and its 2022 to 2024 spread 68.35, it is about 393 sessions (1.6 years), or about 800 (3.2 years).

What a log of one ticker can see, from recorded spreads over all sessions (SPY’s 17.2 to 29.4 by half hour; AAPL’s first half hour 71.2). A true drift of exactly the size shown would still be missed about half the time. Time assumes one session a day, about 249 sessions a year
SessionsSmallest average that clears zero: SPY, by half hour (bps)Smallest average that clears zero: AAPL first half hour (bps)TimeWhat it lets you say
207.5 to 12.931.2about 1 monthCheck your spreadsheet against the worked row. The range is too wide to read: even SPY needs an average far above the largest all-ticker drift (1.9) to clear zero.
504.8 to 8.219.7about 2.5 monthsZero inside the range: no reading. Zero outside: the average is 2.5 to 4.3 times the largest all-ticker drift, so check the log for errors first.
1003.4 to 5.814.0about 5 monthsZero inside the range: drifts larger than its top end are unlikely. Zero outside: compare the low end with your cost (the study charges 4 for an ETF); above it, worth testing on sessions you have not used, below it, a drift smaller than the cost.

Limits

  • The tickers are 18 that GEXfreak chose, all still listed at the end of 2024; prices start in September 2016 for 8 and May 2018 for the other 10. They move together, so the 234 cells are not independent.
  • One split of the years, 31 December 2021, was chosen in advance and no other was tried. The last half hour ends at the 15:59 bar, so the closing auction is not measured.
  • What “could see” covers: the sizes above are worked from the recorded spreads, not from a trial with a planted drift. They assume the drift is the same in both windows and leave out the rule’s sign check, so read four in five as approximate. “No half hour drifted” means none at those sizes, not that none exists.
  • Prices for 10 of the 18 tickers (AAPL, DIA, DVN, IBM, INTC, MSFT, NKE, NVDA, PFE, VZ) come from single-venue feeds. The Opening minute view compares the opening minute with an all-exchange feed: AAPL’s matches closely and NKE’s does not (quoted from the study, not recomputed). DVN is missing 64 sessions in 2019.
  • AAPL’s result is before costs, depends on the name and is not shown to be tradable. Its plain return was +7.6 in 2022 to 2024, nearly all of it the first minute (+6.9; the other 29 minutes added +0.6); through 2021 the other 29 minutes added +5.2 of +10.5. The opening minute pointed the other way in 7 of the 18 tickers (negative for DVN, IBM, INTC, MSFT, PFE, UNH, VZ in 2022 to 2024), and this page proposes no reason for it. Fills at the opening cross were not measured, and a log that starts at the day’s first price measures the same first minute. The first-minute split and the opening-minute view were run after the results were in.
  • After the results were in, 3 half hours were flagged by eye, not by a rule set beforehand: 10:30 (−1.4, then −1.1: it pointed the same way in both windows); 12:00 (+0.3, then −1.8: its 2022 to 2024 range left out zero); 14:30 (+0.6, then +1.9: its 2022 to 2024 range left out zero). 12:00 changed sign between the windows. No correction was made for looking, so they are leads, not findings; choose the half hour for your own log before you look at your data.
  • SPY and QQQ on their own: no half hour passed the first window, and their largest 2022 to 2024 drifts were SPY +1.8 at 14:30 (0.0 through 2021) and QQQ +2.2 at 14:30 (+0.6 through 2021), against the 4 basis points per ETF trade that the study charged. Their own searches could see 2.1 to 3.8 for SPY and 2.7 to 4.9 for QQQ. Like the three above, these are leads.
  • Only prices and average direction by clock time were used, so a log split by walls, flips or regime has fewer sessions in each group and needs several times as many. Nothing here is a trade recommendation.

Sources and editorial notes

Read the primary references and editorial policy

Published by GEXfreak. Prism by GEXfreak is the chart product these guides describe. Every figure comes from recorded market history: prices, option open interest and recorded sessions. Where a figure shows trade results, the trades are back-tested, not placed. This is product education, not independent investment research.

Each figure lists its data sources and their SHA-256 fingerprints under “Table, method and data source”. The references below explain the statistics and the disclosure wording used on this page. They do not endorse GEXfreak or these studies.

For the product’s calculation and data boundaries, read Prism’s methodology.

All resources
REAL PRICES · REBUILT LEVELS · BACK-TESTED TRADES

How many trades until you know?

Four times the trades halve the doubt.
±0.0±0.2±0.4±0.6±0.8±1.020501002005001,0002,000All trades, 15:45: 312 trades, ±0.23RThrough 28 March 2023 (fallback prices): 222 trades, ±0.29RFrom 29 March 2023 (native prices): 90 trades, ±0.37RQuarterly months (Mar, Jun, Sep, Dec): 102 trades, ±0.36ROther months: 210 trades, ±0.31RAAPL: 49 trades, ±0.48RINTC: 29 trades, ±0.74RMSFT: 60 trades, ±0.46RNKE: 26 trades, ±0.65RNVDA: 71 trades, ±0.42RTSLA: 49 trades, ±0.54R
11 measured 95% ranges · one rule, rebuilt at the 5-minute mark · gold line: ±3.6/√trades
REAL PRICES · BACK-TESTED TRADES

The best of 480 backtests

5 passed the pass mark. Then we adjusted for the number tried.
480 versions · 12 stocks · 2021–2024 · white: passed · red: failed · grey: under 30 trades
REAL HISTORICAL DATA

The last 15 minutes of month-end

78 month-ends · SPY and QQQ · before the closing cross
818111912201221122212231124
Month-ends counted per year, May 2018 to December 2024 · minute prices, not levels
REAL HISTORICAL DATA

Beat the naive trade first

What the stock paid anyway.
9 stocks · 2018–2024 · bar: share of five-session windows that ended higher · dashed line: half · price only
REAL PRICES · REBUILT LEVELS

How often price reaches a wall

Distance sets how often.
0%25%50%75%100%00.511.522.5
QQQ · 1,671 sessions · dashed line: a plain price · dots: call walls in force at 09:36
REAL HISTORICAL DATA

The last half hour of the day

1,656 SPY sessions · 1,659 QQQ sessions · before the closing cross
16618248192472025021250222462324924
Sessions counted per year, May 2018 to December 2024 · solid: the two periods compared · minute prices, not levels

Check a level on your own chart.

Membership is required for live SPY, QQQ and IWM books. The figures on this page are recorded history, not a live book.

Create an account to save your layout; review current access conditions on the pricing page.