{"slug":"what-is-market-volatility","qid":"rv_vs_iv","label":"rv_vs_iv","post_title":"what-is-market-volatility","post_url":"/blog/lang/tl/what-is-market-volatility#q-rv_vs_iv","columns":["ticker","rv_30d_pct","iv_30_45d_pct","gap_pct"],"rows":[{"ticker":"NVDA","rv_30d_pct":38.8,"iv_30_45d_pct":35.1,"gap_pct":-3.7},{"ticker":"AAPL","rv_30d_pct":20.5,"iv_30_45d_pct":24.7,"gap_pct":4.2},{"ticker":"KO","rv_30d_pct":15.2,"iv_30_45d_pct":18.3,"gap_pct":3.1},{"ticker":"SPY","rv_30d_pct":9.8,"iv_30_45d_pct":13.3,"gap_pct":3.5}],"shape":"ranking","sql":"WITH bars AS\n(\n    SELECT\n        ticker,\n        date,\n        any(toFloat64(close)) AS c\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker IN ('SPY', 'AAPL', 'NVDA', 'KO')\n      AND date >= today() - 90\n      AND date <  today()\n    GROUP BY ticker, date\n),\nrets AS\n(\n    SELECT\n        ticker,\n        date,\n        log(c / lagInFrame(c) OVER (PARTITION BY ticker ORDER BY date)) AS r\n    FROM bars\n),\nranked AS\n(\n    SELECT\n        ticker,\n        r,\n        row_number() OVER (PARTITION BY ticker ORDER BY date DESC) AS sessions_back\n    FROM rets\n    WHERE isFinite(r)\n),\nrealized AS\n(\n    SELECT\n        ticker,\n        round(stddevSampIf(r, sessions_back <= 30) * sqrt(252) * 100, 1) AS rv_30d_pct\n    FROM ranked\n    GROUP BY ticker\n    HAVING countIf(sessions_back <= 30) >= 20\n),\nimplied AS\n(\n    SELECT\n        underlying_symbol                       AS ticker,\n        round(avg(implied_volatility) * 100, 1) AS iv_30_45d_pct,\n        count()                                 AS sample_count\n    FROM global_markets.options_greeks\n    WHERE underlying_symbol IN ('SPY', 'AAPL', 'NVDA', 'KO')\n      AND date >= today() - 45\n      AND iv_converged = 1\n      AND volume > 0\n      AND days_to_expiry BETWEEN 20 AND 45\n      AND underlying_close > 0\n      AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05\n    GROUP BY ticker\n    HAVING sample_count >= 25\n)\nSELECT\n    rl.ticker                                   AS ticker,\n    rl.rv_30d_pct                               AS rv_30d_pct,\n    im.iv_30_45d_pct                            AS iv_30_45d_pct,\n    round(im.iv_30_45d_pct - rl.rv_30d_pct, 1)  AS gap_pct\nFROM realized AS rl\nINNER JOIN implied AS im ON im.ticker = rl.ticker\nORDER BY iv_30_45d_pct DESC","computed_at":"2026-09-28T15:34:52.188176+00:00","elapsed":14.99616651}