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

Why spread dey wide for open? Real data show am

Tick-level quotes price di opening premium half hour by half hour, show how e dey fade fast, and wetin premarket really cost. See di real numbers for Etsy, Apple, and SPY.

Spread dey wide for open pass almost any other time for regular US session, and the thinner the stock, the bigger the penalty. For the rolling window wey dey below, the first half hour of trading carry median bid-ask spread wey be 3.34x midday own for Etsy, wey be mid-cap, and 2.02x for Apple — while SPY, wey be the most heavily quoted among the three, print pooled ratio of 1x, flat line wey turn out to be artifact of the one-cent price grid, no be free open. This page dey time that clock from tick-level quotes.

Wetin spread dey cost for market order

Every stock dey show two price for di same time: di bid, wey be di best standing offer to buy, and di ask, wey be di best standing offer to sell. Di gap between dem na di bid-ask spread, and a market order — di one wey dey trade now-now for di best price wey dey available — dey pay am: buys dey fill for di ask, sells dey fill for di bid, and di difference dey go to whoeva post di quote, usually a market maker. Two properties of dat quote matter for below: e dey run on a clock wey im expensive end na morning, and e dey step in whole cents — di tightest spread wey a high-priced ETF and a much cheaper mid-cap fit show na di same penny.

Di spread clock: one shape, three liquidity levels

Di chart dey follow three liquidity levels: SPY, wey be di S&P 500 ETF; Apple, one mega-cap; Etsy, one mid-cap. Every valid NBBO update — di market-wide best bid and offer wey your broker dey show, wey dem unpack for our NBBO explainer — inside one recent multi-day window dey fall into 30-minute bucket of di regular session, and each bucket im median spread dem divide am by dat name im tightest, so 1 mean say e tight as di stock fit get.

QueryMedian spread for every half hour, as multiple of each name 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 dey call di intraday pattern one U: wide open, tight midday, wider as e dey go close. As dem measure am here, e be like ski slope — for names wey dia spread get room to move. Etsy open for 5.78x im tightest level, e don drop go 2.99x by 10:30 and 1.86x for lunchtime; Apple open for 3.04x. For all three, di tightest half hour na di last one — 1x, 1x, 1x — so di re-widening wey traders dey associate with "di close" belong to di extended session, after di closing auction.

SPY im line flat: 1x for di opening bucket, 1x for lunch. Im median spread no dey move all day. Dat one no be say opening premium no dey — na di penny grid.

Di penny grid: where di premium dey hide for di tightest names

SPY im median spread na 2¢ for open and 2¢ for midday — di same two pennies, so im median no get anytin else to tok. Di distribution wey dey underneath get sometin to tok. Dis panel dey count, for every half hour, di share of quote updates wey dey siddon for di one-cent minimum.

QueryShare of quote updates at di one-cent minimum spread, by half hour (regular hours, ET)
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_time

SPY siddon for di one-cent floor for 20.7% of im opening-half-hour updates against 43.1% for di final half hour; Apple, 3.1% against 30.6%; Etsy, 0.2% against 8.3%. Every name dey open far from di floor pass where e dey finish, and di tail dey move too: SPY im 90th-percentile opening spread measure 4¢ against 3¢ for midday — 1.32x, where im median show 1x. Di premium dey there for SPY; di penny grid too coarse for median to register am.

Why spread dey wide for open time?

Three condition dey happen together for di first half hour, and none of dem dey last reach lunchtime.

  • Di overnight backlog dey land at once. Between 4:00 p.m. close and di next morning opening auction, seventeen and a half hours of information dey pile up — earnings, guidance, overseas sessions — while continuous trading dey dark. Di first quotes dey follow di gap, not di prior close.
  • Price discovery still dey run. Di auction dey compress dat backlog into one print; di market den dey spend minutes dey find range around am, and quotes dey re-price fastest while dat search dey run.
  • Di book still dey fill in. Premarket trading dey run with far fewer participants dey quote, and di bell no dey reset di book instantly.

Wetin halt dey do to di clock

Halt na di extreme form of di same mechanics. Under limit up-limit down (LULD) rules, stock wey im price run outside band around im recent average dey trip five-minute pause; exchange fit also halt name for news wey dey pending. Mid-halt no two-sided quote dey to cross — di one-sided or crossed book for screen no be tradable market. Trading dey restart through reopening auction wey im first quotes dey carry di backlog-and-discovery load of 9:30 bell, compressed into minutes. Stock wey halt near di open dey pay di premium twice.

Premarket na different market

Dem dey always talk say thin-book dey drive am; dis panel dey price am — same names, same window, five phases for di day, inside basis points (bps), hundredths of one percent of di share price, so names wey get different price fit compare.

QueryMedian quoted spread by phase of di trading day, in basis points (ET clock)
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 no be worse open; e be different market. Etsy im median quoted spread na 306.25 bps between 4:00 and 7:00 a.m. ET and 307.57 bps from 7:00 reach di bell, against 30.79 bps for di opening half hour and 9.21 bps midday — percentage points of di price, no be pennies. Apple quote 9.82 bps early against 0.96 bps midday; even SPY wide reach 0.8 bps against 0.27 bps. After di 4:00 p.m. bell di width dey return — 240.45 bps for Etsy, 6.99 bps for Apple.

