Reading Implied Volatility From Historical Option Chains
Implied volatility is the most useful number on an option chain and the most commonly misunderstood. It is worth being precise about what it is, because the misunderstanding leads directly to losing money on trades that were directionally correct.
What it actually is
Implied volatility is the volatility figure that, fed into a pricing model, reproduces the option’s observed market price.
That is the entire definition, and the direction matters. You do not compute IV from the underlying’s movement — that is realised volatility, a different number. IV is backed out of the premium. It is not a forecast; it is a price, quoted in volatility units.
So when IV is “high”, the correct reading is that options are expensive relative to what the model says they should cost at lower volatility. Whether that is justified is a separate question, and the whole game for volatility traders.
Computing it from recorded prices
There is no closed-form inverse of Black-Scholes for volatility, so it is solved numerically:
from math import log, sqrt, exp
from statistics import NormalDist
N = NormalDist().cdf
def bs_call(S, K, T, r, sigma):
if T <= 0 or sigma <= 0:
return max(0.0, S - K)
d1 = (log(S / K) + (r + sigma ** 2 / 2) * T) / (sigma * sqrt(T))
d2 = d1 - sigma * sqrt(T)
return S * N(d1) - K * exp(-r * T) * N(d2)
def implied_vol(price, S, K, T, r=0.065, option_type="CE"):
"""Bisection. Slower than Newton-Raphson but it cannot diverge, which
matters on real data where some quotes are nonsense."""
intrinsic = max(0.0, S - K) if option_type == "CE" else max(0.0, K - S)
if price <= intrinsic:
return None # no time value; IV is meaningless
lo, hi = 1e-6, 5.0
for _ in range(100):
mid = (lo + hi) / 2
theo = bs_call(S, K, T, r, mid)
if option_type == "PE": # put-call parity
theo = theo - S + K * exp(-r * T)
if abs(theo - price) < 1e-6:
return mid
if theo < price:
lo = mid
else:
hi = mid
return (lo + hi) / 2
Computing it yourself rather than taking a vendor figure has a real advantage: you control the interest rate, the underlying source and the time-to-expiry convention. Vendors differ on all three, which is why two sources will quote different IV for the same contract and both be defensible.
Return None rather than a number when there is no time value. A deep in-the-money option trading at intrinsic has no IV to recover, and forcing a figure produces garbage that propagates silently into whatever you compute next.
The event pattern, which is where the money is lost
The single most important IV behaviour is what happens around scheduled events — results, policy decisions, budgets.
Ahead of the event, implied volatility rises. Nobody knows the outcome, uncertainty is priced, premiums inflate. Then the event resolves and IV collapses, often within minutes.
The consequence catches people repeatedly: you buy an option expecting a move, the move happens in your direction, and you lose money anyway. The volatility component fell further than the directional component gained. For an out-of-the-money option, which is almost entirely time value, this is routine rather than exceptional.
This is testable on recorded data, and worth testing yourself rather than believing:
- Pick a scheduled event date.
- Pull the at-the-money contracts for the expiry spanning it.
- Compute IV for each session in the run-up and the session after.
- Compare the premium change through the event against what pure time decay would have predicted.
The gap is the volatility term, and on event days it is usually several times larger than theta.
Smile and skew
Black-Scholes assumes one volatility for all strikes. Markets disagree, visibly.
Plot IV against strike for a single expiry and you get a curve, not a line — the volatility smile. In index options it is usually a skew: out-of-the-money puts carry higher IV than equivalent calls, because demand for downside protection is structurally greater than for upside speculation.
Two practical consequences:
- Quoting “the IV” of a chain is imprecise. It depends which strike. At-the-money IV is the usual convention; say so explicitly.
- The skew’s shape carries information. It steepens when protection is being bid and flattens when it is not, and that changes on a different rhythm from the level.
Term structure
The same logic across expiries rather than strikes. Near-dated and far-dated contracts on the same underlying carry different IV.
Normally the curve slopes upward — more time, more uncertainty. It inverts when something specific is expected soon: near-dated IV spikes above far-dated because the uncertainty is concentrated in the immediate window rather than spread out.
Inversion is one of the more reliable signals that the market is pricing a specific near-term event, and it is visible directly in the data without any interpretation.
Doing this on real data
All of the above needs recorded premiums for contracts that have already expired, at an interval fine enough to see intraday behaviour — IV crush happens in minutes, so daily data will show you that it happened but not how.
That is the awkward part: live option chains drop contracts at expiry, removing exactly the observations these studies need. The MoneyTicks archive keeps them — 1-minute OHLC with open interest for every expired NIFTY, BANK NIFTY and SENSEX contract, NIFTY and BANK NIFTY from August 2021.
You will also need the underlying level at matching timestamps, and a rate. For Indian index options the overnight rate is a reasonable default; the choice matters less than being consistent about it.
What to take away
Implied volatility is a price, not a prediction. Compute it yourself so you control the assumptions. Its behaviour around events dominates time decay for most of an option’s life, which is why directionally correct trades lose money more often than people expect. And it varies by strike and by expiry in ways that carry real information — but only if you look at the surface rather than a single number.
Related: what expired contract data shows about premium decay covers how IV and theta interact over a contract’s life, and backtesting an options strategy in Python covers the harness.
Frequently asked questions
What is implied volatility in options?
The volatility figure that, put into an option pricing model, reproduces the option's actual traded price. It is not a forecast and not a measurement of past movement — it is the market's price for uncertainty, expressed in volatility units, backed out of the premium rather than computed from the underlying.
How do I calculate implied volatility from historical option prices?
Numerically. Take the recorded premium, strike, time to expiry, an interest rate and the underlying level, then solve Black-Scholes for the volatility that reproduces that premium. There is no closed form, so it is solved by bisection or Newton-Raphson — a few lines of Python.
What is IV crush?
The collapse in implied volatility once a scheduled event resolves. Ahead of the event, uncertainty inflates premiums; the moment the outcome is known, that premium evaporates. Option buyers frequently lose money on IV crush even when the direction was right, because the volatility loss exceeds the directional gain.
Why is implied volatility different at different strikes?
Because the Black-Scholes assumption of constant volatility does not hold. Plotting IV against strike gives the volatility smile or skew. In index options, out-of-the-money puts usually carry higher IV than equivalent calls, reflecting demand for downside protection.
Can I get historical implied volatility for Indian options?
You can compute it from recorded option prices, which is often better than a vendor-supplied figure because you control the model, the rate and the underlying source. MoneyTicks stores 1-minute premiums with open interest for expired NIFTY, BANK NIFTY and SENSEX contracts, which is the input the calculation needs.