Strasmore Research
Market recaps wey dey break am down Matt ConnorBy Matt Connor · Updated 2026-07-24 · data as of July 24, 2026 · refreshed weekly

Stocks wey get highest IV Rank now

See the US stocks and ETFs wey get highest IV rank based on their 52-week implied volatility range and IV percentile for the latest options session.

IV rank score na how one stock's implied volatility sit inside its own 52-week range, from zero for the range low go reach one hundred for the range high. If the reading dey near the top, e mean say options market dey price more future movement for that name than any other time for the past year; if e dey near the bottom, e mean say movement go small. The board below dey rank US stocks and ETFs wey get highest IV rank for the latest options session, wey be 2026-07-22, with IV percentile beside am, because the two numbers dey answer the same question with different arithmetic.

Highest IV rank stocks right now

QueryHighest IV rank for screened US underlyings, latest options session
The exact SQL behind every number
WITH per_session AS (
    SELECT underlying_symbol AS u,
           date AS d,
           quantileExact(0.5)(implied_volatility) AS iv,
           sum(volume) AS vol
    FROM global_markets.options_greeks
    WHERE date >= (SELECT max(date) FROM global_markets.options_greeks) - 380
      AND iv_converged AND implied_volatility BETWEEN 0.02 AND 5
      AND abs(strike_price / underlying_close - 1) <= 0.05
      AND expiration_date BETWEEN date + 20 AND date + 60
      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')
    GROUP BY u, d
    HAVING count() >= 10
),
ranked AS (
    SELECT u, d, iv, vol,
           row_number() OVER w AS rn,
           first_value(iv) OVER w AS iv_latest,
           first_value(d) OVER w AS d_latest
    FROM per_session
    WINDOW w AS (PARTITION BY u ORDER BY d DESC)
),
agg AS (
    SELECT u,
           any(iv_latest) AS iv_cur,
           any(d_latest) AS last_d,
           count() AS sessions,
           min(iv) AS iv_lo,
           max(iv) AS iv_hi,
           countIf(iv < iv_latest) AS below_now,
           sumIf(vol, rn <= 20) AS vol_20d
    FROM ranked
    WHERE rn <= 252
    GROUP BY u
)
SELECT u AS ticker,
       round(100 * iv_cur, 1) AS iv_now_pct,
       round(100 * (iv_cur - iv_lo) / (iv_hi - iv_lo), 1) AS iv_rank,
       round(100 * below_now / sessions, 1) AS iv_percentile,
       round(100 * iv_lo, 1) AS iv_52w_low_pct,
       round(100 * iv_hi, 1) AS iv_52w_high_pct,
       toString(last_d) AS session_date
FROM agg
WHERE sessions >= 200
  AND vol_20d >= 20000
  AND iv_hi > iv_lo
  AND last_d = (SELECT max(date) FROM global_markets.options_greeks)
ORDER BY iv_rank DESC, vol_20d DESC, ticker
LIMIT 15

Take the top row. MO close with at-the-money implied volatility of 31.7% against 52-week range wey run from 12.9% to 31.7%. Dat mean say its IV rank na 100 and its IV percentile na 99.6.

When rank dey top of the scale, e get one meaning: the latest session's implied volatility na the highest reading wey dem see for the whole window. Dat number no mean say the stock volatile for absolute terms. E just dey talk how the stock dey behave compared to itself.

Dis distinction dey important well-well. For all the top rank decile for the whole screened universe, current implied volatility dey run from 27.3% to 174.2%, with a median of 79.4%. One quiet stock wey reach the ceiling of its own quiet range go get same rank as one violent stock wey reach the ceiling of its violent range. For the absolute level instead of the relative one, the highest implied volatility stocks board dey rank the same tape based on raw IV.

IV rank vs IV percentile

Dis two numbers dey compare today's implied volatility against de same 52-week history, but dem dey count am differently.

  • IV rank na (current IV minus de 52-week low) divide by (de 52-week high minus de low), dem dey show am as percentage. E only look de current value and de two extremes for de window.
  • IV percentile na de share of de last 252 sessions wey de implied volatility close below today's level. E look every single session inside de window.

