Why stocks dey gap up or down overnight?
Gap na di distance from yesterday close to 9:30 open after 17.5 hours wey market dey closed. SPY overnight gap size, Monday dey widest, plus di stop risk wey dey inside.
Gap na di distance between where one stock close for one session and where e open for di next one — na jump for price chart wey no get regular-hours trades for inside. Stocks dey gap up or down overnight because of one structural reason: exchanges dey run 6.5-hour session, and di other 17.5 hours still dey produce earnings, news, overseas trading and thin extended-hours prints. All of dem land for di next morning open at once. Dis page dey measure gaps instead of just talk say dem dey: every SPY session for H1 2026, five household stocks beside di index, and one 8%-plus overnight move wey dem catch as e dey form before di bell.
Wetin be gap up or gap down?
Gap up na when today open price pass yesterday regular-session close. Gap down na when e dey below am. The open wey we dey talk na the 9:30 a.m. ET open, wey the opening auction set. That auction go gather all the overnight orders wey don pile up and clear dem for one single price. Between the prior close and that auction, after-hours and premarket trading dey really print real trades, but the volume small well well compare to regular session. So the official open na the first time wey the market full weight go talk, and na there dem dey measure the gap.
Price discovery no dey ever stop completely: index futures dey trade almost round the clock, overseas markets dey set levels while New York dey sleep, premarket dey run from 4:00 a.m. ET. By 9:30, the auction no dey guess — e just dey ratify the level wey the overnight venues don already sketch.
How big normal overnight gap dey?
For H1 2026, every session of SPY, wey be the S&P 500 ETF, dem split am into overnight (from prior close to open) and intraday (from open to close) parts:
The exact SQL behind every number
SELECT count() AS sessions,
round(avg(abs(100 * (rth_open - prior_close) / prior_close)), 2) AS avg_abs_overnight_gap_pct,
round(avg(abs(100 * (rth_close - rth_open) / rth_open)), 2) AS avg_abs_intraday_move_pct,
countIf(abs(100 * (rth_open - prior_close) / prior_close) >= 0.5) AS gaps_of_half_pct_or_more
FROM (SELECT day, rth_open, rth_close, lagInFrame(rth_close) OVER (ORDER BY day) AS prior_close
FROM (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMinIf(toFloat64(open), window_start, rth) AS rth_open,
argMaxIf(toFloat64(close), window_start, rth) AS rth_close
FROM (
SELECT window_start, open, close,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York') AS rth
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= '2025-12-29 04:00:00'
AND window_start < '2026-07-01 08:00:00'
)
GROUP BY day
))
WHERE day >= '2026-01-01' AND prior_close > 0 AND isFinite(prior_close)Across 123 sessions, SPY average absolute overnight gap na 0.45%, against average absolute open-to-close move of 0.53%: the overnight jump wey you no fit trade almost reach the size of the whole tradeable day wey dey follow. Gap of half percent or more happen 41 times — roughly one session out of three.
Stocks dey gap more for Monday?
Monday open get bad name: weekend dey stretch di same mechanics across 65 closed hours instead of 17.5. We fit test dis tori. Every SPY session from January 2024 reach June 2026, we sort am into weekdays, with di average absolute gap and di 90th percentile — na di size wey only one open in ten fit pass. (If Monday na holiday, e push im weekend gap go Tuesday open, we go count am under Tuesday.)
The exact SQL behind every number
SELECT ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'][dow] AS weekday,
count() AS sessions,
round(avg(abs(gap_pct)), 2) AS avg_abs_gap_pct,
round(quantileDeterministic(0.9)(abs(gap_pct), toUInt64(toYYYYMMDD(day))), 2) AS p90_abs_gap_pct
FROM (
SELECT day, toDayOfWeek(day) AS dow,
100 * (rth_open - prior_close) / prior_close AS gap_pct
FROM (
SELECT day, rth_open, lagInFrame(rth_close) OVER (ORDER BY day) AS prior_close
FROM (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMinIf(toFloat64(open), window_start, rth) AS rth_open,
argMaxIf(toFloat64(close), window_start, rth) AS rth_close
FROM (
SELECT window_start, open, close,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York') AS rth
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= '2023-12-28 04:00:00'
AND window_start < '2026-07-01 08:00:00'
)
GROUP BY day
)
)
WHERE day >= '2024-01-01' AND prior_close > 0 AND isFinite(prior_close)
)
WHERE dow <= 5
GROUP BY dow
ORDER BY dowDi tori still stand after we check di data. Monday average absolute gap across 119 Mondays na 0.52% — e wide pass all di five weekdays, against 0.36% for Tuesday, 0.39% Wednesday, 0.45% Thursday and 0.39% Friday. Di tail na where weekend show im power well well: Monday 90th-percentile gap na 1.11% against Tuesday own wey be 0.73%. Di effect dey real but e small — Monday open na wider distribution, no be different thing, and nothing here dey talk about which direction.
Di biggest gaps for H1 2026
Di six biggest SPY overnight gaps for dis half, plus wetin di rest of each day do:
The exact SQL behind every number
SELECT concat(monthName(day), ' ', toString(toDayOfMonth(day)), ', ', toString(toYear(day))) AS session,
round(100 * (rth_open - prior_close) / prior_close, 2) AS overnight_gap_pct,
round(100 * (rth_close - rth_open) / rth_open, 2) AS rest_of_day_pct
FROM (SELECT day, rth_open, rth_close, lagInFrame(rth_close) OVER (ORDER BY day) AS prior_close
FROM (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMinIf(toFloat64(open), window_start, rth) AS rth_open,
argMaxIf(toFloat64(close), window_start, rth) AS rth_close
FROM (
SELECT window_start, open, close,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York') AS rth
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= '2025-12-29 04:00:00'
AND window_start < '2026-07-01 08:00:00'
)
GROUP BY day
))
WHERE day >= '2026-01-01' AND prior_close > 0 AND isFinite(prior_close)
ORDER BY abs(overnight_gap_pct) DESC, day
LIMIT 6Di biggest one happen for April 8, 2026: SPY open 2.6% away from di previous close, den e move -0.08% from open to close. Di whole day repricing don happen before di first regular-hours trade — di practical lesson of gaps be say market fit reprice without you.
One number wey no get story na half number. Every SPY-tagged headline wey dem publish between April 7 close and April 8 open:
The exact SQL behind every number
SELECT formatDateTime(toTimeZone(published_utc, 'America/New_York'), '%b %d %H:%i') AS et_published,
JSONExtractString(toString(publisher), 'name') AS source,
substring(title, 1, 80) AS headline
FROM global_markets.stocks_news
WHERE published_utc >= toDateTime('2026-04-07 16:00:00', 'America/New_York')
AND published_utc < toDateTime('2026-04-08 09:30:00', 'America/New_York')
AND has(tickers, 'SPY')
ORDER BY published_utc
LIMIT 10Two headlines carry across those closed hours, both on one US-Iran ceasefire, timestamped Apr 08 03:28 ET and Apr 08 08:58 ET — before di bell, on one shut market. Di gap na di accounting entry for news wey arrive when you no fit trade.
Singles stocks dey gap pass index?
One index ETF dey hold hundreds of companies, so di overnight surprises wey dem get dey partly cancel each other. One single stock no get dat kind cushion. Five big-name stocks wey dey next to SPY, same sessions:
The exact SQL behind every number
SELECT ticker,
count() AS sessions,
round(avg(abs(gap_pct)), 2) AS avg_abs_gap_pct,
round(argMax(gap_pct, (abs(gap_pct), day)), 2) AS biggest_gap_pct,
concat(monthName(argMax(day, (abs(gap_pct), day))), ' ', toString(toDayOfMonth(argMax(day, (abs(gap_pct), day)))), ', ', toString(toYear(argMax(day, (abs(gap_pct), day))))) AS biggest_gap_day
FROM (
SELECT ticker, day, 100 * (rth_open - prior_close) / prior_close AS gap_pct
FROM (
SELECT ticker, day, rth_open,
lagInFrame(rth_close) OVER (PARTITION BY ticker ORDER BY day) AS prior_close
FROM (
SELECT ticker, toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMinIf(toFloat64(open), window_start, rth) AS rth_open,
argMaxIf(toFloat64(close), window_start, rth) AS rth_close
FROM (
SELECT ticker, window_start, open, close,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York') AS rth
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'KO', 'AAPL', 'MSFT', 'NVDA', 'TSLA')
AND window_start >= '2025-12-29 04:00:00'
AND window_start < '2026-07-01 08:00:00'
)
GROUP BY ticker, day
)
)
WHERE day >= '2026-01-01' AND prior_close > 0 AND isFinite(prior_close)
)
GROUP BY ticker
ORDER BY indexOf(['SPY', 'KO', 'AAPL', 'MSFT', 'NVDA', 'TSLA'], ticker)Read di two columns separately. For di typical night, di ranking na wetin you fit guess: Tesla average na 1.05% and Nvidia na 0.99%, against SPY own wey be 0.45% — but Coca-Cola average na 0.42%, wey dey below di index — one steady consumer mega-cap na quiet overnight instrument for most nights.
Di tail column na where di cushion disappear. SPY im single biggest gap for di half na 2.6% (April 8, 2026), and all five single stocks beat am: Coca-Cola 5.41%, Apple 2.82%, Nvidia 3.6%, Tesla 4.97% — and Microsoft, di biggest among dem, na -8.66% for January 29, 2026. Single stocks no always dey noisier pass di index for average night, but dia worst night dey worse well well.
De watch as gap dey form before di bell
Rewind Microsoft im January 29, 2026 gap. Di session wey pass close for $481.72; anytin wey land afta dat close land for market wey don shut, and by 4:00 a.m. Eastern Time premarket open, di repricing don already happen:
The exact SQL behind every number
WITH day_vol AS (
SELECT sum(toFloat64(volume)) AS rth_vol
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'MSFT'
AND window_start >= toDateTime('2026-01-29 09:30:00', 'America/New_York')
AND window_start < toDateTime('2026-01-29 16:00:00', 'America/New_York')
),
prior AS (
SELECT round(argMax(toFloat64(close), window_start), 2) AS prior_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'MSFT'
AND window_start >= toDateTime('2026-01-28 09:30:00', 'America/New_York')
AND window_start < toDateTime('2026-01-28 16:00:00', 'America/New_York')
),
buckets AS (
SELECT toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 minute) AS bucket,
round(argMax(toFloat64(close), window_start), 2) AS price,
sum(toFloat64(volume)) AS shares
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'MSFT'
AND window_start >= toDateTime('2026-01-29 04:00:00', 'America/New_York')
AND window_start < toDateTime('2026-01-29 09:30:00', 'America/New_York')
GROUP BY bucket
)
SELECT formatDateTime(bucket, '%H:%i') AS et_time,
price,
(SELECT prior_close FROM prior) AS prior_close,
round(100 * (price - (SELECT prior_close FROM prior)) / (SELECT prior_close FROM prior), 2) AS vs_prior_close_pct,
round(abs(100 * (price - (SELECT prior_close FROM prior)) / (SELECT prior_close FROM prior)), 2) AS pct_below_prior_close,
round(shares / 1000) AS shares_thousands,
round(sum(shares) OVER (ORDER BY bucket) / 1000000, 2) AS cum_shares_millions,
round(100 * sum(shares) OVER (ORDER BY bucket) / (SELECT rth_vol FROM day_vol), 2) AS cum_pct_of_regular_volume
FROM buckets
ORDER BY bucketDi first premarket bucket, 04:00 ET, don already print $454, wey be 5.75% below di close wey pass, on 128 thousand shares. Di next five hours just dey shuffle; by di final premarket bucket (09:00 ET) di price stand 8.71% below di close, and di official open land for -8.66% — within rounding error of wetin 4.86 million overnight shares don already decide.
Check di last column: all of premarket carry 4.31% of wetin di regular session go trade. Gap wey big like dis, na small volume for dark go price am, and di full market go confirm am by 9:30. Dat thinness na why spreads dey widest around di open.
Wetin di options market charge for dat night
Options dey show wetin di market expect di move go be, before e happen. One straddle — wey be di call plus di put for one strike and expiry — cost roughly wetin di market tink di stock go move for any direction by expiry. Microsoft near-di-money straddles, wey dem quote for di last 15 minutes before di January 28 close, wey dey expire two days later:
The exact SQL behind every number
WITH prior AS (
SELECT round(argMax(toFloat64(close), window_start), 2) AS prior_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'MSFT'
AND window_start >= toDateTime('2026-01-28 09:30:00', 'America/New_York')
AND window_start < toDateTime('2026-01-28 16:00:00', 'America/New_York')
),
quotes AS (
SELECT toFloat64(substring(ticker, 14, 8)) / 1000 AS strike,
substring(ticker, 13, 1) AS cp,
round(argMax((bid_price + ask_price) / 2, sip_timestamp), 2) AS mid
FROM global_markets.cache_options_quotes
WHERE ticker LIKE 'O:MSFT260130%'
AND sip_timestamp >= toDateTime('2026-01-28 15:45:00', 'America/New_York')
AND sip_timestamp < toDateTime('2026-01-28 16:00:00', 'America/New_York')
AND bid_price > 0
AND ask_price > 0
GROUP BY ticker
)
SELECT concat('$', toString(strike)) AS strike_price,
maxIf(mid, cp = 'C') AS call_mid,
maxIf(mid, cp = 'P') AS put_mid,
round(maxIf(mid, cp = 'C') + maxIf(mid, cp = 'P'), 2) AS straddle_cost,
round(100 * (maxIf(mid, cp = 'C') + maxIf(mid, cp = 'P')) / (SELECT prior_close FROM prior), 2) AS implied_move_pct
FROM quotes
WHERE abs(strike - (SELECT prior_close FROM prior)) <= 5
GROUP BY strike
HAVING countIf(cp = 'C') > 0 AND countIf(cp = 'P') > 0
ORDER BY strikeDi strike wey near di $481.72 close, $482.5, go out for $25.69 for di pair — 5.33% of di share price, and dat na di priced move for two full sessions, no be one night. Di overnight gap alone come in for -8.66%. Di options market get one number and di night beat am — and di neighbouring strikes agree (5.37% for $477.5, 5.37% for $485), so dis na consensus, no be one rogue quote.
Two mechanics dey follow for anybody wey hold options through one gap. One option no fit reprice while market dey shut — di clock dey run against long premium, and di whole move dey arrive for di opening print. And once di event don comot, di uncertainty dey leave di price with am: implied volatility dey collapse di morning after one release, na why one correctly-called direction fit still lose money for one long option. Days to expiry decide how violently both dey bite.
Types of gaps: di chart-pattern vocabulary
Traders dey name gaps based on where dem show for inside one longer move. Di names na just description, dem dey apply am after di thing don happen, and none of dem be forecast:
- Common (area) gap — na small gap wey dey inside ordinary range, no special news. Most SPY gaps wey dey below half-percent na dis kind.
- Breakaway gap — price jump comot from one range or pass through one level wey don tey, e dey usually happen with heavy volume.
- Runaway (continuation) gap — na gap wey dey mid-trend, for di direction wey di stock dey go before.
- Exhaustion gap — na gap for di trend direction wey show for di end of di run, after dat one price go turn. For di day wey e happen, e look exactly like runaway gap; na only later data fit separate dem.
Di last pair na di honest catch: di label depend on wetin go happen next, so nobody dey name am for real time.
Wetin gap mean for your orders
Three consequences, all of dem dey come from di fact say no regular-hours trading dey happen inside di gap:
- Stop orders no dey stop di loss for di stop price. A stop dey turn to market order once di stock trade for di trigger price or pass am. If a stock close for $50 and open for $44, a $48 stop go trigger for open and fill near $44 — di gap just jump pass am. Di stop dey guarantee di attempt, not di level; a stop-limit order dey cap di price wey you go accept, but di risk be say e fit no fill at all.
- Halts, not gaps, na im be di market brake. Limit up-limit down (LULD) bands dey stop a stock from printing more dan a set percentage from im recent average price — 5% or 10% for most names, e wide pass for low-priced ones, e double for open and close — and if di move continue outside di band, e dey trigger five-minute pause. Market-wide circuit breakers dey halt everything if di S&P 500 fall 7% (Level 1) or 13% (Level 2) from di prior close, and e go shut di day for 20% (Level 3). None of dis dey prevent di gap; e dey control wetin dey happen once trading resume.
- "Gap fill" na description, no be schedule. Traders dey talk say gap don "fill" when price return to di prior close. Nothing dey force am to do so, for any timeframe. SPY im biggest gap day of di half move just -0.08% after di open: no fill, no fade, just new level.
Overnight and intraday, statistically, na different markets — na also why how dem dey measure monthly returns dey change di answer depend on weda dem count di overnight jumps.
FAQ
Wetin dey make stock gap up or down overnight?
Market dey close for 17.5 hours out of every 24 hours and information no dey stop: earnings fit land after close, news fit break before open, overseas markets dey trade all night. The opening auction go clear all the orders wey don gather for one price; the distance from the prior close na im be the gap.
How common be overnight gaps?
E dey everywhere. For H1 2026, SPY average absolute overnight gap na 0.45%, and 41 of 123 sessions open at least half a percent from the prior close. Single stocks dey move bigger: Tesla average na 1.05%.
Stock dey gap more on Mondays?
Small, yes. From January 2024 reach June 2026, SPY average absolute Monday gap na 0.52% — e be the widest weekday, against 0.36% on Tuesday. The weekend just dey add closed hours, no be direction.
Gap dey always fill?
No. "The gap always fills" na trading folklore: some go fill within hours, others no go ever revisit the prior close. Treat any fill statistic as description of wetin don happen for past sessions, no be rule about the next one.
Wetin go happen to my stop-loss if stock gap down?
The stop go trigger at the open and fill for whatever price the market offer, wey fit dey far below the stop price — the gap no get any trades to catch am.
Every number wey dey up na stored query — expand the SQL under any panel, or split any ticker month into overnight and intraday moves on the Strasmore terminal.