SPY option volume, minute by minute into the 9:30 open
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-11, from What Time Do Options Start Trading?.
| et_time | contract_volume | active_pct |
|---|---|---|
| 09:15 | 0 | 0 |
| 09:16 | 0 | 0 |
| 09:17 | 0 | 0 |
| 09:18 | 0 | 0 |
| 09:19 | 0 | 0 |
| 09:20 | 0 | 0 |
| 09:21 | 0 | 0 |
| 09:22 | 0 | 0 |
| 09:23 | 0 | 0 |
| 09:24 | 0 | 0 |
| 09:25 | 0 | 0 |
| 09:26 | 0 | 0 |
| 09:27 | 0 | 0 |
| 09:28 | 0 | 0 |
| 09:29 | 0 | 0 |
| 09:30 | 79764 | 100 |
| 09:31 | 32664 | 100 |
| 09:32 | 42450 | 100 |
| 09:33 | 38237 | 100 |
| 09:34 | 34246 | 100 |
| 09:35 | 46462 | 100 |
| 09:36 | 31896 | 100 |
| 09:37 | 31697 | 100 |
| 09:38 | 47374 | 100 |
| 09:39 | 39137 | 100 |
| 09:40 | 34150 | 100 |
| 09:41 | 41718 | 100 |
| 09:42 | 74717 | 100 |
| 09:43 | 34309 | 100 |
| 09:44 | 48072 | 100 |
| 09:45 | 45070 | 100 |
| 09:46 | 35021 | 100 |
| 09:47 | 48933 | 100 |
| 09:48 | 43092 | 100 |
| 09:49 | 50119 | 100 |
| 09:50 | 36890 | 100 |
| 09:51 | 45498 | 100 |
| 09:52 | 39662 | 100 |
| 09:53 | 44812 | 100 |
| 09:54 | 36402 | 100 |
| 09:55 | 58509 | 100 |
| 09:56 | 41522 | 100 |
| 09:57 | 43303 | 100 |
| 09:58 | 33518 | 100 |
| 09:59 | 58681 | 100 |
| 10:00 | 70738 | 100 |
- Rows × columns
- 46 × 3
- 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 |
|---|---|---|---|
et_time |
text | 46 distinct values (09:15, 09:16, 09:17…) | |
contract_volume |
number | 0 to 79,764 | count |
active_pct |
number | 0 to 100 | percent |
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.
WITH tape AS
(
SELECT
toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) AS minute_of_day,
countDistinct(toDate(toTimeZone(window_start, 'America/New_York'))) AS days_traded,
sum(volume) AS contracts
FROM global_markets.options_minute_aggs
WHERE startsWith(ticker, 'O:SPY')
AND length(ticker) = 20
AND window_start >= today() - 12
AND window_start < today() - 2
GROUP BY minute_of_day
)
SELECT
formatDateTime(toDateTime('2026-01-01 00:00:00') + grid.minute_of_day * 60, '%H:%i') AS et_time,
toUInt64(round(ifNull(t.contracts, 0) / greatest((SELECT max(days_traded) FROM tape), 1))) AS contract_volume,
round(100 * ifNull(t.days_traded, 0) / greatest((SELECT max(days_traded) FROM tape), 1), 1) AS active_pct
FROM
(
SELECT 555 + arrayJoin(range(46)) AS minute_of_day
) AS grid
LEFT JOIN tape AS t ON t.minute_of_day = grid.minute_of_day
ORDER BY grid.minute_of_day
Werk met deze data in je AI-assistent
Opent klaar om te bevragen, met de data van deze pagina. Gratis, zonder account.