We will be using our code from the Implementation of Black-Scholes formula in Python video.
from py_vollib.black_scholes import black_scholes as bs from py_vollib.black_scholes.greeks.analytical import delta, gamma, vega, theta, rho
# Implementation of Black-Scholes formula in Python import numpy as np from scipy.stats import norm from py_vollib.black_scholes import black_scholes as bs from py_vollib.black_scholes.greeks.analytical import delta, gamma, vega, theta, rho # Define variables r = 0.01 S = 30 K = 40 T = 240/365 sigma = 0.30 def blackScholes(r, S, K, T, sigma, type="c"): "Calculate BS price of call/put" d1 = (np.log(S/K) + (r + sigma**2/2)*T)/(sigma*np.sqrt(T)) d2 = d1 - sigma*np.sqrt(T) try: if type == "c": price = S*norm.cdf(d1, 0, 1) - K*np.exp(-r*T)*norm.cdf(d2, 0, 1) elif type == "p": price = K*np.exp(-r*T)*norm.cdf(-d2, 0, 1) - S*norm.cdf(-d1, 0, 1) return price, bs(type, S, K, T, r, sigma) except: print("Please confirm option type, either 'c' for Call or 'p' for Put!")
print("Option Price: ", blackScholes(r, S, K, T, sigma, "c"))
Delta
Delta measures the rate of change of the theoretical option value with respect to changes in the underlying asset’s price.
$\Delta = \frac{\partial V}{\partial S}$
$\Delta_{call} = \Phi(d1)$
$\Delta_{put} = -\Phi(-d1)$
def delta_calc(r, S, K, T, sigma, type="c"): "Calculate delta of an option" d1 = (np.log(S/K) + (r + sigma**2/2)*T)/(sigma*np.sqrt(T)) try: if type == "c": delta_calc = norm.cdf(d1, 0, 1) elif type == "p": delta_calc = -norm.cdf(-d1, 0, 1) return delta_calc, delta(type, S, K, T, r, sigma) except: print("Please confirm option type, either 'c' for Call or 'p' for Put!")
Gamma
Gamma measures the rate of change in the delta with respect to changes in the underlying price.
$\Gamma = \frac{\partial \Delta}{\partial S} = \frac{\partial^2 V}{\partial S^2}$
$\Gamma = \frac{\phi(d1)}{S\sigma\sqrt{\tau}}$
def gamma_calc(r, S, K, T, sigma, type="c"): "Calculate gamma of a option" d1 = (np.log(S/K) + (r + sigma**2/2)*T)/(sigma*np.sqrt(T)) d2 = d1 - sigma*np.sqrt(T) try: gamma_calc = norm.pdf(d1, 0, 1)/(S*sigma*np.sqrt(T)) return gamma_calc, gamma(type, S, K, T, r, sigma) except: print("Please confirm option type, either 'c' for Call or 'p' for Put!")
Vega
Vega measures sensitivity to volatility. Vega is the derivative of the option value with respect to the volatility of the underlying asset.
$\upsilon = \frac{\partial V}{\partial \sigma}$
$\upsilon = S\phi(d1)\sqrt{\tau}$
def vega_calc(r, S, K, T, sigma, type="c"): "Calculate BS price of call/put" d1 = (np.log(S/K) + (r + sigma**2/2)*T)/(sigma*np.sqrt(T)) d2 = d1 - sigma*np.sqrt(T) try: vega_calc = S*norm.pdf(d1, 0, 1)*np.sqrt(T) return vega_calc*0.01, vega(type, S, K, T, r, sigma) except: print("Please confirm option type, either 'c' for Call or 'p' for Put!")
Theta
Theta measures the sensitivity of the value of the derivative to the passage of time – time decay.
$\Theta = -\frac{\partial V}{\partial \tau}$
$\Theta_{call} = -\frac{S\phi(d1)\sigma}{2\tau} – rK\exp{(-rT)}\Phi(d2)$
$\Theta_{put} = -\frac{S\phi(d1)\sigma}{2\tau} + rK\exp{(-rT)}\Phi(-d2)$
def theta_calc(r, S, K, T, sigma, type="c"): "Calculate BS price of call/put" d1 = (np.log(S/K) + (r + sigma**2/2)*T)/(sigma*np.sqrt(T)) d2 = d1 - sigma*np.sqrt(T) try: if type == "c": theta_calc = -S*norm.pdf(d1, 0, 1)*sigma/(2*np.sqrt(T)) - r*K*np.exp(-r*T)*norm.cdf(d2, 0, 1) elif type == "p": theta_calc = -S*norm.pdf(d1, 0, 1)*sigma/(2*np.sqrt(T)) + r*K*np.exp(-r*T)*norm.cdf(-d2, 0, 1) return theta_calc/365, theta(type, S, K, T, r, sigma) except: print("Please confirm option type, either 'c' for Call or 'p' for Put!")
Rho
Rho measures the sensitivity to the interest rate.
$\rho = \frac{\partial V}{\partial r}$
$\rho_{call} = K\tau\exp{(-rT)}\Phi(d2)$
$\rho_{put} = -K\tau\exp{(-rT)}\Phi(-d2)$
def rho_calc(r, S, K, T, sigma, type="c"): "Calculate BS price of call/put" d1 = (np.log(S/K) + (r + sigma**2/2)*T)/(sigma*np.sqrt(T)) d2 = d1 - sigma*np.sqrt(T) try: if type == "c": rho_calc = K*T*np.exp(-r*T)*norm.cdf(d2, 0, 1) elif type == "p": rho_calc = -K*T*np.exp(-r*T)*norm.cdf(-d2, 0, 1) return rho_calc*0.01, rho(type, S, K, T, r, sigma) except: print("Please confirm option type, either 'c' for Call or 'p' for Put!")
All together
option_type='p' print("Option Price: ", [round(x,3) for x in blackScholes(r, S, K, T, sigma, option_type)]) print(" Delta: ", [round(x,3) for x in delta_calc(r, S, K, T, sigma, option_type)]) print(" Gamma: ", [round(x,3) for x in gamma_calc(r, S, K, T, sigma, option_type)]) print(" Vega : ", [round(x,3) for x in vega_calc(r, S, K, T, sigma, option_type)]) print(" Theta: ", [round(x,3) for x in theta_calc(r, S, K, T, sigma, option_type)]) print(" Rho : ", [round(x,3) for x in rho_calc(r, S, K, T, sigma, option_type)])