If one violent session happen inside de year, e go set ceiling wey de range-based rank no go ever forget. But de count-based percentile go treat am as just one single tick among 252. De panel below dey sort one direction of dis disagreement: IV percentile minus IV rank, de biggest ones dey top. Names wey get de opposite shape, wey rank dey higher than percentile, na separate screen dem be and dem no dey appear here.

QueryWhere IV percentile dey far pass IV rank, latest session
The exact SQL behind every number
WITH per_session AS (
    SELECT underlying_symbol AS u,
           date AS d,
           quantileExact(0.5)(implied_volatility) AS iv,
           sum(volume) AS vol
    FROM global_markets.options_greeks
    WHERE date >= (SELECT max(date) FROM global_markets.options_greeks) - 380
      AND iv_converged AND implied_volatility BETWEEN 0.02 AND 5
      AND abs(strike_price / underlying_close - 1) <= 0.05
      AND expiration_date BETWEEN date + 20 AND date + 60
      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')
    GROUP BY u, d
    HAVING count() >= 10
),
ranked AS (
    SELECT u, d, iv, vol,
           row_number() OVER w AS rn,
           first_value(iv) OVER w AS iv_latest,
           first_value(d) OVER w AS d_latest
    FROM per_session
    WINDOW w AS (PARTITION BY u ORDER BY d DESC)
),
agg AS (
    SELECT u,
           any(iv_latest) AS iv_cur,
           any(d_latest) AS last_d,
           count() AS sessions,
           min(iv) AS iv_lo,
           max(iv) AS iv_hi,
           countIf(iv < iv_latest) AS below_now,
           sumIf(vol, rn <= 20) AS vol_20d
    FROM ranked
    WHERE rn <= 252
    GROUP BY u
),
board AS (
    SELECT u,
           round(100 * iv_cur, 1) AS iv_now_pct,
           round(100 * (iv_cur - iv_lo) / (iv_hi - iv_lo), 1) AS iv_rank,
           round(100 * below_now / sessions, 1) AS iv_percentile,
           round(100 * iv_hi, 1) AS iv_52w_high_pct
    FROM agg
    WHERE sessions >= 200
      AND vol_20d >= 20000
      AND iv_hi > iv_lo
      AND last_d = (SELECT max(date) FROM global_markets.options_greeks)
)
SELECT u AS ticker,
       iv_now_pct,
       iv_rank,
       iv_percentile,
       round(iv_percentile - iv_rank, 1) AS percentile_minus_rank,
       iv_52w_high_pct
FROM board
ORDER BY percentile_minus_rank DESC, iv_now_pct DESC, ticker
LIMIT 12

De widest gap for dis direction belong to AMZN: IV percentile na 92.1 against IV rank na 26.7, de spread na 65.4 points for de same session and de same data. Current implied volatility for there na 43%, and de 52-week high na 99.4%. Percentile dey count sessions, and most of de sessions for dis name inside de window dey quieter than de latest one. Rank dey measure distance to de extremes, and dat 52-week high still dey above de latest reading. Same data, two different answers.

No single number be de correct one. Rank dey answer how close de latest reading dey to de extremes. Percentile dey answer how unusual de level be against de typical session.

Wetin high IV rank really be