Di bill for kobo: open versus midday

Cost dey show for kobo. Di table price di same names — median spread for di first half hour wey market open (9:30–10:00 a.m. ET) against midday (noon–2:00 p.m. ET), di 90th-percentile quote for each window, di quote-update counts, and di one-sided, locked, or crossed quotes wey dem comot.

QueryDi opening premium wey dem price: median and 90th-percentile spread at 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_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)

Kobo per share and dollar per 100 shares na di same number, so di table na bill: 100-share round trip for Etsy for di median opening quote dey give up $24 against $7 for midday quotes; Apple, $6 against $3. Di premium dey climb as di tape thin — 1x for SPY, 2.02x for Apple, 3.34x for Etsy, wey im 0.19 million quote updates na small fraction of Apple own 8.97 million. Di tier cover di clock: SPY opening half hour, 0.27 bps, tight pass Etsy calmest midday (9.21 bps), wey im worst-decile open measure 75.67 bps.

E dey show face for every session?

If you pool many days of quotes into one median, e answer question about the window, no be one morning. This panel dey re-compute the open-versus-midday ratio session by session: di typical session, di calmest, di worst, and di share wey open wide for all.

QuerySession by session: how often, and by how much, di open dey run wider pass midday
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, di open run wider pass midday for 71% of SPY, 100% of Apple, and 100% of Etsy own. Di typical session premium na: 1x for SPY — for di most liquid name for tape, di penny grid dey keep even one consistent widening nearly invisible — against 2.03x for Apple and 3.29x for Etsy, where di premium dey unmistakable. Dispersion na di lesson: Etsy calmest morning open at 2.08x im own midday, im worst at 4.5x. One opening premium na average and one tail, e no be promise about tomorrow own at 9:31.

One stress test: di MU morning of July 7, 2026

Rolling windows dey smooth away single mornings, so here na one wey we pin down: Micron on Tuesday, July 7, 2026, inside di semiconductor break di recap for dat day dey waka 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 close for $984.31 and open for $923.01 — one overnight gap of -6.2%. Di spread clock for dat day:

QueryMU — median quoted spread by half hour for 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

Di clock keep time. MU opening half hour run one median spread of 62¢ — 6.7 bps on top one stock wey open for $923.01 — di widest half-hour bucket for im session. One bucket later di median na 45¢, come be 39¢ for noon and 38¢ for di last half hour. Di premium show for schedule — and di liquidity tier still dey rule: even here MU stay tighter for percentage terms pass Etsy ordinary open (30.79 bps).

::: Data notes: window, filters, method
Di SPY/Apple/Etsy panels dey roll: eleven calendar days of NBBO updates wey end three days before di last refresh (clear of di feed ingest lag). Di regular-hours panels cut di session with one UTC minute-of-day filter on di summer (EDT) clock; di guard below dey check say e still land on 9:30 a.m. ET start for both ends of di window (570 na 9:30 a.m.) — on di winter clock e go trip and hold di page for rework. Di phases panel dey convert to di Eastern clock directly, e cover 4:00 a.m.–8:00 p.m. ET any which way. One-sided (zero bid or ask) and locked or crossed (bid at or above ask) quotes dey excluded throughout; session stability dey keep only sessions wey dey quote for BOTH windows. Medians and 90th percentiles na exact; di MU panels dey pinned to July 6–7, 2026.

QueryWindow guard: di UTC session filter dey map to 9:30 a.m. ET start for both ends of di 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

Which time of day bid-ask spread dey wide pass?

Na premarket — Etsy im median quoted spread measure 306.25 bps between 4:00 and 7:00 a.m. ET against 9.21 bps midday. Inside regular hours, di widest stretch na di first half hour after open; di tightest na di last one before close.

Why SPY im spread dey look flat for open?

Dem dey quote US stocks for whole cents, and SPY im median spread dey sit for 2¢ most of di day — dat grid too coarse to register small widening. Session by session, im open still run wider dan im midday for 71% of sessions, and im 90th-percentile opening spread measure 4¢ against 3¢.

E bad to place market order for open?

E dey among di most expensive stretches of di regular session if you dey demand immediacy — $24 against $7 on a 100-share Etsy round trip for dat window wey dey up. A limit order go cap dat cost, but e get risk say e no go fill, and order wey fit wait fit cross narrower gap: Etsy im premium fall from 5.78x to 2.99x within one hour.

Spread dey widen again for close?

E no dey happen inside regular hours — di final half-hour bucket na im tightest for di day on all three names. Dat widening dey come after di 4:00 p.m. bell, for di thinner extended session: Apple quote 6.99 bps there against 0.96 bps midday.

Options spread dey widen for open too?

Di panels here dey measure equity quotes only and dem no claim anything about options. Di mechanics dey point di same way — an option im quote depend on di underlying stock im price, wey no dey settled for di first minutes — and our options-cost breakdown dey measure option spreads directly.


Every panel carry di SQL wey produce am — swap in ticker wey you dey trade and time im spread clock on di Strasmore terminal.