Average move between the 4:00 p.m. close and 5:30 p.m. ET
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-08-22, from Broker Exercise Cut-Off Times Explained.
| ticker | friday_count | avg_abs_drift_pct | max_abs_drift_pct |
|---|---|---|---|
| TSLA | 21 | 0.266 | 0.87 |
| NVDA | 21 | 0.188 | 1.25 |
| AAPL | 21 | 0.157 | 0.5 |
| KO | 21 | 0.139 | 0.77 |
| MSFT | 21 | 0.13 | 0.42 |
| SPY | 21 | 0.11 | 0.7 |
- Rows × columns
- 6 × 4
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
ticker |
text | 6 distinct values (AAPL, KO, MSFT…) | |
friday_count |
number | every row is 21 | count |
avg_abs_drift_pct |
number | 0.11 to 0.266 | percent |
max_abs_drift_pct |
number | 0.42 to 1.25 | percent |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
the exact SQL behind every number
SELECT
ticker,
count() AS friday_count,
round(avg(drift_pct), 3) AS avg_abs_drift_pct,
round(max(drift_pct), 2) AS max_abs_drift_pct
FROM
(
SELECT
ticker,
session_date,
abs(100 * (argMaxIf(px, ts, et_minute >= 960 AND et_minute < 1050)
/ argMaxIf(px, ts, et_minute >= 570 AND et_minute < 960) - 1)) AS drift_pct
FROM
(
SELECT
ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) AS et_minute,
toFloat64(close) AS px,
window_start AS ts
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AAPL', 'KO', 'MSFT', 'NVDA', 'SPY', 'TSLA')
AND window_start >= today() - 730
AND toDayOfWeek(toDate(toTimeZone(window_start, 'America/New_York'))) = 5
AND toDayOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) BETWEEN 15 AND 21
)
GROUP BY ticker, session_date
HAVING countIf(et_minute >= 960 AND et_minute < 1050) > 0
AND countIf(et_minute >= 570 AND et_minute < 960) > 0
)
GROUP BY ticker
ORDER BY avg_abs_drift_pct DESC
Run your own version of this
The same 22 years of US equities and 12 years of options data are queryable in SQL or plain English. A free account runs 100 queries a day and takes no card.
More from this analysisBroker Exercise Cut-Off Times Explained
Monthly expirations where the post close print crossed a whole dollar
ranking 6×3
→
How close expiring AAPL contracts finish to the strike
ranking 6×2
→
NVDA on July 17, 2026: the close and the post close window
table 30×3
→
Friday close to Monday's first minute: absolute overnight move, 2023 to July 2026
ranking 8×4
→
Absolute move over the final 30 minutes of Friday sessions, 2023 to July 2026
ranking 8×4
→
Cash behind one contract: 100 shares at each name's close in the last week of July 2026
ranking 8×2
→
See all 2,170 queries →