{"slug":"are-0dte-options-high-risk","qid":"expiry_outcomes","label":"expiry_outcomes","post_title":"are-0dte-options-high-risk","post_url":"/blog/are-0dte-options-high-risk#q-expiry_outcomes","columns":["outcome","expiries"],"rows":[{"outcome":"1. Finished at or near zero (5% of the premium or less)","expiries":10},{"outcome":"2. Lost more than half","expiries":1},{"outcome":"3. Lost up to half","expiries":5},{"outcome":"4. Gained, less than doubled","expiries":1},{"outcome":"5. Doubled or better","expiries":4}],"shape":"ranking","sql":"WITH spy_by_day AS\n(\n    SELECT\n        toDate(date)                             AS d,\n        medianExact(toFloat64(underlying_close)) AS spot\n    FROM global_markets.options_greeks\n    WHERE underlying_symbol = 'SPY'\n      AND date >= toDate('2026-06-01')\n      AND date <  toDate('2026-07-01')\n      AND underlying_close > 0\n    GROUP BY d\n),\nlast_sessions AS\n(\n    SELECT\n        toDate(expiration_date) AS exp_date,\n        max(toDate(date))       AS prior_session\n    FROM global_markets.options_greeks\n    WHERE underlying_symbol = 'SPY'\n      AND expiration_date >= toDate('2026-06-01')\n      AND expiration_date <  toDate('2026-07-01')\n      AND date >= toDate('2026-05-22')\n      AND date <  expiration_date\n      AND volume > 0\n    GROUP BY exp_date\n),\natm AS\n(\n    SELECT\n        toDate(g.expiration_date)                                                                                AS exp_date,\n        argMin(toFloat64(g.strike_price), abs(toFloat64(g.strike_price) - toFloat64(g.underlying_close)))        AS strike,\n        argMin(toFloat64(g.option_close), abs(toFloat64(g.strike_price) - toFloat64(g.underlying_close)))        AS premium_before\n    FROM global_markets.options_greeks AS g\n    INNER JOIN last_sessions AS ls\n        ON ls.exp_date = toDate(g.expiration_date) AND ls.prior_session = toDate(g.date)\n    WHERE g.underlying_symbol = 'SPY'\n      AND lower(toString(g.option_type)) IN ('call', 'c')\n      AND g.date >= toDate('2026-05-22')\n      AND g.date <  toDate('2026-07-01')\n      AND g.volume > 0\n      AND g.option_close > 0\n    GROUP BY exp_date\n),\noutcomes AS\n(\n    SELECT\n        a.exp_date                                          AS exp_date,\n        greatest(s.spot - a.strike, 0.0) / a.premium_before AS premium_ratio\n    FROM atm AS a\n    INNER JOIN spy_by_day AS s\n        ON s.d = a.exp_date\n)\nSELECT\n    tupleElement(b, 1)                                                                         AS outcome,\n    countIf(o.premium_ratio >= tupleElement(b, 2) AND o.premium_ratio < tupleElement(b, 3))    AS expiries\nFROM\n(\n    SELECT arrayJoin([\n        ('1. Finished at or near zero (5% of the premium or less)', -1.0, 0.05),\n        ('2. Lost more than half',                                   0.05, 0.5),\n        ('3. Lost up to half',                                       0.5,  1.0),\n        ('4. Gained, less than doubled',                             1.0,  2.0),\n        ('5. Doubled or better',                                     2.0,  1000000.0)\n    ]) AS b\n) AS buckets\nCROSS JOIN outcomes AS o\nGROUP BY outcome\nORDER BY outcome","computed_at":"2026-09-18T15:24:11.195106+00:00","elapsed":2.24193477}