STRASMORE/EXPLORE 2,170 QUERIES

The opening premium priced: median and 90th-percentile spread at the open (9:30-10:00 ET) vs. midday (12:00-14:00 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-08, from Why Are Spreads Wider at the Open? Real Data.

as of table 3×12read in context →
The opening premium priced: median and 90th-percentile spread at the open (9:30-10:00 ET) vs. midday (12:00-14:00 ET) — 3 rows by 12 columns, computed from US exchange, SIP and OPRA data.
tickervalid_updates_mopen30_centsmidday_centsopen30_bpsmidday_bpsopen_vs_midday_xopen30_p90_centsmidday_p90_centsopen30_p90_bpsp90_xdropped_onesided_locked_crossed
SPY29.47220.270.271330.411163496
AAPL12.55742.091.171.791253.92.3436079
ETSY0.220623.87.233.29501159.924.69141
Rows × columns
3 × 12
Computed
Completeness
No missing values
Source
US exchange, SIP and OPRA market data
Licence
Strasmore terms · free, no signup
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for The opening premium priced: median and 90th-percentile spread at the open (9:30-10:00 ET) vs. midday (12:00-14:00 ET), derived from the stored result.
ColumnTypeRangeNotes
ticker text 3 distinct values (AAPL, ETSY, SPY)
valid_updates_m number 0.2 to 29.47
open30_cents number 2 to 20
midday_cents number 2 to 6
open30_bps number 0.27 to 23.8
midday_bps number 0.27 to 7.23
open_vs_midday_x number 1 to 3.29 US dollars
open30_p90_cents number 3 to 50
midday_p90_cents number 3 to 11
open30_p90_bps number 0.41 to 59.92
p90_x number 1 to 4.69
dropped_onesided_locked_crossed text 3 distinct values (141, 163496, 36079)

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,
       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)

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 analysisWhy Are Spreads Wider at the Open? Real Data
Session by session: how often, and by how much, the open ran wider than midday table 3×6 Share of quote updates at the one-cent minimum spread, by half hour (regular hours, ET) series 13×4 Median spread each half hour, as a multiple of each name's tightest bucket (regular hours, ET) series 13×4 MU: median quoted spread by half hour on July 7, 2026 (ET, regular hours) series 13×5 Median quoted spread by phase of the trading day, in basis points (ET clock) ranking 5×4 Window guard: the UTC session filter maps to a 9:30 a.m. ET start on both ends of the rolling window scalar 1×2 See all 2,170 queries →