{"slug":"which-stocks-have-daily-options","qid":"weekday_mix","label":"Monday, Wednesday, Friday expirations: distinct option roots carrying an expiry on each weekday","post_title":"Which Stocks Have Daily Options?","post_url":"/blog/which-stocks-have-daily-options#q-weekday_mix","columns":["weekday","roots_with_expiry","contracts_mm"],"rows":[{"weekday":"1 Monday","roots_with_expiry":36,"contracts_mm":3.4},{"weekday":"2 Tuesday","roots_with_expiry":14,"contracts_mm":0.6},{"weekday":"3 Wednesday","roots_with_expiry":40,"contracts_mm":33.5},{"weekday":"4 Thursday","roots_with_expiry":14,"contracts_mm":3.6},{"weekday":"5 Friday","roots_with_expiry":5019,"contracts_mm":95.7}],"shape":"series","sql":"SELECT weekday,\n       uniqExact(root) AS roots_with_expiry,\n       round(sum(vol) / 1e6, 1) AS contracts_mm\nFROM (\n    SELECT substring(ticker, 3, length(ticker) - 17) AS root,\n           toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) AS expiry,\n           multiIf(toDayOfWeek(toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6)))) = 1, '1 Monday',\n                   toDayOfWeek(toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6)))) = 2, '2 Tuesday',\n                   toDayOfWeek(toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6)))) = 3, '3 Wednesday',\n                   toDayOfWeek(toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6)))) = 4, '4 Thursday',\n                   '5 Friday') AS weekday,\n           toFloat64(volume) AS vol\n    FROM global_markets.options_minute_aggs\n    WHERE window_start >= now() - INTERVAL 8 DAY\n)\nWHERE expiry >= today() - 3 AND expiry <= today() + INTERVAL 30 DAY\nGROUP BY weekday\nORDER BY weekday","computed_at":"2026-08-22T04:36:18.018053+00:00","elapsed":4.579315885}