QueryTop-ranked name IV by week, with 52-week high and low
The exact SQL behind every number
WITH per_session AS (
    SELECT underlying_symbol AS u,
           date AS d,
           quantileExact(0.5)(implied_volatility) AS iv,
           sum(volume) AS vol
    FROM global_markets.options_greeks
    WHERE date >= (SELECT max(date) FROM global_markets.options_greeks) - 380
      AND iv_converged AND implied_volatility BETWEEN 0.02 AND 5
      AND abs(strike_price / underlying_close - 1) <= 0.05
      AND expiration_date BETWEEN date + 20 AND date + 60
      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')
    GROUP BY u, d
    HAVING count() >= 10
),
ranked AS (
    SELECT u, d, iv, vol,
           row_number() OVER w AS rn,
           first_value(iv) OVER w AS iv_latest,
           first_value(d) OVER w AS d_latest
    FROM per_session
    WINDOW w AS (PARTITION BY u ORDER BY d DESC)
),
agg AS (
    SELECT u,
           any(iv_latest) AS iv_cur,
           any(d_latest) AS last_d,
           count() AS sessions,
           min(iv) AS iv_lo,
           max(iv) AS iv_hi,
           sumIf(vol, rn <= 20) AS vol_20d
    FROM ranked
    WHERE rn <= 252
    GROUP BY u
),
leader AS (
    SELECT u, iv_lo, iv_hi
    FROM agg
    WHERE sessions >= 200
      AND vol_20d >= 20000
      AND iv_hi > iv_lo
      AND last_d = (SELECT max(date) FROM global_markets.options_greeks)
    ORDER BY round(100 * (iv_cur - iv_lo) / (iv_hi - iv_lo), 1) DESC, vol_20d DESC, u
    LIMIT 1
)
SELECT toString(toMonday(r.d)) AS week,
       round(100 * quantileExact(0.5)(r.iv), 1) AS iv_pct,
       round(100 * any(l.iv_hi), 1) AS iv_52w_high_pct,
       round(100 * any(l.iv_lo), 1) AS iv_52w_low_pct
FROM ranked AS r
INNER JOIN leader AS l ON r.u = l.u
WHERE r.rn <= 252
GROUP BY week
HAVING uniqExact(r.d) >= 3
    OR max(r.d) = (SELECT max(date) FROM global_markets.options_greeks)
ORDER BY week

Dis na di weekly path for MO, di board top name, wey dem draw dem 52-week high and low as flat reference lines. Every point wey dem plot na di median of di daily readings for dat week, so di line dey inside di daily high-low band by design instead of to touch any of di reference lines. Di measurement start for 22.3% and finish di week with di latest session for 30.9%, against a ceiling of 31.7% and a floor of 12.9%. Di single session wey di rank score na di daily reading of 31.7% for di board above. High IV rank for top of di scale na just dis picture: di latest reading dey sit for di upper edge of im own band, wherever dat band dey.

Di shape matter as much as di score. One name wey climb for months and one wey gap to di same level inside one week go get di same rank. For wetin high reading dey tend to do after scheduled event, see IV crush measured on real earnings.

How the whole market dey for IV rank

QueryHow the screened universe distribute across IV rank, latest session
The exact SQL behind every number
WITH per_session AS (
    SELECT underlying_symbol AS u,
           date AS d,
           quantileExact(0.5)(implied_volatility) AS iv,
           sum(volume) AS vol
    FROM global_markets.options_greeks
    WHERE date >= (SELECT max(date) FROM global_markets.options_greeks) - 380
      AND iv_converged AND implied_volatility BETWEEN 0.02 AND 5
      AND abs(strike_price / underlying_close - 1) <= 0.05
      AND expiration_date BETWEEN date + 20 AND date + 60
      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')
    GROUP BY u, d
    HAVING count() >= 10
),
ranked AS (
    SELECT u, d, iv, vol,
           row_number() OVER w AS rn,
           first_value(iv) OVER w AS iv_latest,
           first_value(d) OVER w AS d_latest
    FROM per_session
    WINDOW w AS (PARTITION BY u ORDER BY d DESC)
),
agg AS (
    SELECT u,
           any(iv_latest) AS iv_cur,
           any(d_latest) AS last_d,
           count() AS sessions,
           min(iv) AS iv_lo,
           max(iv) AS iv_hi,
           sumIf(vol, rn <= 20) AS vol_20d
    FROM ranked
    WHERE rn <= 252
    GROUP BY u
),
screened AS (
    SELECT least(intDiv(toUInt16(floor(100 * (iv_cur - iv_lo) / (iv_hi - iv_lo))), 10), 9) AS b,
           100 * iv_cur AS iv_now_pct
    FROM agg
    WHERE sessions >= 200
      AND vol_20d >= 20000
      AND iv_hi > iv_lo
      AND last_d = (SELECT max(date) FROM global_markets.options_greeks)
),
buckets AS (
    SELECT b,
           count() AS names,
           round(quantileExact(0.5)(iv_now_pct), 1) AS median_iv_pct,
           round(min(iv_now_pct), 1) AS lowest_iv_pct,
           round(max(iv_now_pct), 1) AS highest_iv_pct
    FROM screened
    GROUP BY b
)
SELECT concat(toString(b * 10), '-', toString(b * 10 + 10)) AS iv_rank_bucket,
       names,
       sum(names) OVER (ORDER BY b DESC) AS names_cumulative,
       median_iv_pct,
       round(median_iv_pct - first_value(median_iv_pct) OVER (ORDER BY b DESC), 1) AS median_gap_to_top_pct,
       lowest_iv_pct,
       highest_iv_pct
