{"slug":"the-heston-model-and-the-volatility-smile","qid":"spy_smile","label":"SPY implied volatility by strike distance, 20 to 45 days to expiry (Jan to Jun 2026)","post_title":"Heston Model and the Volatility Smile","post_url":"/blog/the-heston-model-and-the-volatility-smile#q-spy_smile","columns":["moneyness","iv_pct","iv_vs_atm_pts","contracts"],"rows":[{"moneyness":"-12%","iv_pct":28.05,"iv_vs_atm_pts":11.61,"contracts":1853},{"moneyness":"-10%","iv_pct":26.32,"iv_vs_atm_pts":9.88,"contracts":4733},{"moneyness":"-8%","iv_pct":24.12,"iv_vs_atm_pts":7.68,"contracts":6276},{"moneyness":"-6%","iv_pct":22,"iv_vs_atm_pts":5.56,"contracts":7898},{"moneyness":"-4%","iv_pct":20.05,"iv_vs_atm_pts":3.61,"contracts":10363},{"moneyness":"-2%","iv_pct":18.17,"iv_vs_atm_pts":1.73,"contracts":12370},{"moneyness":"0%","iv_pct":16.44,"iv_vs_atm_pts":0,"contracts":14027},{"moneyness":"+2%","iv_pct":15.03,"iv_vs_atm_pts":-1.41,"contracts":11470},{"moneyness":"+4%","iv_pct":13.96,"iv_vs_atm_pts":-2.48,"contracts":8233},{"moneyness":"+6%","iv_pct":13.59,"iv_vs_atm_pts":-2.85,"contracts":5133},{"moneyness":"+8%","iv_pct":13.65,"iv_vs_atm_pts":-2.79,"contracts":3165},{"moneyness":"+10%","iv_pct":14.63,"iv_vs_atm_pts":-1.81,"contracts":1921},{"moneyness":"+12%","iv_pct":15.56,"iv_vs_atm_pts":-0.88,"contracts":708}],"shape":"ranking","sql":"WITH\n    (\n        SELECT avg(implied_volatility)\n        FROM global_markets.options_greeks\n        WHERE underlying_symbol = 'SPY'\n          AND date BETWEEN '2026-01-02' AND '2026-06-30'\n          AND iv_converged = 1\n          AND volume > 0\n          AND days_to_expiry BETWEEN 20 AND 45\n          AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) <= 0.01\n    ) AS atm_iv\nSELECT\n    concat(if(m_bucket > 0, '+', ''), toString(m_bucket), '%') AS moneyness,\n    round(avg(iv) * 100, 2)                                    AS iv_pct,\n    round((avg(iv) - atm_iv) * 100, 2)                          AS iv_vs_atm_pts,\n    count()                                                     AS contracts\nFROM\n(\n    SELECT\n        implied_volatility AS iv,\n        toInt16(round((toFloat64(strike_price) / toFloat64(underlying_close) - 1) * 50) * 2) AS m_bucket\n    FROM global_markets.options_greeks\n    WHERE underlying_symbol = 'SPY'\n      AND date BETWEEN '2026-01-02' AND '2026-06-30'\n      AND iv_converged = 1\n      AND volume > 0\n      AND days_to_expiry BETWEEN 20 AND 45\n      AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) <= 0.12\n)\nGROUP BY m_bucket\nHAVING count() >= 100\nORDER BY m_bucket","computed_at":"2026-08-12T15:51:34.204113+00:00","elapsed":0.004115769}