Strasmore Research
Learn Matt ConnorBy Matt Connor · Updated 2026-07-09 · data as of July 9, 2026 · refreshed weekly

Why Are Spreads Wider at the Open? Real Data

Why are spreads wider at the open? Median bid-ask spreads by half hour show the opening premium, when it fades, and what a market order pays to cross it.

Spreads are wider at the open than at almost any other stretch of the regular US session. In the multi-day window below, the first half hour carried median bid-ask spreads above each stock's own midday level — from 1.5x on SPY to 4x on Etsy — with the thinnest name paying the most. This page measures that clock from tick-level quote data: what the open costs, when the premium fades, and what a hard gap morning does to it.

What the spread costs a market order

Every listed 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 — an order that trades right now at the best available price — pays it: buys fill at the ask, sells fill at the bid. A hypothetical stock quoted $20.00 bid / $20.05 ask bills a nickel per share on a round trip, and that nickel goes to whoever posted the quote — most often a professional market maker.

The spread is not one number, though — it runs on a clock, and the expensive end of that clock is the morning.

The spread clock: one shape, three liquidity tiers

The chart below follows three securities from different liquidity tiers: SPY, the S&P 500 ETF; Apple, a mega-cap stock; and Etsy, a mid-cap. For each name, every valid NBBO update — the market-wide best bid and offer your broker shows — in a recent multi-day window is sorted into 30-minute buckets of the regular session (9:30 a.m.-4:00 p.m. Eastern Time), and each bucket's median spread is divided by the name's tightest bucket, so 1 means as tight as the stock gets.

QueryMedian spread each half hour, as a multiple of each name's tightest bucket (regular hours, ET)
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_time

Textbooks call the intraday spread pattern a U: wide open, tight midday, wider into the close. Measured here, the shape is closer to a ski slope. Etsy opened at 6.99x its tightest level, was down to 2.79x by the 10:30 bucket, and the lunchtime 12:30 bucket sat at 1.78x; Apple opened at 2.52x; even SPY spent the first hour elevated, at 1.5x its floor in the opening bucket and 1.5x in the next. The final half hour, far from re-widening, sat at or near each name's tightest: 1x for SPY, 1x for Apple, 1x for Etsy. The widening most traders associate with "the close" belongs to the extended session: once the closing auction prints, quoting moves to the thin after-hours tape, where far fewer quotes compete and the gap sits wider.

Why are spreads wider at the open?

Three conditions coincide in the opening half hour; 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 piles up — earnings, guidance, overseas sessions — while continuous trading is dark. The first quotes of the day follow the overnight gap, not the prior close.
  • Price discovery is still running. The auction compresses that backlog into one opening print; the continuous market spends the next 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 posting quotes, and the 9:30 bell does not instantly reset the book. The first regular-session buckets sit between the premarket's width and midday's calm.

None of this is unique to a news day; the backlog, the auction, and the thin early book recur every session, and so does the premium.

The bill in cents: the open vs. midday

Multiples show the shape; costs arrive in cents. The table below prices the same three names: the median quoted spread over the opening half hour (9:30-10:00 a.m. ET) against the midday stretch (noon-2:00 p.m. ET), in cents per share and in basis points (bps) — hundredths of a percent of the share price — plus each name's valid quote-update count and the excluded one-sided, locked, or crossed updates.

QueryThe opening premium priced: median spread at the open (9:30-10:00 ET) vs. midday (12:00-14:00 ET)
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_bps, clock_min BETWEEN 810 AND 839), 2) AS open30_bps,
       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 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), 1) AS open_vs_midday_x,
       round(quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 1170 AND 1199), 2) AS last30_bps,
       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 also a bill. A 100-share round trip in Etsy at the median opening quote gives up $28; against midday quotes, $7. Apple runs $5 at the open against $3 midday, SPY $3 against $2. As a ratio, the opening premium measured 1.5x for SPY, 1.7x for Apple, and 4x for Etsy — the largest of the three on the thinnest tape, a name whose 0.18 million quote updates are a small fraction of Apple's 9.52 million. In basis points the tiering is starker: Etsy opened at 36.65 bps of its share price against 9.12 bps midday, and SPY's opening half hour, 0.4 bps, stayed tighter than Etsy's final half hour (5.24 bps).

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, part of the semiconductor break that that day's market recap walks through.

