{"slug":"is-30-percent-iv-high","qid":"iv_band_next_day","label":"Implied volatility band against the move the underlying made the next session","post_title":"Is 30% IV High? It Depends on the Ticker","post_url":"/blog/is-30-percent-iv-high#q-iv_band_next_day","columns":["iv_band","sample_size","implied_daily_move_pct","median_next_move_pct","p90_next_move_pct"],"rows":[{"iv_band":"under 20%","sample_size":935,"implied_daily_move_pct":1.04,"median_next_move_pct":0.53,"p90_next_move_pct":1.5},{"iv_band":"20 to 30%","sample_size":877,"implied_daily_move_pct":1.56,"median_next_move_pct":0.78,"p90_next_move_pct":2.38},{"iv_band":"30 to 45%","sample_size":494,"implied_daily_move_pct":2.4,"median_next_move_pct":1.29,"p90_next_move_pct":3.7},{"iv_band":"45 to 70%","sample_size":1057,"implied_daily_move_pct":3.58,"median_next_move_pct":2.28,"p90_next_move_pct":6.06},{"iv_band":"70% and up","sample_size":629,"implied_daily_move_pct":5.27,"median_next_move_pct":3.3,"p90_next_move_pct":9.15}],"shape":"table","sql":"WITH atm AS (\n    SELECT underlying_symbol AS symbol,\n           date,\n           avg(implied_volatility) * 100 AS iv_pct\n    FROM global_markets.options_greeks\n    WHERE underlying_symbol IN ('SPY', 'KO', 'AAPL', 'MSFT', 'NVDA', 'TSLA', 'COIN', 'MSTR')\n      AND date >= toDate('2024-08-01')\n      AND date <= toDate('2026-07-30')\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    GROUP BY symbol, date\n),\npx AS (\n    SELECT underlying_symbol AS symbol,\n           date,\n           any(toFloat64(underlying_close)) AS close\n    FROM global_markets.options_greeks\n    WHERE underlying_symbol IN ('SPY', 'KO', 'AAPL', 'MSFT', 'NVDA', 'TSLA', 'COIN', 'MSTR')\n      AND date >= toDate('2024-08-01')\n      AND date <= toDate('2026-07-31')\n      AND iv_converged = 1\n      AND underlying_close > 0\n    GROUP BY symbol, date\n),\nnxt AS (\n    SELECT symbol,\n           date,\n           close,\n           leadInFrame(close) OVER (PARTITION BY symbol ORDER BY date ASC\n                                    ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) AS next_close\n    FROM px\n)\nSELECT multiIf(a.iv_pct < 20, 'under 20%',\n               a.iv_pct < 30, '20 to 30%',\n               a.iv_pct < 45, '30 to 45%',\n               a.iv_pct < 70, '45 to 70%',\n               '70% and up') AS iv_band,\n       count() AS sample_size,\n       round(avg(a.iv_pct) / sqrt(252), 2) AS implied_daily_move_pct,\n       round(quantileDeterministic(0.5)(100 * abs(n.next_close / n.close - 1),\n                                        cityHash64(concat(a.symbol, toString(a.date)))), 2) AS median_next_move_pct,\n       round(quantileDeterministic(0.9)(100 * abs(n.next_close / n.close - 1),\n                                        cityHash64(concat(a.symbol, toString(a.date)))), 2) AS p90_next_move_pct\nFROM atm AS a\nINNER JOIN nxt AS n ON a.symbol = n.symbol AND a.date = n.date\nWHERE n.next_close > 0\nGROUP BY iv_band\nHAVING count() >= 50\nORDER BY min(a.iv_pct)","computed_at":"2026-08-02T10:03:20.316480+00:00","elapsed":0.004905392}