{"slug":"iv-rank-vs-iv-percentile","qid":"iv_definitions","label":"One stock, one session, three definitions of the IV input","post_title":"IV Rank vs IV Percentile: Formulas Explained","post_url":"/blog/iv-rank-vs-iv-percentile#q-iv_definitions","columns":["iv_series","current_iv_pct","low_52w_iv_pct","high_52w_iv_pct","iv_rank","iv_percentile"],"rows":[{"iv_series":"Wide net, any expiry","current_iv_pct":32.07,"low_52w_iv_pct":26.15,"high_52w_iv_pct":75.78,"iv_rank":11.9,"iv_percentile":31.6},{"iv_series":"Front month ATM","current_iv_pct":26.14,"low_52w_iv_pct":16.63,"high_52w_iv_pct":107.16,"iv_rank":10.5,"iv_percentile":38.3},{"iv_series":"Near 30 day ATM","current_iv_pct":24.89,"low_52w_iv_pct":18.98,"high_52w_iv_pct":45.92,"iv_rank":21.9,"iv_percentile":45.5}],"shape":"table","sql":"WITH contracts AS\n(\n    SELECT\n        date,\n        days_to_expiry,\n        abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) AS moneyness,\n        toFloat64(implied_volatility) * 100                            AS iv_pct\n    FROM global_markets.options_greeks\n    WHERE underlying_symbol = 'AAPL'\n      AND date >= today() - 371\n      AND iv_converged = 1\n      AND volume > 0\n),\ndefs AS\n(\n    SELECT\n        spec.1 AS iv_series,\n        spec.2 AS min_dte,\n        spec.3 AS max_dte,\n        spec.4 AS max_moneyness\n    FROM\n    (\n        SELECT arrayJoin([\n            ('Near 30 day ATM', 20, 45, 0.05),\n            ('Front month ATM', 1, 19, 0.05),\n            ('Wide net, any expiry', 1, 400, 0.30)\n        ]) AS spec\n    )\n),\ndaily AS\n(\n    SELECT\n        s.iv_series AS iv_series,\n        c.date      AS date,\n        avg(c.iv_pct) AS atm_iv\n    FROM contracts AS c\n    CROSS JOIN defs AS s\n    WHERE c.days_to_expiry BETWEEN s.min_dte AND s.max_dte\n      AND c.moneyness < s.max_moneyness\n    GROUP BY iv_series, date\n),\nlatest AS\n(\n    SELECT\n        iv_series,\n        argMax(atm_iv, date) AS iv_now\n    FROM daily\n    GROUP BY iv_series\n)\nSELECT\n    d.iv_series             AS iv_series,\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    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\nFROM daily AS d\nINNER JOIN latest AS l ON l.iv_series = d.iv_series\nGROUP BY d.iv_series, l.iv_now\nORDER BY current_iv_pct DESC","computed_at":"2026-08-22T04:14:18.657738+00:00","elapsed":2.542324464}