{"slug":"iv-rank-vs-iv-percentile","qid":"lookback_sensitivity","label":"The same session scored at five different lookback windows","post_title":"IV Rank vs IV Percentile: Formulas Explained","post_url":"/blog/iv-rank-vs-iv-percentile#q-lookback_sensitivity","columns":["lookback_label","iv_rank","iv_percentile","observations"],"rows":[{"lookback_label":"1 month","iv_rank":9.8,"iv_percentile":34.8,"observations":23},{"lookback_label":"3 months","iv_rank":12.4,"iv_percentile":41.9,"observations":62},{"lookback_label":"6 months","iv_rank":12.4,"iv_percentile":31.2,"observations":125},{"lookback_label":"12 months","iv_rank":21.9,"iv_percentile":46.1,"observations":256},{"lookback_label":"24 months","iv_rank":17.7,"iv_percentile":41.4,"observations":510}],"shape":"ranking","sql":"WITH daily AS\n(\n    SELECT\n        date,\n        avg(toFloat64(implied_volatility)) * 100 AS atm_iv\n    FROM global_markets.options_greeks\n    WHERE underlying_symbol = 'AAPL'\n      AND date >= today() - 800\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 date\n),\nlatest AS\n(\n    SELECT\n        argMax(atm_iv, date) AS iv_now,\n        max(date)            AS as_of\n    FROM daily\n),\nwindows AS\n(\n    SELECT\n        spec.1 AS lookback_label,\n        spec.2 AS lookback_days\n    FROM\n    (\n        SELECT arrayJoin([\n            ('1 month', 30),\n            ('3 months', 90),\n            ('6 months', 180),\n            ('12 months', 371),\n            ('24 months', 742)\n        ]) AS spec\n    )\n)\nSELECT\n    w.lookback_label AS lookback_label,\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    count()                                                                               AS observations\nFROM daily AS d\nCROSS JOIN windows AS w\nCROSS JOIN latest AS l\nWHERE d.date >= l.as_of - w.lookback_days\nGROUP BY w.lookback_label, w.lookback_days, l.iv_now\nORDER BY w.lookback_days","computed_at":"2026-08-22T04:14:21.470381+00:00","elapsed":2.712292787}