{"slug":"how-to-pick-an-option-strike-price","qid":"delta_vs_itm","label":"Delta band versus the share of contracts that finished in the money, 30 days out","post_title":"How to Pick an Option Strike Price by Delta","post_url":"/blog/how-to-pick-an-option-strike-price#q-delta_vs_itm","columns":["delta_band","implied_pct","call_itm_pct","put_itm_pct","contract_count"],"rows":[{"delta_band":"5 to 10","implied_pct":7.2,"call_itm_pct":8.6,"put_itm_pct":2.9,"contract_count":7543},{"delta_band":"10 to 15","implied_pct":12.4,"call_itm_pct":16.2,"put_itm_pct":6.6,"contract_count":4865},{"delta_band":"15 to 20","implied_pct":17.4,"call_itm_pct":21.4,"put_itm_pct":9.5,"contract_count":3824},{"delta_band":"20 to 25","implied_pct":22.5,"call_itm_pct":29.3,"put_itm_pct":14.1,"contract_count":3249},{"delta_band":"25 to 30","implied_pct":27.5,"call_itm_pct":34.9,"put_itm_pct":17.5,"contract_count":2863},{"delta_band":"30 to 35","implied_pct":32.5,"call_itm_pct":37.7,"put_itm_pct":22.3,"contract_count":2685},{"delta_band":"35 to 40","implied_pct":37.5,"call_itm_pct":45.2,"put_itm_pct":27.4,"contract_count":2531},{"delta_band":"40 to 45","implied_pct":42.5,"call_itm_pct":50.1,"put_itm_pct":31.7,"contract_count":2444},{"delta_band":"45 to 50","implied_pct":47.5,"call_itm_pct":54.6,"put_itm_pct":37.1,"contract_count":2385}],"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    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.05 AND abs_delta < 0.50\n),\nbanded AS\n(\n    SELECT\n        toUInt16(floor(s.abs_delta * 20)) AS band,\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(band * 5), ' to ', toString(band * 5 + 5))                    AS delta_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 band\nHAVING countIf(opt = 'call') > 0 AND countIf(opt = 'put') > 0\nORDER BY band","computed_at":"2026-09-27T15:21:47.643049+00:00","elapsed":0.008035272}