session_clock
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 | contracts_millions | share_pct |
|---|---|---|
| 07:00 | 0 | 0 |
| 07:30 | 0 | 0 |
| 08:00 | 0 | 0 |
| 08:30 | 0 | 0 |
| 09:00 | 0 | 0 |
| 09:30 | 33.43 | 13.32 |
| 10:00 | 28.54 | 11.37 |
| 10:30 | 24.56 | 9.79 |
| 11:00 | 21.7 | 8.65 |
| 11:30 | 18.75 | 7.47 |
| 12:00 | 15.53 | 6.19 |
| 12:30 | 13.82 | 5.5 |
| 13:00 | 14.16 | 5.64 |
| 13:30 | 13.33 | 5.31 |
| 14:00 | 14.58 | 5.81 |
| 14:30 | 13.15 | 5.24 |
| 15:00 | 15.47 | 6.16 |
| 15:30 | 21.67 | 8.63 |
| 16:00 | 2.26 | 0.9 |
| 16:30 | 0.04 | 0.02 |
| 17:00 | 0 | 0 |
- Rows × columns
- 21 × 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 | 07:00 to 17:00 | |
contracts_millions |
number | 0 to 33.43 | count |
share_pct |
number | 0 to 13.32 | 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
intDiv(
toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')), 30) * 30 AS bucket_minute,
sum(volume) AS contracts
FROM global_markets.options_minute_aggs
WHERE window_start >= today() - 12
AND window_start < today() - 2
GROUP BY bucket_minute
),
shares AS
(
SELECT
bucket_minute,
contracts,
round(100 * contracts / sum(contracts) OVER (), 2) AS share_pct
FROM tape
)
SELECT
formatDateTime(toDateTime('2026-01-01 00:00:00') + grid.bucket_minute * 60, '%H:%i') AS et_time,
round(ifNull(s.contracts, 0) / 1000000, 2) AS contracts_millions,
ifNull(s.share_pct, 0) AS share_pct
FROM
(
SELECT 420 + 30 * arrayJoin(range(21)) AS bucket_minute
) AS grid
LEFT JOIN shares AS s ON s.bucket_minute = grid.bucket_minute
ORDER BY grid.bucket_minute
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
spy_open_ramp
series 46×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 →