STRASMORE/EXPLORE 3,256 QUERIES

What the session's contracts were made of: options volume by days to expiry

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-08, from Unusual Options Activity: Last Session.

as of ranking 6×4read in context →
What the session's contracts were made of: options volume by days to expiry — 6 rows by 4 columns, computed from US exchange, SIP and OPRA data.
dte_bucketcontracts_mpct_of_volumesession_id
same day18.6529.620261006
1 to 7 days17.3927.620261006
8 to 30 days11.4618.220261006
31 to 90 days8.9614.220261006
91 to 365 days5.298.420261006
over a year1.312.120261006
Rows × columns
6 × 4
Computed
Completeness
No missing values
Source
US exchange, SIP and OPRA market data
Licence
Strasmore terms · free, no signup
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for What the session's contracts were made of: options volume by days to expiry, derived from the stored result.
ColumnTypeRangeNotes
dte_bucket text 6 distinct values (1 to 7 days, 31 to 90 days, 8 to 30 days…)
contracts_m number 1.31 to 18.65 count
pct_of_volume number 2.1 to 29.6 percent
session_id number every row is 20,261,006

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 toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           sum(toFloat64(volume)) AS vol
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime(today() - 45, 'America/New_York')
    GROUP BY d
),
ranked AS (
    SELECT d, vol, row_number() OVER (ORDER BY d DESC) AS raw_rn
    FROM tape
),
cal AS (
    SELECT d, vol, rn, sum(if(rn BETWEEN 2 AND 21, 1, 0)) OVER () AS baseline_sessions
    FROM (
        SELECT d, vol, row_number() OVER (ORDER BY d DESC) AS rn
        FROM ranked
        WHERE vol >= 0.75 * (SELECT quantileExact(0.5)(vol) FROM ranked WHERE raw_rn > 1)
    )
),
bars AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           toFloat64(volume) AS v,
           toDate(concat('20', substring(ticker, length(ticker) - 14, 2), '-',
                         substring(ticker, length(ticker) - 12, 2), '-',
                         substring(ticker, length(ticker) - 10, 2))) AS expiry
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime(today() - 12, 'America/New_York')
      AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM cal WHERE rn = 1)
),
scored AS (
    SELECT multiIf(expiry - d <= 0, 1, expiry - d <= 7, 2, expiry - d <= 30, 3,
                   expiry - d <= 90, 4, expiry - d <= 365, 5, 6) AS bk,
           v, d
    FROM bars
)
SELECT arrayElement(['same day', '1 to 7 days', '8 to 30 days', '31 to 90 days', '91 to 365 days', 'over a year'], bk) AS dte_bucket,
       round(sum(v) / 1e6, 2) AS contracts_m,
       round(100.0 * sum(v) / sum(sum(v)) OVER (), 1) AS pct_of_volume,
       toYYYYMMDD(max(d)) AS session_id
FROM scored
GROUP BY bk
ORDER BY bk ASC
⌘/Ctrl + Enter

Work with this data in your AI assistant

Opens ready to query, with this page's data. Free, no account.

More from this analysisUnusual Options Activity: Last Session
Market-wide options volume by session, with monthly expirations labelled series 25×5 → Calls or puts: the board's call and put contract volume on the same session table 10×5 → Unusual options activity: last completed session vs. each underlying's own 20-session average table 10×8 → What follows a heavy options session: next-session absolute move vs. the same names on an ordinary day table 5×6 → SPY options median spread by expiration date, near-the-money strikes only ranking 25×4 → SPY contracts traded by strike, July 17 2026 expiry ranking 22×3 → See all 3,256 queries →