{"slug":"how-delta-hedging-works","qid":"implied_vs_realized","label":"SPY at-the-money implied volatility against realized volatility, by month","post_title":"How Delta Hedging Actually Works","post_url":"/blog/how-delta-hedging-works#q-implied_vs_realized","columns":["month","implied_vol_pct","realized_vol_pct"],"rows":[{"month":"2025-08-01","implied_vol_pct":13.7,"realized_vol_pct":10.1},{"month":"2025-09-01","implied_vol_pct":13.3,"realized_vol_pct":6.3},{"month":"2025-10-01","implied_vol_pct":15.7,"realized_vol_pct":13.7},{"month":"2025-11-01","implied_vol_pct":16.7,"realized_vol_pct":15.3},{"month":"2025-12-01","implied_vol_pct":13.5,"realized_vol_pct":8.2},{"month":"2026-01-01","implied_vol_pct":14,"realized_vol_pct":10.3},{"month":"2026-02-01","implied_vol_pct":16.4,"realized_vol_pct":13.2},{"month":"2026-03-01","implied_vol_pct":21,"realized_vol_pct":18.2},{"month":"2026-04-01","implied_vol_pct":17.2,"realized_vol_pct":11.6},{"month":"2026-05-01","implied_vol_pct":15.4,"realized_vol_pct":9.7},{"month":"2026-06-01","implied_vol_pct":15.7,"realized_vol_pct":17.7},{"month":"2026-07-01","implied_vol_pct":14.8,"realized_vol_pct":12.1}],"shape":"series","sql":"WITH\n    monthly_iv AS\n    (\n        SELECT\n            toStartOfMonth(date)                    AS m,\n            round(avg(implied_volatility) * 100, 1) AS implied_vol_pct\n        FROM global_markets.options_greeks\n        WHERE underlying_symbol = 'SPY'\n          AND iv_converged = 1\n          AND volume > 0\n          AND underlying_close > 0\n          AND days_to_expiry BETWEEN 20 AND 45\n          AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05\n          AND date >= '2025-08-01'\n          AND date <  '2026-08-01'\n        GROUP BY m\n    ),\n    monthly_rv AS\n    (\n        SELECT\n            m,\n            round(arrayReduce('stddevPop', rets) * sqrt(252) * 100, 1) AS realized_vol_pct\n        FROM\n        (\n            SELECT\n                m,\n                arrayMap((a, b) -> log(a / b),\n                         arraySlice(px, 2),\n                         arraySlice(px, 1, length(px) - 1)) AS rets\n            FROM\n            (\n                SELECT\n                    toStartOfMonth(session_date) AS m,\n                    arrayMap(t -> t.2, arraySort(t -> t.1, groupArray((session_date, session_close)))) AS px\n                FROM\n                (\n                    SELECT\n                        date                  AS session_date,\n                        toFloat64(max(close)) AS session_close\n                    FROM global_markets.stocks_daily_aggs\n                    WHERE ticker = 'SPY'\n                      AND date >= '2025-08-01'\n                      AND date <  '2026-08-01'\n                    GROUP BY date\n                )\n                GROUP BY m\n            )\n            WHERE length(rets) > 5\n        )\n    )\nSELECT\n    toString(iv.m)      AS month,\n    iv.implied_vol_pct  AS implied_vol_pct,\n    rv.realized_vol_pct AS realized_vol_pct\nFROM monthly_iv AS iv\nINNER JOIN monthly_rv AS rv ON rv.m = iv.m\nORDER BY iv.m","computed_at":"2026-08-16T14:39:45.652262+00:00","elapsed":0.005152207}