{"slug":"iv-rank-vs-iv-percentile","qid":"rank_vs_percentile","label":"IV rank vs IV percentile, eight liquid names, 52 week lookback","post_title":"IV Rank vs IV Percentile: Formulas Explained","post_url":"/blog/iv-rank-vs-iv-percentile#q-rank_vs_percentile","columns":["symbol","iv_rank","iv_percentile","gap","as_of_label"],"rows":[{"symbol":"AAPL","iv_rank":21.9,"iv_percentile":45.5,"gap":23.6,"as_of_label":"Aug 19, 2026"},{"symbol":"AMZN","iv_rank":11.1,"iv_percentile":23,"gap":11.9,"as_of_label":"Aug 19, 2026"},{"symbol":"NVDA","iv_rank":31.3,"iv_percentile":41.5,"gap":10.2,"as_of_label":"Aug 19, 2026"},{"symbol":"MSFT","iv_rank":21.1,"iv_percentile":30,"gap":8.9,"as_of_label":"Aug 19, 2026"},{"symbol":"QQQ","iv_rank":25.2,"iv_percentile":32.4,"gap":7.2,"as_of_label":"Aug 19, 2026"},{"symbol":"TSLA","iv_rank":13.7,"iv_percentile":7.1,"gap":6.6,"as_of_label":"Aug 19, 2026"},{"symbol":"SPY","iv_rank":5,"iv_percentile":9.5,"gap":4.5,"as_of_label":"Aug 19, 2026"},{"symbol":"KO","iv_rank":38.7,"iv_percentile":37.2,"gap":1.5,"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(100 * (l.iv_now - min(d.atm_iv)) / nullIf(max(d.atm_iv) - min(d.atm_iv), 0), 1) AS iv_rank,\n    round(100 * countIf(d.atm_iv < l.iv_now) / count(), 1)                                AS iv_percentile,\n    round(abs(iv_rank - iv_percentile), 1)                                                AS gap,\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 gap DESC","computed_at":"2026-08-22T04:14:06.092625+00:00","elapsed":9.797497633}