{"slug":"historical-volatility-vs-implied-volatility","qid":"iv_premium","label":"Average implied volatility against next-month realized volatility, by name","post_title":"Historical Volatility vs Implied Volatility","post_url":"/blog/historical-volatility-vs-implied-volatility#q-iv_premium","columns":["symbol","avg_implied_pct","avg_realized_next_pct","months_iv_higher","months_compared"],"rows":[{"symbol":"TSLA","avg_implied_pct":53.6,"avg_realized_next_pct":53.2,"months_iv_higher":13,"months_compared":18},{"symbol":"NVDA","avg_implied_pct":43.8,"avg_realized_next_pct":39,"months_iv_higher":12,"months_compared":18},{"symbol":"MSFT","avg_implied_pct":27.5,"avg_realized_next_pct":27.9,"months_iv_higher":11,"months_compared":18},{"symbol":"AAPL","avg_implied_pct":27.3,"avg_realized_next_pct":27.3,"months_iv_higher":12,"months_compared":18},{"symbol":"KO","avg_implied_pct":18.9,"avg_realized_next_pct":17.7,"months_iv_higher":11,"months_compared":18},{"symbol":"SPY","avg_implied_pct":16.5,"avg_realized_next_pct":14.9,"months_iv_higher":13,"months_compared":18}],"shape":"table","sql":"WITH\n    daily AS\n    (\n        SELECT\n            ticker,\n            date             AS session_date,\n            toFloat64(close) AS close_px,\n            lagInFrame(toFloat64(close)) OVER\n                (PARTITION BY ticker ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close\n        FROM global_markets.stocks_daily_aggs\n        WHERE ticker IN ('AAPL', 'KO', 'MSFT', 'NVDA', 'SPY', 'TSLA')\n          AND date >= today() - 560\n          AND date <  today()\n    ),\n    realized AS\n    (\n        SELECT\n            ticker,\n            toStartOfMonth(session_date)                              AS month_start,\n            100 * sqrt(252) * stddevSamp(log(close_px / prev_close))  AS rv_pct\n        FROM daily\n        WHERE prev_close > 0\n        GROUP BY ticker, month_start\n        HAVING count() >= 15\n    ),\n    implied AS\n    (\n        SELECT\n            underlying_symbol             AS ticker,\n            toStartOfMonth(date)          AS month_start,\n            100 * avg(implied_volatility) AS iv_pct\n        FROM global_markets.options_greeks\n        WHERE underlying_symbol IN ('AAPL', 'KO', 'MSFT', 'NVDA', 'SPY', 'TSLA')\n          AND date >= today() - 560\n          AND date <  today()\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.05\n        GROUP BY ticker, month_start\n        HAVING count() >= 100\n    )\nSELECT\n    imp.ticker                       AS symbol,\n    round(avg(imp.iv_pct), 1)        AS avg_implied_pct,\n    round(avg(rea.rv_pct), 1)        AS avg_realized_next_pct,\n    countIf(imp.iv_pct > rea.rv_pct) AS months_iv_higher,\n    count()                          AS months_compared\nFROM implied AS imp\nINNER JOIN realized AS rea\n    ON rea.ticker = imp.ticker AND rea.month_start = addMonths(imp.month_start, 1)\nGROUP BY symbol\nORDER BY avg_implied_pct DESC","computed_at":"2026-08-22T04:08:22.555910+00:00","elapsed":4.374614547}