Latticework

Command Palette

Search for a command to run...

Quantitative Finance Fundamentals

Black-Scholes Intuition

22 min

Explanation

Black-Scholes is the classic closed-form formula for pricing a European call or put option — no simulation needed (unlike the Monte Carlo course's option-pricing approach), just a direct formula, given five inputs: current stock price S, strike K, time to expiration T (in years), risk-free rate r, and volatility sigma.

import math
from statistics import NormalDist

def bs_call_price(S, K, T, r, sigma):
    d1 = (math.log(S / K) + (r + sigma**2 / 2) * T) / (sigma * math.sqrt(T))
    d2 = d1 - sigma * math.sqrt(T)
    N = NormalDist().cdf
    return S * N(d1) - K * math.exp(-r * T) * N(d2)

print(round(bs_call_price(100, 100, 1, 0.05, 0.2), 2))   # 10.45

N (the standard normal CDF) is exactly the same statistics.NormalDist().cdf used for z-tests in the Statistics course — Black-Scholes and hypothesis testing share the same underlying math tool, applied to a completely different problem.

Try it

Call price rises monotonically with volatility -- more uncertainty means more chance of a big upside move, and the buyer's downside is already capped at the premium, so higher volatility is pure upside for the option buyer.

Loading editor…
Explanation

Put-call parity is a no-arbitrage relationship that lets you get the put price directly from the call price, without redoing the whole formula: put = call - S + K·e^(-rT). It holds because a very specific combination of positions (long call + short put, vs. long stock financed by borrowing K·e^(-rT)) must have identical payoffs at expiration — if they didn't, there'd be a risk-free arbitrage profit available, which competitive markets don't allow to persist.

def black_scholes_put(S, K, T, r, sigma):
    call = bs_call_price(S, K, T, r, sigma)
    return call - S + K * math.exp(-r * T)
Exercise

Write `black_scholes_call(S, K, T, r, sigma)`: `d1 = (ln(S/K) + (r + sigma²/2)·T) / (sigma·√T)`, `d2 = d1 - sigma·√T`, price `= S·N(d1) - K·e^(-rT)·N(d2)`, where `N` is the standard normal CDF (`statistics.NormalDist().cdf`). Round to 4 decimals.

Exercise

Using `bs_call_price` (the unrounded version, given below) and put-call parity — `put = call - S + K·e^(-rT)` — write `black_scholes_put(S, K, T, r, sigma)`, rounded to 4 decimals.

Quiz

What does the Black-Scholes model assume about how the underlying stock price moves over time?

Checkpoint

You can compute a European option's price directly via the Black-Scholes formula, and derive the put price from the call price via put-call parity.