Black-Scholes Model
-
The Black-Scholes model tells us that if there are no arbitrage opportunities in the market and stock prices exhibit certain random fluctuations, we can calculate the ‘fair value’ of a European option.
-
European options are the most common type of option, where the two parties agree on an expiration date before settling profits or losses.
-
American options are more flexible and therefore usually more expensive than European options, especially when stock prices are highly volatile or there are dividends, making early exercise potentially more worthwhile.
-
The Black-Scholes model only applies to European options and can use a closed-form solution. It does not apply to American options, requiring other methods for calculation.
-
This model allows us to mathematically convert the randomness of future stock price movements into the fair value of options today (more intuitive).
-
Black-Scholes call and put options are derived from put-call parity:
- Put Option
- Call option
- where \(d_1 = \frac{\ln(S/K) + (r + 0.5\sigma^2)(T-t)}{\sigma\sqrt{T-t}}, \quad d_2 = d_1 - \sigma \sqrt{T-t}\)
# Import packages
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
# Define call option function
def bs_call(S, K, T, r, sigma):
d1 = (np.log(S/K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
d2 = d1 - sigma * sigma * np.sqrt(T)
return S * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2)
# Define put option function
def bs_put(S, K, T, r, sigma):
d1 = (np.log(S/K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
d2 = d1 - sigma * sigma * np.sqrt(T)
return K * np.exp(-r * T) * norm.cdf(-d2) - S * norm.cdf(-d1)
# Draw Black-Scholes Call Option Price
S = np.linspace(50, 150, 100)
K=100
T=1
r = 0.05
sigma=0.2
prices = [bs_call(s, K, T, r, sigma) for s in S]
plt.plot(S, prices)
plt.xlabel("Stock Price S")
plt.ylabel("Call Option Price C")
plt.title("Black-Scholes Call Option Price")
plt.grid(True)
plt.show()
# Draw Black-Scholes Call Option Price
S = np.linspace(50, 150, 100)
K=100
T=1
r = 0.05
sigma=0.2
prices = [bs_put(s, K, T, r, sigma) for s in S]
plt.plot(S, prices, 'red')
plt.xlabel("Stock Price S")
plt.ylabel("Put Option Price C")
plt.title("Black-Scholes Put Option Price")
plt.grid(True)
plt.show()
Enjoy Reading This Article?
Here are some more articles you might like to read next: