Highest IV Rank Stocks Right Now
The highest IV rank stocks right now, scored against each name's own 52-week implied volatility range, with IV percentile beside it and the method shown.
IV rank scores where a stock's implied volatility sits inside its own 52-week range, from 0 at the range low to 100 at the range high. A reading near the top means the options market is pricing more future movement into that name than at any point in the past year of sessions; a reading near the bottom means the least. The board below ranks the US stocks and ETFs with the highest IV rank on the latest measured options session, dated 2026-07-20, with IV percentile beside it, since the two numbers answer the same question with different arithmetic.
Highest IV rank stocks right now
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 15Take the top row. NOW closed with at-the-money implied volatility of 76% against a 52-week range running from 22% to 76%. That puts its IV rank at 100 and its IV percentile at 99.6.
A rank at the very top of the scale has one exact meaning: the latest session's implied volatility is the highest reading anywhere in the measured window. Nothing in that number says the stock is volatile in absolute terms. It is a statement about the name against itself.
The distinction does real work. Across the top rank decile of the whole screened universe, current implied volatility runs from 28.1% to 172.7%, with a median of 79.3%. A quiet stock at the ceiling of its own quiet range scores the same as a violent one at the ceiling of its violent range. For the absolute level instead of the relative one, the highest implied volatility stocks board ranks the same tape on raw IV.
IV rank vs IV percentile
Both numbers place today's implied volatility against the same 52-week history, and they count it differently.
- IV rank is (current IV minus the 52-week low) divided by (the 52-week high minus the low), stated as a percentage. It reads only the current value and the window's two extremes.
- IV percentile is the share of the last 252 sessions whose implied volatility closed below today's. It reads every session in the window.
One violent session inside the year sets a ceiling that the range-based rank never forgets, while the count-based percentile treats it as a single tick among 252. The panel below sorts one direction of that disagreement: IV percentile minus IV rank, largest first. Names carrying the opposite shape, rank above percentile, are a separate screen and do not appear here.
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 12The widest gap in that direction belongs to AMZN: an IV percentile of 89.7 against an IV rank of 25.9, a spread of 63.8 points on the same session and the same data. Current implied volatility there is 42.4%, and the 52-week high is 99.4%. Percentile counts sessions, and most of the window's sessions on that name were quieter than the latest one. Rank measures distance to the extremes, and that 52-week high still sits above the latest reading. Same data, two answers.
Neither number is the correct one. Rank answers how close the latest reading sits to the extremes. Percentile answers how unusual it is against the typical session.
What a high IV rank actually looks like
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 weekThat is the weekly path of NOW, the board's top name, with its 52-week high and low drawn as flat reference lines. Each plotted point is the median of that week's daily readings, so the line sits inside the daily high-low band by construction rather than touching either reference line. The measurement opens the window at 29.2% and closes the week holding the latest session at 76%, against a ceiling of 76% and a floor of 22%. The single session the rank scores is the daily reading of 76% on the board above. An IV rank at the top of the scale is that picture, and nothing more: the latest reading sitting at the upper edge of its own band, wherever that band happens to be.
The shape matters as much as the score. A name that climbed for months and one that gapped to the same level in a week print the identical rank. For what a high reading tends to do after a scheduled event, see IV crush measured on real earnings.
Where the whole market sits on IV rank
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 DESC231 names cleared the liquidity and history floors on this session. Grouped into rank deciles, 30 of them sit in the 90-100 band and 3 sit in the 0-10 band at the other end. Median current implied volatility trends down as rank falls, from 79.3% in the top band to 36.6% in the 0-10 band at the bottom, and the gap column measures every band against the top band's median. Read the slope across the whole table rather than any single step: bands holding only a few names carry noisy medians, and two adjacent bands can invert.
The distribution is the context a single reading needs. A high-sounding rank means little on its own until you know how many other names are carrying one at the same time.
IV rank for the names most people follow
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, tickerThe same measurement on twelve widely held tickers. AMD carries the highest IV rank of the group at 86.3, on current implied volatility of 87.5%. SPY sits at the other end of the list with a rank of 25.6 on implied volatility of 15.2%. Note how far the rank and percentile columns can sit apart within one row, the same range-versus-count arithmetic the divergence panel measures.
Each of these names has a standing IV page of its own: NVDA implied volatility, TSLA implied volatility, AAPL implied volatility, and AMD implied volatility each carry a full session history and a term structure. For the concept underneath every score on this page, start with what implied volatility is.
How this is measured
Every number here comes from one source: the daily options greeks file, one stored row per contract per session, covering US listed equity and ETF options.
- One IV per name per session. The median implied volatility of that name's near-the-money contracts, meaning strikes within 5% of the closing stock price, expiring 20 to 60 calendar days out. A median rather than an average, so one mispriced contract cannot move the reading.
- A session counts only when at least 10 contracts clear those filters. Thin sessions are dropped rather than published.
- Only converged solves. Implied volatility is solved from the option price, and the file flags whether the solve converged. Unconverged rows are excluded, as are readings below 2% or above 500%. An unconverged solve is a numerical failure, not a market price.
- The window is the last 252 sessions available for that name inside a 380-calendar-day lookback. A name needs at least 200 measured sessions to appear anywhere on this page.
- IV rank is (current minus window minimum) divided by (window maximum minus window minimum), times 100. IV percentile is the count of window sessions with implied volatility strictly below the current session's, divided by the number of sessions.
- Liquidity floor. A name must have traded at least 20,000 option contracts across its last 20 measured sessions to enter the screened universe. The household-name panel applies the session floor, the history floor, and the same latest-session filter, but not the volume floor, since its twelve tickers are named explicitly rather than screened.
- Leveraged, inverse, and volatility-futures funds are excluded from the screen by an explicit list. A fund built to move at three times its index carries three times the implied volatility by construction and would crowd out real single names. Products holding VIX futures rather than shares sit on the same list, since their implied volatility describes a futures curve rather than a company.
- The weekly path panel plots medians, not single sessions. Each point is the median of that week's daily readings for the top-ranked name, so the plotted line stays inside the daily high and low band by construction. Weeks with fewer than three measured sessions are dropped, with one exception: the week holding the latest session always plots, even when it is one day long.
- What the file does not contain. Same-day-expiry (0DTE) contracts and cash-settled index options are outside this dataset, so a 0DTE volatility spike never reaches these numbers. SPY and QQQ appear as ordinary ETFs. There is also no open interest field anywhere in this warehouse, so every liquidity threshold above is traded contract volume, not open interest.
- The date stamp is the real session. The greeks file settles a few sessions behind the equity tape, so each board carries the date of the session it used, and every row on every board comes from that one session. The weekly path panel is the deliberate exception: it draws a year of history behind the top-ranked name. These are not live quotes.
FAQ
What is IV rank?
IV rank scores where a stock's current implied volatility sits inside its own 52-week range, from 0 at the low to 100 at the high. The formula is the current IV minus the 52-week low, divided by the 52-week high minus the low. It compares a name against its own history and never against other stocks, which is why two names with wildly different volatility can carry the same rank.
What is a good IV rank for selling options?
There is no rank that makes selling correct, and this page gives none. A high rank means option premiums sit near the top of what that name has charged over the past year; a low rank means near the bottom. Sellers generally prefer high readings and buyers low ones, and both sides carry the risk that the move the stock delivers differs from the move that was priced.
IV rank vs IV percentile, what is the difference?
IV rank uses only today's implied volatility and the two extremes of the 52-week range. IV percentile counts how many of the last 252 sessions closed below today's reading. A single extreme session stretches the range and pulls rank down while barely moving percentile, and the two can then disagree by tens of points on the same name, as the panel above shows.
Where can I check IV rank for free?
This page is a free IV rank checker: it refreshes on a schedule against the full US options tape and publishes the exact SQL behind every cell. Individual names have standing pages, and the volatility skew page covers how implied volatility varies across strikes on a single expiry.
Every panel here stores its own query. Open one to audit the measurement end to end, or run the same IV rank screen over any window and any universe on the Strasmore terminal.