FROM buckets
ORDER BY b DESC

228 names pass the liquidity and history floors for this session. If we group dem by rank deciles, 30 of dem dey for 90-100 band and 6 dey for 0-10 band for the other end. Median current implied volatility dey drop as rank dey fall, from 79.4% for the top band down to 37% for the 0-10 band for the bottom, and the gap column dey measure every band against the median for the top band. No look only one step; look how the slope dey move across the whole table: bands wey get only few names get noisy medians, and two adjacent bands fit invert.

You need the distribution to understand the context for any single reading. High rank no mean anything by itself until you know how many other names dey carry the same rank at the same time.

IV rank for de names wey many people dey follow

QueryIV rank and IV percentile for twelve widely held tickers, latest session
The exact SQL behind every number
WITH per_session AS (
    SELECT underlying_symbol AS u,
           date AS d,
           quantileExact(0.5)(implied_volatility) AS iv
    FROM global_markets.options_greeks
    WHERE date >= (SELECT max(date) FROM global_markets.options_greeks) - 380
      AND underlying_symbol IN ('SPY','QQQ','AAPL','MSFT','AMZN','META','NVDA','AMD','TSLA','COIN','MSTR','PLTR')
      AND iv_converged AND implied_volatility BETWEEN 0.02 AND 5
      AND abs(strike_price / underlying_close - 1) <= 0.05
      AND expiration_date BETWEEN date + 20 AND date + 60
    GROUP BY u, d
    HAVING count() >= 10
),
ranked AS (
    SELECT u, d, iv,
           row_number() OVER w AS rn,
           first_value(iv) OVER w AS iv_latest,
           first_value(d) OVER w AS d_latest
    FROM per_session
    WINDOW w AS (PARTITION BY u ORDER BY d DESC)
),
agg AS (
    SELECT u,
           any(iv_latest) AS iv_cur,
           any(d_latest) AS last_d,
           count() AS sessions,
           min(iv) AS iv_lo,
           max(iv) AS iv_hi,
           countIf(iv < iv_latest) AS below_now
    FROM ranked
    WHERE rn <= 252
    GROUP BY u
)
SELECT u AS ticker,
       round(100 * iv_cur, 1) AS iv_now_pct,
       round(100 * (iv_cur - iv_lo) / (iv_hi - iv_lo), 1) AS iv_rank,
       round(100 * below_now / sessions, 1) AS iv_percentile,
       round(100 * iv_lo, 1) AS iv_52w_low_pct,
       round(100 * iv_hi, 1) AS iv_52w_high_pct,
       toString(last_d) AS session_date
FROM agg
WHERE sessions >= 200
  AND iv_hi > iv_lo
  AND last_d = (SELECT max(date) FROM global_markets.options_greeks)
ORDER BY iv_rank DESC, ticker

De same measurement for twelve tickers wey many people dey follow. AMD get de highest IV rank for de group at 83.7, with current implied volatility of 85.8%. TSLA dey de other end of de list with a rank of 0 on implied volatility of 37%. Look how de rank and percentile columns fit far from each other inside one row, de same range-versus-count arithmetic wey de divergence panel dey measure.

Each of dese names get im own IV page: NVDA implied volatility, TSLA implied volatility, AAPL implied volatility, and AMD implied volatility all get full session history and term structure. For de concept wey dey under every score for dis page, start with wetin implied volatility mean.

