spy_open_ramp
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-26, 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 | 79450 | 100 |
| 09:31 | 7850 | 100 |
| 09:32 | 26796 | 100 |
| 09:33 | 45414 | 100 |
| 09:34 | 15329 | 100 |
| 09:35 | 49108 | 100 |
| 09:36 | 18352 | 100 |
| 09:37 | 31470 | 100 |
| 09:38 | 20996 | 100 |
| 09:39 | 36490 | 100 |
| 09:40 | 42035 | 100 |
| 09:41 | 21718 | 100 |
| 09:42 | 28877 | 100 |
| 09:43 | 39642 | 100 |
| 09:44 | 35376 | 100 |
| 09:45 | 41167 | 100 |
| 09:46 | 40783 | 100 |
| 09:47 | 54856 | 100 |
| 09:48 | 29440 | 100 |
| 09:49 | 51570 | 100 |
| 09:50 | 28752 | 100 |
| 09:51 | 29558 | 100 |
| 09:52 | 31180 | 100 |
| 09:53 | 21258 | 100 |
| 09:54 | 20868 | 100 |
| 09:55 | 22009 | 100 |
| 09:56 | 34339 | 100 |
| 09:57 | 18496 | 100 |
| 09:58 | 25615 | 100 |
| 09:59 | 27794 | 100 |
| 10:00 | 35862 | 100 |
- Rows × columns
- 46 × 3
- Period covered
- to
- 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 |
date | 09:15 to 10:00 | |
contract_volume |
number | 0 to 79,450 | 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.
the exact SQL behind every number
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
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 analysiswhat-time-do-options-start-trading
session_clock
series 21×3
→
early_closes
series 2×6
→
One SPY $600 LEAPS call's price over two years (expired Jan 16 2026)
series 470×2
→
2s10s spread, monthly average: last 20 years
series 240×2
→
Growth of $100 in the 1x SOXX vs the 3x SOXL, Jan 2 to Jul 13 2026
series 131×3
→
SPY underwater curve: month end close against its running peak, 2016 to 2026
series 127×2
→
See all 2,173 queries →