Lesson 5 of 15

Implied Volatility (Bisection)

Implied Volatility

The implied volatility (IV) is the volatility value σ that, when plugged into Black-Scholes, produces the observed market price of the option. (Recall that σ here denotes volatility, as is standard in finance — not the sigmoid function from ML.)

Unlike the other Black-Scholes inputs (S, K, T, r), volatility is not directly observable. Traders quote options prices in terms of their implied volatility.

The Inverse Problem

We want to find σ such that: BS(S,K,T,r,σ)=market price\text{BS}(S, K, T, r, \sigma) = \text{market price}

There is no closed-form solution, so we use a root-finding algorithm.

Bisection Method

The bisection method works on a function f(σ) = BS(σ) - market_price:

  1. Start with a bracket [lo, hi] = [0.001, 5.0] — we know IV lies in this range
  2. Compute mid = (lo + hi) / 2
  3. If f(mid) > 0, the true σ is lower: hi = mid
  4. If f(mid) < 0, the true σ is higher: lo = mid
  5. Repeat until |f(mid)| < 1e-6 or 100 iterations

This works because BS price is monotonically increasing in σ.

The Volatility Smile and Skew

In theory (under Black-Scholes assumptions), all options on the same underlying with the same expiry should have the same implied volatility regardless of strike. In practice, they do not.

Volatility smile: OTM puts and OTM calls both have higher IV than ATM options, forming a U-shaped curve when plotting IV vs. strike. This is common in FX markets.

Volatility skew: OTM puts have significantly higher IV than OTM calls, creating a downward-sloping curve. This is the dominant pattern in equity index options and reflects the market pricing crash risk (investors pay more for downside protection).

The smile/skew exists because real return distributions have fat tails and negative skewness — violations of the lognormal assumption in Black-Scholes. Models like stochastic volatility (Heston) and local volatility (Dupire) were developed specifically to capture these patterns.

Example

If the market shows a call at 10.4506 for S=K=100, T=1, r=0.05, then the implied vol is approximately 0.2000 (20%).

Python runtime loading...
Loading...
Click "Run" to execute your code.