Wey dem dey use measure am

Every number wey dey here come from one source: the daily options greeks file. Dem get one stored row for every contract for every session, wey cover US listed equity and ETF options.

  • One IV per name per session. Na the median implied volatility of that name's near-the-money contracts dem dey take, meaning strikes wey dey within 5% of the closing stock price, wey go expire 20 to 60 calendar days out. Dem use median instead of average, so one mispriced contract no fit change the reading.
  • A session count only when at least 10 contracts pass those filters. Dem dey drop thin sessions instead of to publish dem.
  • Only converged solves. Dem dey solve implied volatility from the option price, and the file dey flag if the solve converge. Dem dey exclude unconverged rows, as well as readings wey below 2% or above 500%. Unconverged solve na numerical failure, no be market price.
  • The window na the last 252 sessions wey dey available for that name inside a 380-calendar-day lookback. A name need at least 200 measured sessions before e fit appear anywhere for this page.
  • IV rank na (current minus window minimum) divided by (window maximum minus window minimum), times 100. IV percentile na the count of window sessions wey get implied volatility wey strictly below the current session's, divided by the number of sessions.
  • Liquidity floor. A name must trade at least 20,000 option contracts across its last 20 measured sessions before e fit enter the screened universe. The household-name panel dey apply the session floor, the history floor, and the same latest-session filter, but dem no dey apply the volume floor, because dem name the twelve tickers explicitly instead of to screen dem.
  • Leveraged, inverse, and volatility-futures funds dey excluded from the screen because of one explicit list. Any fund wey build to move at three times its index go carry three times the implied volatility by construction, and e go crowd out real single names. Products wey hold VIX futures instead of shares dey for the same list, because their implied volatility dey describe a futures curve instead of a company.
  • The weekly path panel dey plot medians, no be single sessions. Every point na the median of that week's daily readings for the top-ranked name, so the plotted line go always stay inside the daily high and low band by construction. Dem dey drop weeks wey get fewer than three measured sessions, with one exception: the week wey hold the latest session go always plot, even if na one day long.
  • Wetin the file no contain. Same-day-expiry (0DTE) contracts and cash-settled index options no dey inside this dataset, so 0DTE volatility spike no go ever reach these numbers. SPY and QQQ dey appear as ordinary ETFs. There is also no open interest field anywhere for this warehouse, so every liquidity threshold wey dey above na traded contract volume, no be open interest.
  • The date stamp na the real session. The greeks file dey settle a few sessions behind the equity tape, so every board dey carry the date of the session wey e use, and every row for every board come from that one session. The weekly path panel na the exception: e dey draw one year of history behind the top-ranked name. These no be live quotes.

FAQ

Wetin be IV rank?

IV rank dey show where stock current implied volatility dey inside its own 52-week range, from zero for low end to one hundred for high end. The formula na current IV minus 52-week low, divide by 52-week high minus the low. E dey compare one name against its own history, e no dey compare am against other stocks; na why two names wey get different volatility fit get the same rank.

Which IV rank good for selling options?

No rank dey make selling correct, and this page no dey give any one. High rank mean say option premiums dey near the top of wetin that name charge over the past year; low rank mean say e dey near the bottom. Sellers generally prefer high readings and buyers prefer low ones, but both sides get risk say the move the stock do fit different from the move wey dem price.

IV rank vs IV percentile, wetin be the difference?

IV rank dey use only today's implied volatility and the two extremes of the 52-week range. IV percentile dey count how many of the last 252 sessions close below today's reading. If one single extreme session happen, e go stretch the range and pull rank down, but e no go change percentile much; because of this, the two fit disagree by tens of points for the same name, as the panel for above show.

Where I fit check IV rank for free?

This page na free IV rank checker: e dey refresh on a schedule against the full US options tape and e dey publish the exact SQL wey dey behind every cell. Individual names get their own pages, and the volatility skew page dey explain how implied volatility dey change across strikes on one single expiry.


Every panel for here dey store its own query. Open one to audit the measurement from start to finish, or run the same IV rank screen over any window and any universe for the Strasmore terminal.