Volatility & IV

Black-Scholes Model: Pricing Options and Finding Mispricings

·11 min read

The Black-Scholes model is the foundation of modern option pricing. It gives you a theoretical fair value for European-style options by combining five market inputs: the underlying asset price, the strike price, time remaining until expiry, the risk-free interest rate, and the volatility of the underlying. Traders use it to spot mispricings—when the market price drifts far from the model’s estimate, an opportunity may exist.

Why theoretical pricing matters to traders

In real trading, market prices don’t always reflect what an option “should” be worth. Sometimes an option trades at ₹45 when the model says it’s worth ₹42. Other times it’s the reverse. The gap between model price and market price is where money hides. By building a reliable pricing framework, you gain the edge to recognize when the market has mispriced an instrument, either overvaluing it (selling opportunity) or undervaluing it (buying opportunity).

This matters especially for retail traders working with liquid contracts like NIFTY or BANKNIFTY weeklies. These indices move fast, volatility shifts hourly, and the model must update constantly. The Black-Scholes formula is the standard because it’s elegant, fast, and accurate enough for most practical purposes when the underlying behaves like a typical stock or index.

The five inputs to the model

Every Black-Scholes calculation begins with five parameters:

  1. Spot price (S) — the current price of the underlying asset. For NIFTY, this is the index level right now. For a single stock, it’s the share price.

  2. Strike price (K) — the price at which the option holder has the right to buy (call) or sell (put). NIFTY strikes are listed in 50-point intervals; you might evaluate a 25,100 strike when the index is at 25,050.

  3. Time to expiration (T) — the fraction of a year remaining until the option expires. If you have 7 days left and use 252 trading days per year, then T = 7/252 ≈ 0.028. This one matters hugely: options decay as expiry approaches, and the model captures that decay.

  4. Risk-free rate (r) — the annual interest rate you’d earn on a safe investment (typically a government bond rate). In India, traders often use the RBI repo rate or the 10-year government security yield. A typical value might be 0.06 (6% annually). This rate affects how much the strike price is worth in present-value terms.

  5. Volatility (σ, or sigma) — the expected annual standard deviation of the underlying’s returns. This is the trickiest input because it’s unobservable. You either estimate it from historical price moves (historical volatility) or back-solve it from market prices of traded options (implied volatility). If NIFTY has moved ±1% per week for the past month, you might estimate annual volatility at 25–35%.

The Black-Scholes formula in plain terms

The model calculates two intermediate values, d1 and d2:

d1 = (ln(S/K) + (r + 0.5*σ²)*T) / (σ*√T)
d2 = d1 - σ*√T

Think of d1 and d2 as standardized measures of how far the spot price is from the strike, adjusted for interest rates and volatility. The logarithm of the spot-to-strike ratio tells you whether the option is in-the-money or out-of-the-money in percentage terms. The other terms smooth in the effect of time, rates, and expected movement.

For a call option, the price is:

Call price = S * N(d1) - K * e^(-r*T) * N(d2)

For a put option, the price is:

Put price = K * e^(-r*T) * N(-d2) - S * N(-d1)

Here, N(x) is the cumulative normal distribution function—it converts the d-values into probabilities between 0 and 1. The e^(-r*T) term discounts the strike back to present value, accounting for the cost of holding cash until expiry.

A worked example with NIFTY

Suppose NIFTY is trading at 25,200 and you want to price a 25,400 call option expiring in 14 days. Here’s what you feed the model:

  • S = 25,200 (current NIFTY level)
  • K = 25,400 (strike price)
  • T = 14/252 ≈ 0.0556 (roughly 2 weeks as a fraction of the year)
  • r = 0.065 (6.5% annual RBI repo rate)
  • σ = 0.32 (32% annualized volatility, typical for NIFTY)

First, compute d1:

d1 = (ln(25200/25400) + (0.065 + 0.5*0.32²)*0.0556) / (0.32*√0.0556)
d1 = (ln(0.9921) + (0.065 + 0.0512)*0.0556) / (0.32*0.2357)
d1 = (-0.0079 + 0.00626) / 0.0754
d1 ≈ -0.024

Then, d2:

d2 = -0.024 - 0.32*√0.0556
d2 = -0.024 - 0.0755
d2 ≈ -0.0995

