{"slug":"is-30-percent-iv-high","qid":"iv_rank_today","label":"IV rank against IV percentile: the latest reading inside each ticker's 52-week range","post_title":"Is 30% IV High? It Depends on the Ticker","post_url":"/blog/is-30-percent-iv-high#q-iv_rank_today","columns":["symbol","latest_iv_pct","low_52w_iv_pct","high_52w_iv_pct","iv_rank","iv_percentile"],"rows":[{"symbol":"AAPL","latest_iv_pct":45.9,"low_52w_iv_pct":19,"high_52w_iv_pct":45.9,"iv_rank":100,"iv_percentile":99.6},{"symbol":"KO","latest_iv_pct":20.6,"low_52w_iv_pct":13.9,"high_52w_iv_pct":25.1,"iv_rank":60.2,"iv_percentile":71.6},{"symbol":"COIN","latest_iv_pct":77.9,"low_52w_iv_pct":48.8,"high_52w_iv_pct":97.7,"iv_rank":59.6,"iv_percentile":89.2},{"symbol":"NVDA","latest_iv_pct":42.2,"low_52w_iv_pct":32.4,"high_52w_iv_pct":54.4,"iv_rank":44.6,"iv_percentile":58.4},{"symbol":"MSFT","latest_iv_pct":33.4,"low_52w_iv_pct":18.2,"high_52w_iv_pct":53.9,"iv_rank":42.6,"iv_percentile":78.4},{"symbol":"MSTR","latest_iv_pct":79,"low_52w_iv_pct":49.8,"high_52w_iv_pct":129.4,"iv_rank":36.6,"iv_percentile":75.6},{"symbol":"TSLA","latest_iv_pct":45.5,"low_52w_iv_pct":40.1,"high_52w_iv_pct":64.8,"iv_rank":22,"iv_percentile":32.4},{"symbol":"SPY","latest_iv_pct":14.6,"low_52w_iv_pct":12.3,"high_52w_iv_pct":26.3,"iv_rank":16.7,"iv_percentile":40.8}],"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('2025-08-01')\n      AND date <= toDate('2026-07-31')\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),\nlatest AS (\n    SELECT symbol,\n           argMax(iv_pct, date) AS latest_iv\n    FROM atm\n    GROUP BY symbol\n)\nSELECT a.symbol AS symbol,\n       round(any(l.latest_iv), 1) AS latest_iv_pct,\n       round(min(a.iv_pct), 1) AS low_52w_iv_pct,\n       round(max(a.iv_pct), 1) AS high_52w_iv_pct,\n       round(100 * (any(l.latest_iv) - min(a.iv_pct)) / (max(a.iv_pct) - min(a.iv_pct)), 1) AS iv_rank,\n       round(100 * countIf(a.iv_pct < l.latest_iv) / count(), 1) AS iv_percentile\nFROM atm AS a\nINNER JOIN latest AS l ON a.symbol = l.symbol\nGROUP BY a.symbol\nHAVING max(a.iv_pct) > min(a.iv_pct) AND count() >= 100\nORDER BY iv_rank DESC","computed_at":"2026-08-02T10:03:20.134478+00:00","elapsed":0.004175356}