STRASMORE/EXPLORE 2,170 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-08-25, 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 day20.9931.220260819
1 to 7 days18.928.120260819
8 to 30 days1522.320260819
31 to 90 days4620260819
91 to 365 days6.9510.320260819
over a year1.36220260819
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.36 to 20.99 count
pct_of_volume number 2 to 31.2 percent
session_id number every row is 20,260,819

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 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

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 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 2,170 queries →