{"slug":"iv-rank-vs-iv-percentile","qid":"iv_range_inputs","label":"Current, 52 week low and 52 week high ATM IV for each name","post_title":"IV Rank vs IV Percentile: Formulas Explained","post_url":"/blog/iv-rank-vs-iv-percentile#q-iv_range_inputs","columns":["symbol","current_iv_pct","low_52w_iv_pct","high_52w_iv_pct","observations","as_of_label"],"rows":[{"symbol":"TSLA","current_iv_pct":41.76,"low_52w_iv_pct":38.11,"high_52w_iv_pct":64.77,"observations":253,"as_of_label":"Aug 19, 2026"},{"symbol":"NVDA","current_iv_pct":39.3,"low_52w_iv_pct":32.43,"high_52w_iv_pct":54.36,"observations":253,"as_of_label":"Aug 19, 2026"},{"symbol":"AMZN","current_iv_pct":29.27,"low_52w_iv_pct":23.63,"high_52w_iv_pct":74.42,"observations":252,"as_of_label":"Aug 19, 2026"},{"symbol":"MSFT","current_iv_pct":25.84,"low_52w_iv_pct":18.35,"high_52w_iv_pct":53.93,"observations":253,"as_of_label":"Aug 19, 2026"},{"symbol":"AAPL","current_iv_pct":24.89,"low_52w_iv_pct":18.98,"high_52w_iv_pct":45.92,"observations":253,"as_of_label":"Aug 19, 2026"},{"symbol":"QQQ","current_iv_pct":19.38,"low_52w_iv_pct":16.06,"high_52w_iv_pct":29.23,"observations":253,"as_of_label":"Aug 19, 2026"},{"symbol":"KO","current_iv_pct":18.22,"low_52w_iv_pct":13.9,"high_52w_iv_pct":25.06,"observations":253,"as_of_label":"Aug 19, 2026"},{"symbol":"SPY","current_iv_pct":12.98,"low_52w_iv_pct":12.28,"high_52w_iv_pct":26.3,"observations":253,"as_of_label":"Aug 19, 2026"}],"shape":"table","sql":"WITH daily AS\n(\n    SELECT\n        underlying_symbol                        AS symbol,\n        date,\n        avg(toFloat64(implied_volatility)) * 100 AS atm_iv\n    FROM global_markets.options_greeks\n    WHERE underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'TSLA', 'SPY', 'QQQ', 'KO')\n      AND date >= today() - 371\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 symbol, date\n),\nlatest AS\n(\n    SELECT\n        symbol,\n        argMax(atm_iv, date) AS iv_now,\n        max(date)            AS as_of\n    FROM daily\n    GROUP BY symbol\n)\nSELECT\n    d.symbol                                  AS symbol,\n    round(l.iv_now, 2)                        AS current_iv_pct,\n    round(min(d.atm_iv), 2)                   AS low_52w_iv_pct,\n    round(max(d.atm_iv), 2)                   AS high_52w_iv_pct,\n    count()                                   AS observations,\n    formatDateTime(any(l.as_of), '%b %e, %Y') AS as_of_label\nFROM daily AS d\nINNER JOIN latest AS l ON l.symbol = d.symbol\nGROUP BY d.symbol, l.iv_now\nORDER BY current_iv_pct DESC","computed_at":"2026-08-22T04:14:16.006281+00:00","elapsed":9.812271056}