{"slug":"how-to-read-an-option-chain","qid":"dte_mix","label":"SPY option volume by time to expiration, July 15 2026","post_title":"How to Read an Option Chain, Column by Column","post_url":"/blog/how-to-read-an-option-chain#q-dte_mix","columns":["expires_in","contracts_m","pct_of_spy_volume","distinct_contracts"],"rows":[{"expires_in":"same day (0DTE)","contracts_m":8.48,"pct_of_spy_volume":66.9,"distinct_contracts":170},{"expires_in":"1-7 days","contracts_m":2.96,"pct_of_spy_volume":23.4,"distinct_contracts":844},{"expires_in":"8-30 days","contracts_m":0.61,"pct_of_spy_volume":4.8,"distinct_contracts":1299},{"expires_in":"31-90 days","contracts_m":0.51,"pct_of_spy_volume":4.1,"distinct_contracts":1253},{"expires_in":"over 90 days","contracts_m":0.1,"pct_of_spy_volume":0.8,"distinct_contracts":1502}],"shape":"ranking","sql":"WITH dateDiff('day', toDate('2026-07-15'), toDate(concat('20', substring(ticker, length(ticker) - 14, 2), '-', substring(ticker, length(ticker) - 12, 2), '-', substring(ticker, length(ticker) - 10, 2)))) AS dte\nSELECT multiIf(dte = 0, 'same day (0DTE)', dte <= 7, '1-7 days', dte <= 30, '8-30 days',\n               dte <= 90, '31-90 days', 'over 90 days') AS expires_in,\n       round(sum(volume) / 1e6, 2) AS contracts_m,\n       round(100 * toFloat64(sum(volume)) / (SELECT toFloat64(sum(volume))\n             FROM global_markets.options_minute_aggs\n             WHERE window_start >= '2026-07-15 00:00:00' AND window_start < '2026-07-16 00:00:00'\n               AND substring(ticker, 3, length(ticker) - 17) = 'SPY'), 1) AS pct_of_spy_volume,\n       toUInt64(uniqExact(ticker)) AS distinct_contracts\nFROM global_markets.options_minute_aggs\nWHERE window_start >= '2026-07-15 00:00:00'\n  AND window_start < '2026-07-16 00:00:00'\n  AND substring(ticker, 3, length(ticker) - 17) = 'SPY'\n  AND dte >= 0\nGROUP BY expires_in\nORDER BY min(dte)","computed_at":"2026-07-31T08:38:45.925482+00:00","elapsed":0.05120736}