Why Are Spreads Wider at the Open? Real Data
Why are spreads wider at the open? Tick-level quotes price the opening premium half hour by half hour, show how fast it fades, and what premarket really costs.
Spreads are wider at the open than in almost any other stretch of the regular US session, and the thinner the stock the steeper the penalty. In the rolling window below, the first half hour of trading carried a median bid-ask spread 3.29x midday's on Etsy, a mid-cap, and 1.79x on Apple, while SPY, the most heavily quoted of the three, printed a pooled ratio of 1x, a flat line that turns out to be an artifact of the one-cent price grid, not a free open. This page times that clock from tick-level quotes.
What the spread costs a market order
Every stock shows two prices at once: the bid, the best standing offer to buy, and the ask, the best standing offer to sell. The gap between them is the bid-ask spread, and a market order, one that trades now at the best available price, pays it: buys fill at the ask, sells at the bid, and the difference goes to whoever posted the quote, usually a market maker. Two properties of that quote matter below: it runs on a clock whose expensive end is the morning, and it steps in whole cents, the tightest spread a high-priced ETF and a much cheaper mid-cap can show is the same penny.
The spread clock: one shape, three liquidity tiers
The chart follows three liquidity tiers: SPY, the S&P 500 ETF; Apple, a mega-cap; Etsy, a mid-cap. Every valid NBBO update, the market-wide best bid and offer your broker shows, unpacked in our NBBO explainer, in a recent multi-day window falls into a 30-minute bucket of the regular session, and each bucket's median spread is divided by that name's tightest, so 1 means as tight as the stock gets.
The exact SQL behind every number
SELECT et_time,
round(anyIf(rel, ticker = 'SPY'), 2) AS spy_x,
round(anyIf(rel, ticker = 'AAPL'), 2) AS aapl_x,
round(anyIf(rel, ticker = 'ETSY'), 2) AS etsy_x
FROM (
SELECT ticker,
et_time,
median_bps / min(median_bps) OVER (PARTITION BY ticker) AS rel
FROM (
SELECT ticker,
formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
quantileExact(0.5)(toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000) AS median_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
AND sip_timestamp >= toDateTime(today() - 14)
AND sip_timestamp < toDateTime(today() - 3)
AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
AND bid_price > 0
AND ask_price > bid_price
GROUP BY ticker, et_time
)
)
GROUP BY et_time
ORDER BY et_timeTextbooks call the intraday pattern a U: wide open, tight midday, wider into the close. Measured here it is a ski slope, for names whose spread has room to move. Etsy opened at 4.98x its tightest level, was down to 2.81x by 10:30 and 1.52x at lunchtime; Apple opened at 2.36x. For all three the tightest half hour is the last, 1x, 1x, 1x, so the re-widening traders associate with "the close" belongs to the extended session, past the closing auction.
SPY's line is flat: 1.01x in the opening bucket, 1x at lunch. Its median spread does not move all day. That is not the absence of an opening premium, it is the penny grid.
The penny grid: where the premium hides on the tightest names
SPY's median spread measures 2¢ at the open and 2¢ midday, the same two pennies, so its median has nothing left to say. The distribution underneath does. This panel counts, per half hour, the share of quote updates sitting at the one-cent minimum.
The exact SQL behind every number
SELECT et_time,
round(100 * countIf(ticker = 'SPY' AND spread_c <= 1.0001) / countIf(ticker = 'SPY'), 1) AS spy_pct_penny,
round(100 * countIf(ticker = 'AAPL' AND spread_c <= 1.0001) / countIf(ticker = 'AAPL'), 1) AS aapl_pct_penny,
round(100 * countIf(ticker = 'ETSY' AND spread_c <= 1.0001) / countIf(ticker = 'ETSY'), 1) AS etsy_pct_penny
FROM (
SELECT ticker,
formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
toFloat64(ask_price - bid_price) * 100 AS spread_c
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
AND sip_timestamp >= toDateTime(today() - 14)
AND sip_timestamp < toDateTime(today() - 3)
AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
AND bid_price > 0
AND ask_price > bid_price
)
GROUP BY et_time
ORDER BY et_timeSPY sat at the one-cent floor for 24.2% of its opening-half-hour updates against 36.3% in the final half hour; Apple, 3.3% against 23.1%; Etsy, 0.4% against 7.6%. Every name opens further from the floor than it finishes. On SPY the widening is real but unpriceable: its 90th-percentile opening spread measured 3¢ against 3¢ midday, 1x, the same ratio its median showed (1x). In the most liquid name on the tape the penny grid is coarse enough, over this window, to absorb the premium at the tail as well as at the median. What still registers is frequency: SPY's open was the wider of the two windows in 86% of sessions, and its worst morning opened at 2.01x its own midday. The premium is there; one cent is simply too big a unit to bill it in.
Why are spreads wider at the open?
Three conditions coincide in the opening half hour, and none survives to lunchtime.
- The overnight backlog lands at once. Between the 4:00 p.m. close and the next morning's opening auction, seventeen and a half hours of information pile up, earnings, guidance, overseas sessions, while continuous trading is dark. The first quotes follow the gap, not the prior close.
- Price discovery is still running. The auction compresses that backlog into one print; the market then spends minutes finding a range around it, and quotes re-price fastest while that search runs.
- The book is still filling in. Premarket trading runs with far fewer participants quoting, and the bell does not reset the book instantly.
What a halt does to the clock
A halt is the extreme form of the same mechanics. Under limit up-limit down (LULD) rules, a stock whose price runs outside a band around its recent average trips a five-minute pause; an exchange can also halt a name for news pending. Mid-halt there is no two-sided quote to cross, the one-sided or crossed book on screen is not a tradable market. Trading restarts through a reopening auction whose first quotes carry the backlog-and-discovery load of a 9:30 bell, compressed into minutes. A stock halted near the open pays the premium twice.
Premarket is a different market
The thin-book driver is usually asserted; this panel prices it, same names, same window, five phases of the day, in basis points (bps), hundredths of a percent of the share price, so names at different prices compare.
The exact SQL behind every number
SELECT phase,
round(quantileExact(0.5)(spy_b), 2) AS spy_bps,
round(quantileExact(0.5)(aapl_b), 2) AS aapl_bps,
round(quantileExact(0.5)(etsy_b), 2) AS etsy_bps
FROM (
SELECT multiIf(et_min >= 240 AND et_min < 420, 'Premarket 04:00-07:00',
et_min >= 420 AND et_min < 570, 'Premarket 07:00-09:30',
et_min >= 570 AND et_min < 600, 'Open 09:30-10:00',
et_min >= 720 AND et_min < 840, 'Midday 12:00-14:00',
et_min >= 960 AND et_min < 1200, 'After-hours 16:00-20:00', 'other') AS phase,
if(ticker = 'SPY', spread_bps, NULL) AS spy_b,
if(ticker = 'AAPL', spread_bps, NULL) AS aapl_b,
if(ticker = 'ETSY', spread_bps, NULL) AS etsy_b
FROM (
SELECT ticker,
toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60
+ toMinute(toTimeZone(sip_timestamp, 'America/New_York')) AS et_min,
toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000 AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
AND sip_timestamp >= toDateTime(today() - 14)
AND sip_timestamp < toDateTime(today() - 3)
AND bid_price > 0
AND ask_price > bid_price
)
WHERE phase != 'other'
)
GROUP BY phase
ORDER BY indexOf(['Premarket 04:00-07:00', 'Premarket 07:00-09:30', 'Open 09:30-10:00', 'Midday 12:00-14:00', 'After-hours 16:00-20:00'], phase)Premarket is not a worse open; it is a different market. Etsy's median quoted spread ran 508.12 bps between 4:00 and 7:00 a.m. ET and 475 bps from 7:00 to the bell, against 23.8 bps in the opening half hour and 7.23 bps midday, percentage points of the price, not pennies. Apple quoted 9.1 bps early against 1.17 bps midday; even SPY widened to 0.81 bps against 0.27 bps. After the 4:00 p.m. bell the width returns, 205.58 bps for Etsy, 5.83 bps for Apple.
The bill in cents: the open vs. midday
Costs arrive in cents. The table prices the same names, median spread over the opening half hour (9:30–10:00 a.m. ET) against midday (noon–2:00 p.m. ET), the 90th-percentile quote in each window, the quote-update counts, and the excluded one-sided, locked, or crossed quotes.
The exact SQL behind every number
SELECT ticker,
round(countIf(isNotNull(spread_cents)) / 1e6, 2) AS valid_updates_m,
round(quantileExactIf(0.5)(spread_cents, clock_min BETWEEN 810 AND 839), 2) AS open30_cents,
round(quantileExactIf(0.5)(spread_cents, clock_min BETWEEN 960 AND 1079), 2) AS midday_cents,
round(quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 810 AND 839), 2) AS open30_bps,
round(quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 960 AND 1079), 2) AS midday_bps,
round(quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 810 AND 839)
/ quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 960 AND 1079), 2) AS open_vs_midday_x,
round(quantileExactIf(0.9)(spread_cents, clock_min BETWEEN 810 AND 839), 2) AS open30_p90_cents,
round(quantileExactIf(0.9)(spread_cents, clock_min BETWEEN 960 AND 1079), 2) AS midday_p90_cents,
round(quantileExactIf(0.9)(spread_bps, clock_min BETWEEN 810 AND 839), 2) AS open30_p90_bps,
round(quantileExactIf(0.9)(spread_bps, clock_min BETWEEN 810 AND 839)
/ quantileExactIf(0.9)(spread_bps, clock_min BETWEEN 960 AND 1079), 2) AS p90_x,
toString(countIf(isNull(spread_cents))) AS dropped_onesided_locked_crossed
FROM (
SELECT ticker,
toHour(sip_timestamp) * 60 + toMinute(sip_timestamp) AS clock_min,
if(bid_price > 0 AND ask_price > bid_price, toFloat64(ask_price - bid_price) * 100, NULL) AS spread_cents,
if(bid_price > 0 AND ask_price > bid_price, toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, NULL) AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
AND sip_timestamp >= toDateTime(today() - 14)
AND sip_timestamp < toDateTime(today() - 3)
AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
)
GROUP BY ticker
ORDER BY indexOf(['SPY', 'AAPL', 'ETSY'], ticker)Cents per share and dollars per 100 shares are the same number, so the table is a bill: a 100-share round trip in Etsy at the median opening quote gives up $20 against $6 at midday quotes; Apple, $7 against $4. The premium climbs as the tape thins, 1x for SPY, 1.79x for Apple, 3.29x for Etsy, whose 0.2 million quote updates are a small fraction of Apple's 12.55 million. The tier swamps the clock: SPY's opening half hour, 0.27 bps, is tighter than Etsy's calmest midday (7.23 bps), whose worst-decile open measured 59.92 bps.
Does the premium show up every session?
Pooling days of quotes into one median answers a question about the window, not a morning. This panel re-computes the open-vs-midday ratio session by session: the typical session, the calmest, the worst, and the share whose open was wider at all.
The exact SQL behind every number
SELECT ticker,
count() AS sessions,
round(quantileExact(0.5)(ratio), 2) AS median_session_x,
round(min(ratio), 2) AS calmest_session_x,
round(max(ratio), 2) AS worst_session_x,
round(100 * countIf(ratio > 1) / count(), 0) AS pct_sessions_open_wider
FROM (
SELECT ticker,
toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS session_date,
quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 810 AND 839)
/ quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 960 AND 1079) AS ratio
FROM (
SELECT ticker,
sip_timestamp,
toHour(sip_timestamp) * 60 + toMinute(sip_timestamp) AS clock_min,
toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000 AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
AND sip_timestamp >= toDateTime(today() - 14)
AND sip_timestamp < toDateTime(today() - 3)
AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
AND bid_price > 0
AND ask_price > bid_price
)
GROUP BY ticker, session_date
HAVING countIf(clock_min BETWEEN 810 AND 839) > 0
AND countIf(clock_min BETWEEN 960 AND 1079) > 0
)
GROUP BY ticker
ORDER BY indexOf(['SPY', 'AAPL', 'ETSY'], ticker)Across 7 sessions, the open ran wider than midday in 86% of SPY's, 100% of Apple's and 100% of Etsy's. The typical session's premium: 1.49x for SPY, in the most liquid name on the tape, the penny grid keeps even a consistent widening near invisible, against 2.3x for Apple and 3.32x for Etsy, where the premium is unmistakable. Dispersion is the lesson: Etsy's calmest morning opened at 2.24x its own midday, its worst at 4.13x. An opening premium is an average and a tail, never a promise about tomorrow's 9:31.
A stress test: the MU morning of July 7, 2026
Rolling windows smooth away single mornings, so here is one pinned: Micron on Tuesday, July 7, 2026, inside the semiconductor break that day's recap walks through.
The exact SQL behind every number
WITH prev AS (
SELECT argMax(toFloat64(close), window_start) AS prev_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'MU'
AND window_start >= '2026-07-06 13:30:00'
AND window_start < '2026-07-06 20:00:00'
),
day AS (
SELECT argMin(toFloat64(open), window_start) AS day_open
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'MU'
AND window_start >= '2026-07-07 13:30:00'
AND window_start < '2026-07-07 20:00:00'
)
SELECT round((SELECT prev_close FROM prev), 2) AS prior_close,
round((SELECT day_open FROM day), 2) AS jul7_open,
round(((SELECT day_open FROM day) - (SELECT prev_close FROM prev)) / (SELECT prev_close FROM prev) * 100, 1) AS overnight_gap_pctMU closed at $984.31 and opened at $923.01, an overnight gap of -6.2%. Its spread clock that day:
The exact SQL behind every number
SELECT et_time,
median_spread_cents,
median_spread_bps,
round(100 * median_spread_cents / max(median_spread_cents) OVER (), 1) AS pct_of_widest,
dropped_onesided_locked_crossed
FROM (
SELECT formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price) * 100, bid_price > 0 AND ask_price > bid_price), 1) AS median_spread_cents,
round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price > bid_price), 1) AS median_spread_bps,
toString(countIf(NOT (bid_price > 0 AND ask_price > bid_price))) AS dropped_onesided_locked_crossed
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'MU'
AND sip_timestamp >= '2026-07-07 13:30:00'
AND sip_timestamp < '2026-07-07 20:00:00'
GROUP BY et_time
)
ORDER BY et_timeThe clock kept time. MU's opening half hour ran a median spread of 62¢, 6.7 bps on a stock opening at $923.01, the widest half-hour bucket of its session. One bucket later the median was 45¢, then 39¢ at noon and 38¢ in the last half hour. The premium arrived on schedule, and the liquidity tier still ruled: even here MU stayed tighter in percentage terms than Etsy's ordinary open (23.8 bps).
::: Data notes: window, filters, method
The SPY/Apple/Etsy panels roll: eleven calendar days of NBBO updates ending three days before the last refresh (clear of the feed's ingest lag). The regular-hours panels cut the session with a UTC minute-of-day filter on the summer (EDT) clock; the guard below checks it still lands on a 9:30 a.m. ET start at both ends of the window (570 is 9:30 a.m.), on the winter clock it trips and holds the page for rework. The phases panel converts to the Eastern clock directly, covering 4:00 a.m.–8:00 p.m. ET either way. One-sided (zero bid or ask) and locked or crossed (bid at or above ask) quotes are excluded throughout; session stability keeps only sessions quoting in BOTH windows. Medians and 90th percentiles are exact; the MU panels are pinned to July 6–7, 2026.
The exact SQL behind every number
SELECT toHour(toTimeZone(toDateTime(today() - 14) + toIntervalMinute(810), 'America/New_York')) * 60
+ toMinute(toTimeZone(toDateTime(today() - 14) + toIntervalMinute(810), 'America/New_York')) AS win_start_et_min,
toHour(toTimeZone(toDateTime(today() - 4) + toIntervalMinute(810), 'America/New_York')) * 60
+ toMinute(toTimeZone(toDateTime(today() - 4) + toIntervalMinute(810), 'America/New_York')) AS win_end_et_min:::
FAQ
What time of day are bid-ask spreads widest?
Premarket, Etsy's median quoted spread measured 508.12 bps between 4:00 and 7:00 a.m. ET against 7.23 bps midday. Inside regular hours the widest stretch is the first half hour after the open; the tightest, the last before the close.
Why does SPY's spread look flat at the open?
US stocks are quoted in whole cents, and SPY's median spread sits at 2¢ most of the day, too coarse a grid to register a small widening. Session by session its open still ran wider than its midday in 86% of sessions, and its 90th-percentile opening spread measured 3¢ against 3¢.
Is it bad to place a market order at the open?
It is among the most expensive stretches of the regular session for demanding immediacy, $20 against $6 on a 100-share Etsy round trip in the window above. A limit order caps that cost, at the risk of not filling, and an order that can wait may cross a narrower gap: Etsy's premium fell from 4.98x to 2.81x within an hour.
Do spreads widen again at the close?
Not within regular hours, the final half-hour bucket was the tightest of the day on all three names. That widening arrives after the 4:00 p.m. bell, in the thinner extended session: Apple quoted 5.83 bps there against 1.17 bps midday.
Do options spreads widen at the open too?
The panels here measure equity quotes only and claim nothing about options. The mechanics point the same way, an option's quote depends on the underlying stock's price, least settled in the first minutes, and our options-cost breakdown measures option spreads directly.
Every panel carries the SQL that produced it, swap in a ticker you trade and time its spread clock on the Strasmore terminal.