The rest of 2026, measured: each month's busiest forward expiration date, July 6-9 tape
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-10, from When Do Options Expire? Friday 4 PM ET & Daily.
| month | busiest_expiry_date | weekday | contracts_mm | underlyings |
|---|---|---|---|---|
| 2026-07 | 2026-07-17 | Friday | 31.5 | 4613 |
| 2026-08 | 2026-08-21 | Friday | 14.6 | 4368 |
| 2026-09 | 2026-09-18 | Friday | 8.5 | 2198 |
| 2026-10 | 2026-10-16 | Friday | 3 | 1707 |
| 2026-11 | 2026-11-20 | Friday | 1.6 | 1493 |
| 2026-12 | 2026-12-18 | Friday | 3.2 | 2432 |
- Rows × columns
- 6 × 5
- 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 |
|---|---|---|---|
month |
text | 6 distinct values (2026-07, 2026-08, 2026-09…) | |
busiest_expiry_date |
date | 2026-07-17 to 2026-12-18 | |
weekday |
text | 1 distinct value (Friday) | |
contracts_mm |
number | 1.6 to 31.5 | count |
underlyings |
number | 1,493 to 4,613 |
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 per_expiry AS (
SELECT toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) AS expiry,
sum(toFloat64(volume)) AS v,
uniqExact(substring(ticker, 3, length(ticker) - 17)) AS underlyings
FROM global_markets.options_minute_aggs
WHERE window_start >= '2026-07-06 04:00:00'
AND window_start < '2026-07-10 04:00:00'
GROUP BY expiry
)
SELECT formatDateTime(toStartOfMonth(expiry), '%Y-%m') AS month,
toString(argMax(expiry, (v, toString(expiry)))) AS busiest_expiry_date,
dateName('weekday', argMax(expiry, (v, toString(expiry)))) AS weekday,
round(max(v) / 1e6, 1) AS contracts_mm,
argMax(underlyings, (v, toString(expiry))) AS underlyings
FROM per_expiry
WHERE expiry >= '2026-07-13' AND expiry <= '2026-12-31'
GROUP BY month
HAVING toDayOfWeek(argMax(expiry, (v, toString(expiry)))) = 5
AND toDayOfMonth(argMax(expiry, (v, toString(expiry)))) BETWEEN 15 AND 21
ORDER BY month
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.