{"slug":"highest-iv-rank-stocks","qid":"rank_distribution","label":"How the screened universe distributes across IV rank, latest session","post_title":"Highest IV Rank Stocks Right Now","post_url":"/blog/highest-iv-rank-stocks#q-rank_distribution","columns":["iv_rank_bucket","names","names_cumulative","median_iv_pct","median_gap_to_top_pct","lowest_iv_pct","highest_iv_pct"],"rows":[{"iv_rank_bucket":"80-90","names":4,"names_cumulative":4,"median_iv_pct":56.3,"median_gap_to_top_pct":0,"lowest_iv_pct":32.8,"highest_iv_pct":84.6},{"iv_rank_bucket":"70-80","names":7,"names_cumulative":11,"median_iv_pct":37.9,"median_gap_to_top_pct":-18.4,"lowest_iv_pct":30.6,"highest_iv_pct":74.7},{"iv_rank_bucket":"60-70","names":9,"names_cumulative":20,"median_iv_pct":50.1,"median_gap_to_top_pct":-6.2,"lowest_iv_pct":23,"highest_iv_pct":86.9},{"iv_rank_bucket":"50-60","names":25,"names_cumulative":45,"median_iv_pct":47.9,"median_gap_to_top_pct":-8.4,"lowest_iv_pct":22.9,"highest_iv_pct":83.5},{"iv_rank_bucket":"40-50","names":38,"names_cumulative":83,"median_iv_pct":47.5,"median_gap_to_top_pct":-8.8,"lowest_iv_pct":15.8,"highest_iv_pct":105.1},{"iv_rank_bucket":"30-40","names":39,"names_cumulative":122,"median_iv_pct":31,"median_gap_to_top_pct":-25.3,"lowest_iv_pct":15.2,"highest_iv_pct":113.3},{"iv_rank_bucket":"20-30","names":56,"names_cumulative":178,"median_iv_pct":31.5,"median_gap_to_top_pct":-24.8,"lowest_iv_pct":5.6,"highest_iv_pct":97.9},{"iv_rank_bucket":"10-20","names":31,"names_cumulative":209,"median_iv_pct":39.4,"median_gap_to_top_pct":-16.9,"lowest_iv_pct":12.2,"highest_iv_pct":85.4},{"iv_rank_bucket":"0-10","names":31,"names_cumulative":240,"median_iv_pct":33.8,"median_gap_to_top_pct":-22.5,"lowest_iv_pct":12.4,"highest_iv_pct":86.7}],"shape":"table","sql":"WITH per_session AS (\n    SELECT underlying_symbol AS u,\n           date AS d,\n           quantileExact(0.5)(implied_volatility) AS iv,\n           sum(volume) AS vol\n    FROM global_markets.options_greeks\n    WHERE date >= (SELECT max(date) FROM global_markets.options_greeks) - 380\n      AND iv_converged AND implied_volatility BETWEEN 0.02 AND 5\n      AND abs(strike_price / underlying_close - 1) <= 0.05\n      AND expiration_date BETWEEN date + 20 AND date + 60\n      AND underlying_symbol NOT IN ('SPCX','KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT','AMDL','NUAI','VXX','VIXY')\n    GROUP BY u, d\n    HAVING count() >= 10\n),\nranked AS (\n    SELECT u, d, iv, vol,\n           row_number() OVER w AS rn,\n           first_value(iv) OVER w AS iv_latest,\n           first_value(d) OVER w AS d_latest\n    FROM per_session\n    WINDOW w AS (PARTITION BY u ORDER BY d DESC)\n),\nagg AS (\n    SELECT u,\n           any(iv_latest) AS iv_cur,\n           any(d_latest) AS last_d,\n           count() AS sessions,\n           min(iv) AS iv_lo,\n           max(iv) AS iv_hi,\n           sumIf(vol, rn <= 20) AS vol_20d\n    FROM ranked\n    WHERE rn <= 252\n    GROUP BY u\n),\nscreened AS (\n    SELECT least(intDiv(toUInt16(floor(100 * (iv_cur - iv_lo) / (iv_hi - iv_lo))), 10), 9) AS b,\n           100 * iv_cur AS iv_now_pct\n    FROM agg\n    WHERE sessions >= 200\n      AND vol_20d >= 20000\n      AND iv_hi > iv_lo\n      AND last_d = (SELECT max(date) FROM global_markets.options_greeks)\n),\nbuckets AS (\n    SELECT b,\n           count() AS names,\n           round(quantileExact(0.5)(iv_now_pct), 1) AS median_iv_pct,\n           round(min(iv_now_pct), 1) AS lowest_iv_pct,\n           round(max(iv_now_pct), 1) AS highest_iv_pct\n    FROM screened\n    GROUP BY b\n)\nSELECT concat(toString(b * 10), '-', toString(b * 10 + 10)) AS iv_rank_bucket,\n       names,\n       sum(names) OVER (ORDER BY b DESC) AS names_cumulative,\n       median_iv_pct,\n       round(median_iv_pct - first_value(median_iv_pct) OVER (ORDER BY b DESC), 1) AS median_gap_to_top_pct,\n       lowest_iv_pct,\n       highest_iv_pct\nFROM buckets\nORDER BY b DESC","computed_at":"2026-08-15T04:11:45.660363+00:00","elapsed":21.672232933}