Now apply the normal cumulative distribution. N(-0.024) ≈ 0.490 and N(-0.0995) ≈ 0.460. The call price works out to roughly:

Call = 25200*0.490 - 25400*e^(-0.065*0.0556)*0.460
Call ≈ 12,348 - 25400*0.9964*0.460
Call ≈ 12,348 - 11,663
Call ≈ ₹685 (in rupees, scaled to the lot size)

In practice, one NIFTY contract is worth 75 units of the index, so if the formula gave ₹9.13 per point, you’d multiply by 75 to get the actual premium in rupees. This number is what the model says the option should trade at today. If the market is selling it for ₹800, the market is overpriced. If it’s ₹550, the market is cheap.

A global example: S&P 500 index option

Suppose you’re evaluating an SPX (S&P 500) call option with these parameters:

  • S = 5,650 (spot S&P 500 level)
  • K = 5,700 (strike)
  • T = 30/252 ≈ 0.119 (about one month)
  • r = 0.05 (5% US risk-free rate)
  • σ = 0.18 (18% annualized volatility)

Computing d1:

d1 = (ln(5650/5700) + (0.05 + 0.5*0.18²)*0.119) / (0.18*√0.119)
d1 = (ln(0.9912) + (0.05 + 0.0162)*0.119) / (0.18*0.345)
d1 = (-0.00883 + 0.00749) / 0.0621
d1 ≈ -0.0214

Then d2:

d2 = -0.0214 - 0.18*√0.119 ≈ -0.0214 - 0.0621 ≈ -0.0835

With N(-0.0214) ≈ 0.491 and N(-0.0835) ≈ 0.467, the call price is roughly 51.3 index points, or $51.30 per contract (SPX contracts are index-weighted, not per-share).

Why volatility is the key uncertainty

Of the five inputs, four are relatively easy to observe or agree upon: spot price, strike, calendar days, and interest rates are all public and objective. Volatility is different. You can’t see it directly. You have to estimate it.

Historical volatility—computed from past price movements—tells you what has happened. Implied volatility—backed out from option prices trading in the market—tells you what traders expect will happen. Often they disagree. If historical volatility is 20% but implied volatility is 30%, the market is pricing in more uncertainty ahead than recent history would suggest. This can signal upcoming earnings, economic data, or geopolitical shocks.

The Black-Scholes formula is extremely sensitive to changes in volatility. A 5-point swing in implied volatility can shift an option’s price by 10% or more. This is why traders obsess over the volatility surface (the term structure of implied vols across strikes and maturities) and why managing volatility exposure is critical.

Moving from theory to practice: finding mispricings

Once you calculate a theoretical price, comparison is straightforward. Suppose the 25,400 NIFTY call you priced at ₹685 is actually trading at ₹720 in the market. The market is offering a higher price than the model suggests, which typically means one of three things:

  1. The market expects volatility to be higher than your estimate (traders are pricing in more movement).
  2. There’s genuine scarcity—not many sellers at that strike, so buyers bid it up.
  3. Your estimate of one or more inputs is off.

A savvy trader would sell that call at ₹720, pocket the ₹35 excess premium, and hedge the directional risk by buying the underlying or a delta-equivalent position. This is the essence of options arbitrage.

Conversely, if the market price falls to ₹640, you might buy it, sell a higher strike to offset some risk, and wait for the mispricing to close or for volatility to expand to justify the cheap premium.

Limitations and when the model breaks down

The Black-Scholes model assumes European-style exercise (options can only be exercised at expiry, not before), no dividends, constant volatility over the option’s life, and continuous, smooth price movement. Real markets violate all of these.

American-style options (callable any day before expiry) are worth more than the Black-Scholes price, especially for puts deep in-the-money or calls on high-dividend stocks. Dividends reduce the value of calls and increase the value of puts. Volatility is not constant—it clusters and spikes unpredictably. Stock prices jump at earnings or news; they don’t move smoothly.

Despite these gaps, Black-Scholes remains the industry standard because it’s fast, interpretable, and wrong in known, measurable ways. Traders use it as a baseline and apply adjustments for dividends, early exercise risk, and volatility smile (the fact that out-of-the-money and in-the-money options trade at different implied vols than at-the-money ones). Many use more sophisticated models (binomial trees, Monte Carlo simulation, stochastic volatility models) for situations where the gaps matter most.

