What is an Option?¶
An option is a financial derivative that gives the holder the right, but not the obligation, to buy or sell an underlying asset at a specified price (strike price) on or before a specified date (expiration).
Types of Options¶
| Type | Right | Buyer Expects |
|---|---|---|
| Call | Right to buy | Price to rise |
| Put | Right to sell | Price to fall |
The Black-Scholes Model¶
Published in 1973 by Fischer Black and Myron Scholes (with contributions from Robert Merton), this model revolutionized finance and earned a Nobel Prize.
The Formula¶
For a European call option:
$$C = S_0 N(d_1) - K e^{-rT} N(d_2)$$
Where:
$$d_1 = \frac{\ln(S_0/K) + (r + \sigma^2/2)T}{\sigma\sqrt{T}}$$
$$d_2 = d_1 - \sigma\sqrt{T}$$
Variables Explained¶
- S₀: Current stock price
- K: Strike price
- T: Time to expiration (in years)
- r: Risk-free interest rate
- σ (sigma): Volatility of the underlying asset
- N(x): Cumulative standard normal distribution
Implementation in Python¶
import numpy as np
from scipy.stats import norm
def black_scholes(S, K, T, r, sigma, option_type="call"):
"""
Calculate Black-Scholes option price.
Parameters:
S: Current stock price
K: Strike price
T: Time to expiration (years)
r: Risk-free rate
sigma: Volatility
option_type: 'call' or 'put'
"""
d1 = (np.log(S / K) + (r + sigma**2 / 2) * T) / (sigma * np.sqrt(T))
d2 = d1 - sigma * np.sqrt(T)
if option_type == "call":
price = S * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2)
else:
price = K * np.exp(-r * T) * norm.cdf(-d2) - S * norm.cdf(-d1)
return price
# Example: AAPL option
price = black_scholes(S=150, K=155, T=0.25, r=0.05, sigma=0.3)
print(f"Call option price: ${price:.2f}")
The Greeks¶
The Greeks measure the sensitivity of an option’s price to various factors.
Delta (Δ)¶
Rate of change of option price with respect to the underlying asset price.
def delta(S, K, T, r, sigma, option_type="call"):
d1 = (np.log(S / K) + (r + sigma**2 / 2) * T) / (sigma * np.sqrt(T))
if option_type == "call":
return norm.cdf(d1)
return norm.cdf(d1) - 1
- Call delta: 0 to 1
- Put delta: -1 to 0
- ATM options have delta ≈ 0.5
Gamma (Γ)¶
Rate of change of delta with respect to underlying price. Highest for ATM options near expiry.
Theta (Θ)¶
Time decay — how much the option loses value each day. Always negative for long options.
Vega (ν)¶
Sensitivity to volatility. Higher volatility = higher option price.
Rho (ρ)¶
Sensitivity to interest rates. Usually the least impactful Greek.
Implied Volatility¶
While historical volatility looks backward, implied volatility (IV) is forward-looking — it’s the market’s expectation of future volatility, derived from option prices.
from scipy.optimize import brentq
def implied_volatility(market_price, S, K, T, r, option_type="call"):
"""Find the volatility that makes BS price = market price."""
def objective(sigma):
return black_scholes(S, K, T, r, sigma, option_type) - market_price
return brentq(objective, 0.001, 5.0)
# Example
iv = implied_volatility(market_price=8.50, S=150, K=155, T=0.25, r=0.05)
print(f"Implied Volatility: {iv:.1%}")
Beyond Black-Scholes¶
The Black-Scholes model has known limitations:
- Constant volatility assumption — volatility smiles/skews exist in reality
- Log-normal returns — markets have fat tails
- No dividends (basic model) — extensions exist
- European options only — American options need different approaches
Alternative Models¶
- Binomial Tree Model: Handles American options
- Monte Carlo Simulation: Flexible for complex payoffs
- Heston Model: Stochastic volatility
- SABR Model: Used extensively for interest rate derivatives
Key Takeaways¶
- Options pricing is a blend of probability theory and financial economics
- The Black-Scholes model, despite its limitations, remains the foundation of derivatives pricing
- Understanding the Greeks is essential for risk management
- Real-world pricing goes beyond Black-Scholes with more sophisticated models