IV rank vs IV percentile formula explained
IV rank vs IV percentile: see both formulas, one hand-checked example, and why the same ticker fit show 18 for one but 70 for the other.
IV rank versus IV percentile na two arithmetic calculation wey dem run on the same data. IV rank dey measure where today’s implied volatility dey inside the 52-week range, from the lowest reading reach the highest one. IV percentile dey count the percentage of trading days for the lookback window wey close below today’s reading. The same ticker, for the same afternoon, fit score 18 for one and 70 for the other.
Di formula dem, written out
IV rank = (current IV minus the 52 week low IV) / (the 52 week high IV minus the 52 week low IV) x 100
IV percentile = (trading days for the window wey IV dey below today IV) / (total trading days for the window) x 100
Both dey fall between 0 and 100. Both need the same two inputs: daily implied volatility series for the stock, plus lookback window, usually 252 trading days. Implied volatility na the option market annualized estimate of how far the stock fit move. Dem dey calculate am from live option prices. wetin implied volatility dey measure explain the matter from the beginning.
The main difference na how much of the window each one dey read. IV rank dey look only two days out of 252: the highest and the lowest. Everything wey dey between dem na just background. IV percentile dey give every day equal weight and e no dey ask how far apart the readings be. One na position inside a range. The other na count of days.
Example wey you fit calculate by hand
Take one made-up ten-day IV series, with one reading for each session: 22, 24, 21, 60, 26, 25, 23, 27, 24, and today’s reading at 28. The low na 21 and the high na 60.
IV rank: (28 - 21) / (60 - 21) x 100 = 7 / 39 x 100 = 17.9.
Seven of the ten readings — 22, 24, 21, 26, 25, 23 and 24 — dey below 28. So IV percentile: 7 / 10 x 100 = 70.0.
IV rank of 17.9 mean say volatility cheap. IV percentile of 70 mean say volatility don dey lower than this on most days for the window. Both descriptions correct for the same ten numbers.
Now change one value. Replace 60 with 30, and leave the other nine readings as dem be. IV rank go become (28 - 21) / (30 - 21) x 100 = 77.8. IV percentile no go move; e still go be 70.0. One session — the one wey set the high — get value of 60 points for IV rank, but e get no value at all for IV percentile.
Na this be the structural weak point of IV rank. One spike inside the window, whether na earnings gap or one-day scare, fit make the denominator wide and keep the rank near the floor for the next twelve months. This fit continue long after the spike don comot from the option chain. When the two scores differ sharply, e usually mean say one outlier dey inside the window. Percentile then give the more accurate picture of where volatility actually spend most of its time. IV rank better when the range smooth and both extremes get more than one session. Neither number talk anything about direction.
Wetin real IV series dey look like
Na this raw material both formulas dey use. The panel below dey build daily at-the-money implied volatility reading for AAPL from contracts wey get 20 to 45 days before expiry and dey within 5% of the share price. Then e dey average those readings by week.
The exact SQL behind every number
WITH daily AS
(
SELECT
date,
avg(toFloat64(implied_volatility)) * 100 AS atm_iv
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date >= today() - 371
AND iv_converged = 1
AND volume > 0
AND days_to_expiry BETWEEN 20 AND 45
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05
GROUP BY date
)
SELECT
toString(toMonday(date)) AS week,
formatDateTime(toMonday(date), '%b %e, %Y') AS week_label,
round(avg(atm_iv), 2) AS aapl_atm_iv_pct,
round(min(atm_iv), 2) AS week_low_iv_pct,
round(max(atm_iv), 2) AS week_high_iv_pct
FROM daily
GROUP BY toMonday(date)
ORDER BY toMonday(date)The series get 54 weekly points, starting from the week of Jul 28, 2025, wey average 30.03%, reach the week of Aug 3, 2026 at 27.7%. The shape of that line dey decide whether rank and percentile go agree. If line get one tall spike wey stand alone, the two fit separate. If line dey move inside one stable band, dem go remain close. Our AAPL implied volatility page dey follow this name over time. For question about the absolute level without any history, see 30% IV high?.
IV rank vs IV percentile for eight tickers
Same formulas, same lookback, eight liquid names, one session. The gap column na the absolute distance between the two scores.
The exact SQL behind every number
WITH daily AS
(
SELECT
underlying_symbol AS symbol,
date,
avg(toFloat64(implied_volatility)) * 100 AS atm_iv
FROM global_markets.options_greeks
WHERE underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'TSLA', 'SPY', 'QQQ', 'KO')
AND date >= today() - 371
AND iv_converged = 1
AND volume > 0
AND days_to_expiry BETWEEN 20 AND 45
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05
GROUP BY symbol, date
),
latest AS
(
SELECT
symbol,
argMax(atm_iv, date) AS iv_now,
max(date) AS as_of
FROM daily
GROUP BY symbol
)
SELECT
d.symbol AS symbol,
round(100 * (l.iv_now - min(d.atm_iv)) / nullIf(max(d.atm_iv) - min(d.atm_iv), 0), 1) AS iv_rank,
round(100 * countIf(d.atm_iv < l.iv_now) / count(), 1) AS iv_percentile,
round(abs(iv_rank - iv_percentile), 1) AS gap,
formatDateTime(any(l.as_of), '%b %e, %Y') AS as_of_label
FROM daily AS d
INNER JOIN latest AS l ON l.symbol = d.symbol
GROUP BY d.symbol, l.iv_now
ORDER BY gap DESCAs of Aug 3, 2026, the biggest difference for the table na 35.6 points, for AAPL, where IV rank dey read 32.4 against IV percentile of 68. For the other side of the table, TSLA keep the two within 6.5 points of each other. Screen wey use one number go return different list from screen wey use the other one. Na the practical reason why you need know which one your platform dey print. The stocks with the highest IV rank screen dey sort the market based on the first one.
The range inputs behind every rank for that table
Put the current, low and high columns inside the rank formula, and the rank column above go come out again.
The exact SQL behind every number
WITH daily AS
(
SELECT
underlying_symbol AS symbol,
date,
avg(toFloat64(implied_volatility)) * 100 AS atm_iv
FROM global_markets.options_greeks
WHERE underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'TSLA', 'SPY', 'QQQ', 'KO')
AND date >= today() - 371
AND iv_converged = 1
AND volume > 0
AND days_to_expiry BETWEEN 20 AND 45
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05
GROUP BY symbol, date
),
latest AS
(
SELECT
symbol,
argMax(atm_iv, date) AS iv_now,
max(date) AS as_of
FROM daily
GROUP BY symbol
)
SELECT
d.symbol AS symbol,
round(l.iv_now, 2) AS current_iv_pct,
round(min(d.atm_iv), 2) AS low_52w_iv_pct,
round(max(d.atm_iv), 2) AS high_52w_iv_pct,
count() AS observations,
formatDateTime(any(l.as_of), '%b %e, %Y') AS as_of_label
FROM daily AS d
INNER JOIN latest AS l ON l.symbol = d.symbol
GROUP BY d.symbol, l.iv_now
ORDER BY current_iv_pct DESCWhy two platforms dey report different values for the same ticker
No formula get confusion. Na the inputs get difference. Vendors hardly publish which IV series dem dey use, and the common choices dey for opposite ends of the chain: 30 day constant maturity IV, wey dem interpolate between the two expiries on both sides of 30 days, or the front month at the money contract, wey dey move more sharply. Some platforms dey average the whole chain instead. This panel dey run one stock through three definitions of the IV input over the same 52 weeks.
The exact SQL behind every number
WITH contracts AS
(
SELECT
date,
days_to_expiry,
abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) AS moneyness,
toFloat64(implied_volatility) * 100 AS iv_pct
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date >= today() - 371
AND iv_converged = 1
AND volume > 0
),
defs AS
(
SELECT
spec.1 AS iv_series,
spec.2 AS min_dte,
spec.3 AS max_dte,
spec.4 AS max_moneyness
FROM
(
SELECT arrayJoin([
('Near 30 day ATM', 20, 45, 0.05),
('Front month ATM', 1, 19, 0.05),
('Wide net, any expiry', 1, 400, 0.30)
]) AS spec
)
),
daily AS
(
SELECT
s.iv_series AS iv_series,
c.date AS date,
avg(c.iv_pct) AS atm_iv
FROM contracts AS c
CROSS JOIN defs AS s
WHERE c.days_to_expiry BETWEEN s.min_dte AND s.max_dte
AND c.moneyness < s.max_moneyness
GROUP BY iv_series, date
),
latest AS
(
SELECT
iv_series,
argMax(atm_iv, date) AS iv_now
FROM daily
GROUP BY iv_series
)
SELECT
d.iv_series AS iv_series,
round(l.iv_now, 2) AS current_iv_pct,
round(min(d.atm_iv), 2) AS low_52w_iv_pct,
round(max(d.atm_iv), 2) AS high_52w_iv_pct,
round(100 * (l.iv_now - min(d.atm_iv)) / nullIf(max(d.atm_iv) - min(d.atm_iv), 0), 1) AS iv_rank,
round(100 * countIf(d.atm_iv < l.iv_now) / count(), 1) AS iv_percentile
FROM daily AS d
INNER JOIN latest AS l ON l.iv_series = d.iv_series
GROUP BY d.iv_series, l.iv_now
ORDER BY current_iv_pct DESCFor the latest session, Wide net, any expiry dey print 37.6% while Near 30 day ATM dey print 27.7%, and their IV ranks land for 23.1 and 32.4. Na the same stock, same session and same formula, but different definition of the input.
The second lever na the lookback length. 52 weeks na the convention, and plenty platforms dey offer 30, 60 or 90 day settings together with am.
The exact SQL behind every number
WITH daily AS
(
SELECT
date,
avg(toFloat64(implied_volatility)) * 100 AS atm_iv
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date >= today() - 800
AND iv_converged = 1
AND volume > 0
AND days_to_expiry BETWEEN 20 AND 45
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05
GROUP BY date
),
latest AS
(
SELECT
argMax(atm_iv, date) AS iv_now,
max(date) AS as_of
FROM daily
),
windows AS
(
SELECT
spec.1 AS lookback_label,
spec.2 AS lookback_days
FROM
(
SELECT arrayJoin([
('1 month', 30),
('3 months', 90),
('6 months', 180),
('12 months', 371),
('24 months', 742)
]) AS spec
)
)
SELECT
w.lookback_label AS lookback_label,
round(100 * (l.iv_now - min(d.atm_iv)) / nullIf(max(d.atm_iv) - min(d.atm_iv), 0), 1) AS iv_rank,
round(100 * countIf(d.atm_iv < l.iv_now) / count(), 1) AS iv_percentile,
count() AS observations
FROM daily AS d
CROSS JOIN windows AS w
CROSS JOIN latest AS l
WHERE d.date >= l.as_of - w.lookback_days
GROUP BY w.lookback_label, w.lookback_days, l.iv_now
ORDER BY w.lookback_daysWith the 1 month lookback, this stock score 0.4 for IV rank and 4.8 for IV percentile. If you stretch the window to 24 months, the same session score 23.4 and 63.3. Nothing about the option chain change between those rows. Na only the window change. When two screens no agree about one ticker, na the lookback setting and the IV series be the first two places to check.
How dem dey use the two numbers
Both readings dey work as filter when you dey choose strategy, but dem no be forecast. Traders wey dey sell premium, including covered calls and cash secured puts, dey usually look for high readings. For that level, option price dey reflect more movement than the stock normally don show within the period. Traders wey dey buy premium dey look at the low end, where the same logic dey work the other way.
For this purpose, relative score better pass the raw IV number. 40% IV fit be normal for one stock but extreme for another. When you compare stock against its own history, you remove that problem. High implied volatility good? depend on the trade-offs for each side.
But make you note one thing wey the numbers no fit answer for you. High reading fit still go higher. Rank of 95 on Monday fit become 60 on Friday even if your position no change. Neither score dey show direction. Elevated IV mean say market don price in a big move, but e no show which way the move go happen.
FAQ
IV rank or IV percentile better?
Dem dey answer different questions. IV percentile dey more reliable when the lookback window get one very sharp spike, because e dey count days instead of comparing against one extreme value. IV rank dey easier to understand when the range get plenty data, because e tell you directly how close today dey to the twelve-month high.
Wetin be high IV rank?
Most trading desks dey treat readings above 50 as the upper half of a stock own range. Dem dey treat readings above 80 as truly elevated for that particular name. The score na relative measure by design, so rank of 80 for quiet consumer staple and rank of 80 for volatile growth name fit represent very different absolute IV levels.
IV rank and IV percentile dey use the same lookback?
Normally, both dey use 252 trading days. But most platforms allow adjustment, and default setting dey vary by vendor. The panel above show one stock getting different scores at each window length. Na the first thing to check when two tools no agree.
IV rank fit be 0 or 100?
Yes. IV rank reach 100 on the day stock prints new 52-week high for implied volatility. E reach 0 when stock prints new low. This one happen because today reading na one endpoint of the range. IV percentile hardly ever reach either extreme, because today own session dey inside the denominator.
Why my IV rank change when IV no move?
The window dey roll forward every session. When old spike drop out of the trailing 52 weeks, the high inside the denominator reset to lower value. Rank go rise even when today IV no change. IV crush explain the other common surprise: IV itself dropping immediately after earnings report.
Every panel for here get the exact SQL underneath am. Change the ticker inside any one of dem to score another name for the Strasmore terminal.