QueryMU into July 7, 2026: prior regular-session close, opening print, overnight gap
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_pct

MU went into the session at $984.31 and opened at $923.01 — an overnight gap of -6.2%. Its spread clock for the day:

QueryMU — median quoted spread by half hour on July 7, 2026 (ET, regular hours)
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_time

The clock kept time. MU's opening half hour ran a median spread of 62¢ — 6.7 bps on a stock that opened at $923.01 — the widest half-hour bucket of its session. One bucket later the median was 45¢; it held near 39¢ at noon and 38¢ in the final half hour. Two readings sit in that table: the opening premium arrived on schedule — first bucket widest, everything after it settled — and the liquidity tier still ruled, MU's widest half hour staying tighter in percentage terms (6.7 bps) than Etsy's ordinary opening (36.65 bps).

Reading the clock: orders around the open

None of the above says never trade the open — it prices the choice.

  • A limit order names its price. A market order at 9:31 a.m. accepts quotes at or near their widest of the regular day; a limit order caps what immediacy can cost, at the risk of not filling. On thin names at the open, that trade-off is most of the decision.
  • An order that can wait may cross a narrower gap. In the measured window, Etsy's premium fell from 6.99x to 2.79x within an hour. A trade with no deadline may find a narrower gap after the first buckets pass.
  • The instrument moves the bill more than the clock. SPY at the open measured 0.4 bps; Etsy in its final half hour, 5.24 bps. Inside regular hours, no timing decision closes a gap that size.
Data notes: window, filters, method

The SPY/Apple/Etsy panels roll: the eleven calendar days of NBBO updates ending three days before the last data refresh (clear of the feed's ingest lag), regular hours only. Timestamps are stored in UTC and shown in Eastern Time; the regular-hours filter uses the summer (EDT) clock, and the guard below checks that the filter still lands on a 9:30 a.m. ET session start at both ends of the window — on the winter clock the check trips and the page is held for rework instead of refreshing with shifted buckets. The guard reports the ET minute-of-day the filter opens on; 570 is 9:30 a.m. One-sided (zero bid or ask) and locked or crossed (bid at or above ask) quotes are excluded everywhere; the open-vs-midday table counts the rolling window's exclusions (the half-hour chart draws on the same filtered population), and the MU spread-clock panel counts its own in each bucket. Medians are exact, never sampled. The two MU panels are pinned to July 6-7, 2026 and do not roll.

QueryWindow guard: the UTC session filter maps to a 9:30 a.m. ET start on both ends of the rolling window
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?

Right after the open. In the measured window, the first half hour of regular trading (9:30-10:00 a.m. ET) ran 4x the midday spread on Etsy, 1.7x on Apple, and 1.5x on SPY. Premarket and after-hours quotes sit wider still.

What is the best time of day to trade for tight spreads?

The measured curves are tightest late in the day: Etsy sat at 1.78x its tightest by the 12:30 bucket and 1x in the final half hour, and the opening premium did not return within regular hours. Any one trader's best time involves more than the spread — volume and news timing move on the same clock.

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 — $28 against $7 on a 100-share Etsy round trip above. A limit order caps that cost; whether immediacy is worth the premium depends on the trade.

Do spreads widen again at the close?

Not within regular hours — the final half-hour bucket sat at or near each measured name's tightest. The widening traders associate with the close shows up after the 4:00 p.m. bell, once the closing auction prints and quoting moves to the far thinner extended session.

Does the opening spread pattern hold on volatile days?

It held on the day this page pins: MU gapped -6.2% overnight into July 7, 2026, printed its widest half-hour spread in the opening bucket (62¢), and settled one bucket later. One day is one example, not a law.


Every panel above carries the exact SQL that produced it — open one, swap in a ticker you trade, and time its spread clock on the Strasmore terminal.