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:

\[C - P = S - K e^{-r(T-t)}\]
  • Put Option
\[P = K e^{-r(T-t)} \Phi(-d_2) - S \Phi(-d_1)\]
  • Call option
\[C = S \Phi(d_1) - K e^{-r(T-t)} \Phi(d_2)\]
  • 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:

  • Google Gemini updates: Flash 1.5, Gemma 2 and Project Astra
  • Displaying External Posts on Your al-folio Blog
  • Policy Gradient
  • Deep Learning
  • Supervised Learning