{"slug":"option-expiration-cycles-explained","qid":"chain_widths","label":"Listed expiration dates, one broad lineup against a thinner chain","post_title":"Option Expiration Cycles Explained","post_url":"/blog/option-expiration-cycles-explained#q-chain_widths","columns":["symbol","listed_expirations","expirations_within_45d","months_beyond_90d"],"rows":[{"symbol":"SPY","listed_expirations":33,"expirations_within_45d":16,"months_beyond_90d":10},{"symbol":"AAPL","listed_expirations":23,"expirations_within_45d":11,"months_beyond_90d":11},{"symbol":"MSFT","listed_expirations":22,"expirations_within_45d":11,"months_beyond_90d":10},{"symbol":"KO","listed_expirations":18,"expirations_within_45d":7,"months_beyond_90d":10},{"symbol":"HRL","listed_expirations":11,"expirations_within_45d":7,"months_beyond_90d":4},{"symbol":"CLX","listed_expirations":6,"expirations_within_45d":2,"months_beyond_90d":3}],"shape":"ranking","sql":"WITH\n(\n    SELECT max(date)\n    FROM global_markets.options_greeks\n    WHERE date >= today() - 10\n) AS chain_date\nSELECT\n    underlying_symbol                                                     AS symbol,\n    countDistinct(expiration_date)                                        AS listed_expirations,\n    countDistinctIf(expiration_date, days_to_expiry <= 45)                AS expirations_within_45d,\n    countDistinctIf(toStartOfMonth(expiration_date), days_to_expiry > 90) AS months_beyond_90d\nFROM global_markets.options_greeks\nWHERE date = chain_date\n  AND expiration_date >= chain_date\n  AND underlying_symbol IN ('SPY', 'AAPL', 'MSFT', 'KO', 'CLX', 'HRL')\nGROUP BY underlying_symbol\nORDER BY listed_expirations DESC","computed_at":"2026-08-26T04:00:19.277893+00:00","elapsed":0.128122016}