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-17, 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 | 73194 | 100 |
| 09:31 | 34588 | 100 |
| 09:32 | 36574 | 100 |
| 09:33 | 37435 | 100 |
| 09:34 | 32221 | 100 |
| 09:35 | 47530 | 100 |
| 09:36 | 21363 | 100 |
| 09:37 | 29142 | 100 |
| 09:38 | 51782 | 100 |
| 09:39 | 39325 | 100 |
| 09:40 | 41853 | 100 |
| 09:41 | 40252 | 100 |
| 09:42 | 75727 | 100 |
| 09:43 | 32602 | 100 |
| 09:44 | 43672 | 100 |
| 09:45 | 44126 | 100 |
| 09:46 | 28254 | 100 |
| 09:47 | 48935 | 100 |
| 09:48 | 38220 | 100 |
| 09:49 | 42584 | 100 |
| 09:50 | 42743 | 100 |
| 09:51 | 42792 | 100 |
| 09:52 | 40529 | 100 |
| 09:53 | 43614 | 100 |
| 09:54 | 39153 | 100 |
| 09:55 | 53072 | 100 |
| 09:56 | 41128 | 100 |
| 09:57 | 50572 | 100 |
| 09:58 | 43391 | 100 |
| 09:59 | 38777 | 100 |
| 10:00 | 49848 | 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 75,727 | 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
इस डेटा के साथ अपने AI असिस्टेंट में काम करें
इस पेज के डेटा के साथ, क्वेरी के लिए तैयार खुलता है। मुफ़्त, बिना अकाउंट।