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-10-04, from Why Are Spreads Wider at the Open? Real Data.
| ticker | valid_updates_m | open30_cents | midday_cents | open30_bps | midday_bps | open_vs_midday_x | open30_p90_cents | midday_p90_cents | open30_p90_bps | p90_x | dropped_onesided_locked_crossed |
|---|---|---|---|---|---|---|---|---|---|---|---|
| SPY | 20.78 | 2 | 2 | 0.26 | 0.26 | 1 | 3 | 3 | 0.39 | 1 | 122553 |
| AAPL | 5.94 | 6 | 3 | 1.79 | 0.89 | 2.01 | 12 | 5 | 3.6 | 2.38 | 46209 |
| ETSY | 0.44 | 20 | 7 | 28.65 | 9.65 | 2.97 | 54 | 13 | 75.75 | 4.22 | 345 |
- Rows × columns
- 3 × 12
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
ticker |
text | 3 distinct values (AAPL, ETSY, SPY) | |
valid_updates_m |
number | 0.44 to 20.78 | |
open30_cents |
number | 2 to 20 | |
midday_cents |
number | 2 to 7 | |
open30_bps |
number | 0.26 to 28.65 | |
midday_bps |
number | 0.26 to 9.65 | |
open_vs_midday_x |
number | 1 to 2.97 | US dollars |
open30_p90_cents |
number | 3 to 54 | |
midday_p90_cents |
number | 3 to 13 | |
open30_p90_bps |
number | 0.39 to 75.75 | |
p90_x |
number | 1 to 4.22 | |
dropped_onesided_locked_crossed |
text | 3 distinct values (122553, 345, 46209) |
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.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
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)
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.