{"slug":"how-to-pick-an-option-strike-price","qid":"iv_gap","label":"Implied versus realized in the money share by the contract's own implied volatility","post_title":"How to Pick an Option Strike Price by Delta","post_url":"/blog/how-to-pick-an-option-strike-price#q-iv_gap","columns":["iv_band","implied_pct","call_itm_pct","put_itm_pct","contract_count"],"rows":[{"iv_band":"10% to 20%","implied_pct":19.5,"call_itm_pct":26.3,"put_itm_pct":9.2,"contract_count":5342},{"iv_band":"20% to 30%","implied_pct":18.3,"call_itm_pct":23.1,"put_itm_pct":11.3,"contract_count":4735},{"iv_band":"30% to 40%","implied_pct":18.2,"call_itm_pct":21.8,"put_itm_pct":10.9,"contract_count":1730},{"iv_band":"40% to 50%","implied_pct":18.6,"call_itm_pct":24.4,"put_itm_pct":17.1,"contract_count":1309},{"iv_band":"50% to 60%","implied_pct":18.7,"call_itm_pct":11,"put_itm_pct":9.2,"contract_count":813},{"iv_band":"60% to 70%","implied_pct":18.9,"call_itm_pct":51.2,"put_itm_pct":15.1,"contract_count":435},{"iv_band":"70% to 80%","implied_pct":18.8,"call_itm_pct":4.5,"put_itm_pct":10,"contract_count":137}],"shape":"table","sql":"WITH\npx AS\n(\n    SELECT\n        underlying_symbol     AS sym,\n        toDate(date)          AS d,\n        any(underlying_close) AS close_at_expiry\n    FROM global_markets.options_greeks\n    WHERE date >= '2024-01-01'\n      AND date <  '2026-09-01'\n      AND underlying_close > 0\n      AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'SPY', 'KO', 'JPM', 'XOM')\n    GROUP BY sym, d\n),\nsnaps AS\n(\n    SELECT\n        ticker                                                          AS contract,\n        any(underlying_symbol)                                          AS sym,\n        any(if(upper(substring(toString(option_type), 1, 1)) = 'C', 'call', 'put')) AS opt,\n        any(strike_price)                                               AS strike,\n        toDate(any(expiration_date))                                    AS expiry,\n        argMin(abs(delta), abs(toInt32(days_to_expiry) - 30))           AS abs_delta,\n        argMin(implied_volatility, abs(toInt32(days_to_expiry) - 30))   AS iv\n    FROM global_markets.options_greeks\n    WHERE date >= '2024-01-01'\n      AND date <  '2026-09-01'\n      AND days_to_expiry BETWEEN 27 AND 33\n      AND delta != 0\n      AND volume > 0\n      AND toDate(expiration_date) < '2026-09-01'\n      AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'SPY', 'KO', 'JPM', 'XOM')\n    GROUP BY contract\n    HAVING abs_delta >= 0.10 AND abs_delta < 0.30\n       AND iv >= 0.10 AND iv < 1.00\n),\nbanded AS\n(\n    SELECT\n        toUInt16(floor(s.iv * 10)) * 10 AS iv_floor,\n        s.abs_delta                     AS abs_delta,\n        s.opt                           AS opt,\n        if(s.opt = 'call',\n           p.close_at_expiry > s.strike,\n           p.close_at_expiry < s.strike) AS finished_itm\n    FROM snaps AS s\n    INNER JOIN px AS p ON p.sym = s.sym AND p.d = s.expiry\n)\nSELECT\n    concat(toString(iv_floor), '% to ', toString(iv_floor + 10), '%')             AS iv_band,\n    round(100 * avg(abs_delta), 1)                                                AS implied_pct,\n    round(100 * countIf(finished_itm AND opt = 'call') / countIf(opt = 'call'), 1) AS call_itm_pct,\n    round(100 * countIf(finished_itm AND opt = 'put') / countIf(opt = 'put'), 1)   AS put_itm_pct,\n    count()                                                                       AS contract_count\nFROM banded\nGROUP BY iv_floor\nHAVING countIf(opt = 'call') > 20 AND countIf(opt = 'put') > 20\nORDER BY iv_floor","computed_at":"2026-09-27T15:21:48.200229+00:00","elapsed":0.004945207}