Building intuition: how the components interact

When the spot price rises, call prices rise and put prices fall. The model captures this via the S term in the call formula and through d1 and d2.

When volatility rises, both call and put prices rise. This is counterintuitive for many beginners: higher uncertainty is worth more to option buyers (upside or downside could be huge) and more costly for option sellers (they’re short the uncertainty). The formula weights volatility through σ in the denominator of d1/d2 and through the √T term—more time amplifies volatility’s effect.

When time decays (T shrinks), options lose value. An out-of-the-money option decays quickly; an in-the-money option decays more slowly. This is why theta, the Greek measuring time decay, is so important in practical trading.

When interest rates rise, call prices rise slightly and put prices fall slightly (the discount rate effect via the e^(-r*T) term). This is usually the weakest of the five inputs’ effects on options pricing.

Implementing the model in code

The formula is straightforward to code. In Python, using NumPy and SciPy:

import numpy as np
from scipy.stats import norm

def price_call_option(S, K, T, r, sigma):
    d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T))
    d2 = d1 - sigma * np.sqrt(T)
    call_price = S * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2)
    return call_price

def price_put_option(S, K, T, r, sigma):
    d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T))
    d2 = d1 - sigma * np.sqrt(T)
    put_price = K * np.exp(-r * T) * norm.cdf(-d2) - S * norm.cdf(-d1)
    return put_price

spot = 25200
strike = 25400
days_to_expiry = 14
rate = 0.065
vol = 0.32

T = days_to_expiry / 252
call = price_call_option(spot, strike, T, rate, vol)
print(f"Fair call price: ₹{call:.2f} per point")

Run this on your own data and you’ll quickly build intuition for how each input changes the outcome. Try bumping volatility from 0.30 to 0.35 and watch the call price jump. Reduce T from 14 days to 7 days and see it shrink. This hands-on experimentation is the fastest way to internalize the model.

From fair value to trading decisions

Knowing the theoretical price is only the beginning. You must also decide: Is the mispricing large enough to trade on after accounting for transaction costs? Do you have the risk tolerance to hedge? Is liquidity sufficient to actually exit the position when the mispricing tightens? Are there corporate actions (dividends, stock splits) or other tail risks the model doesn’t account for?

The Black-Scholes model is a tool, not a trading system. It gives you a language and a framework to compare market prices to theory. Smart traders use it to form hypotheses about mispricings, then validate those hypotheses with other analysis—implied volatility term structure, Greeks sensitivity, correlation with other assets, and fundamental catalysts.

Over time, as you price thousands of options and watch which predictions pan out, you’ll develop a feel for where the model is reliable and where it consistently misses. You’ll learn which volatility forecasts are most valuable and which are noise. That blend of quantitative rigor and judgment is what separates profitable option traders from the rest.

Key takeaways

  • The Black-Scholes formula calculates a theoretical fair value for European options using five inputs: spot price, strike, time to expiry, risk-free rate, and volatility.
  • To find trading opportunities, compare the model price to the market price; large gaps suggest mispricings.
  • Volatility is the hardest input to estimate and the most impactful on option prices; implied volatility reflects what traders expect, while historical volatility shows what happened.
  • The formula works through two intermediate calculations (d1 and d2) that adjust the moneyness of the option for time, rates, and volatility uncertainty.
  • Both call and put prices rise when volatility increases; calls rise when spot rises, puts fall when spot rises.
  • Time decay, captured in the T variable, means options lose value as expiry approaches, especially for out-of-the-money contracts.
  • The model assumes European exercise and smooth price movement; real markets (American-style, dividend-paying, jumpy) deviate, so traders adjust the baseline price for known deviations.
  • Implementing the formula in Python takes just a few lines; the real skill is learning which of its assumptions matter most for your trading.

Further reading

Power-Trader Python ile Opsiyon Trading Orijinal by Hayden Van Der; Black-Scholes With Python: A Guide to Algorithmic Options Trading by Z Library; Algorithmic Trading Pro: Options Trading With Python by Learn to Trade Like a Snake.

The daily dispatch
One note a morning.

Each day’s reading-room note, the market outlook, and the strategies that gained the most last session — one short email.