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-04, 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 | 74043 | 100 |
| 09:31 | 31084 | 100 |
| 09:32 | 36602 | 100 |
| 09:33 | 36406 | 100 |
| 09:34 | 29715 | 100 |
| 09:35 | 37843 | 100 |
| 09:36 | 44351 | 100 |
| 09:37 | 31090 | 100 |
| 09:38 | 37355 | 100 |
| 09:39 | 33072 | 100 |
| 09:40 | 37509 | 100 |
| 09:41 | 35731 | 100 |
| 09:42 | 42472 | 100 |
| 09:43 | 29977 | 100 |
| 09:44 | 37865 | 100 |
| 09:45 | 44749 | 100 |
| 09:46 | 32938 | 100 |
| 09:47 | 53413 | 100 |
| 09:48 | 49050 | 100 |
| 09:49 | 48340 | 100 |
| 09:50 | 33843 | 100 |
| 09:51 | 35403 | 100 |
| 09:52 | 39609 | 100 |
| 09:53 | 41882 | 100 |
| 09:54 | 38135 | 100 |
| 09:55 | 45959 | 100 |
| 09:56 | 39470 | 100 |
| 09:57 | 37426 | 100 |
| 09:58 | 34274 | 100 |
| 09:59 | 56082 | 100 |
| 10:00 | 63577 | 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 74,043 | 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
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.