In [9]:
import imp
import numpy as np
import matplotlib.pyplot as plt
import option_models as opt
In [10]:
### only run this when you changed the class definition
CODE_CHANGED = False
if( CODE_CHANGED ):
imp.reload(opt)
In [11]:
# Parameters
strike = np.linspace(75,125,num=25)
# strike = 110 # should work for scalar value
forward = 100
sigma = 0.2
texp = 1
alpha = 0.3
rho = 0.25
beta = 1
In [12]:
# Create model
sabr_bsm = opt.sabr.ModelHagan(texp, sigma, alpha=alpha, rho=rho, beta=beta)
sabr_bsm.__dict__
Out[12]:
In [13]:
# This is how you price. you can get either price or bsm_vol
price = sabr_bsm.price(strike, forward)
bsm_vol = sabr_bsm.bsm_vol(strike, forward)
price, bsm_vol
Out[13]:
In [14]:
# volatility smile plot: try with different parameters
plt.plot(strike, bsm_vol, 'ro')
#plt.axis([0, 6, 0, 20])
plt.ylabel('BSM Imp Vol under SABR')
plt.xlabel('Strike')
plt.grid()
plt.show()
In [15]:
# implied vol (sigma in this case)
# you should get back the original sigma
sabr_bsm.impvol(price[11], strike[11], forward)
Out[15]:
In [16]:
strike = np.linspace(75,125,num=25)
#strike = 1
forward = 100
sigma = 20
texp = 1
alpha = 0.5
rho = -0.25
beta = 0
In [17]:
nvol = opt.sabr.norm_vol(strike, forward, texp, sigma, alpha=alpha, rho=rho)
In [18]:
plt.plot(strike, nvol, 'ro')
#plt.axis([0, 6, 0, 20])
plt.ylabel('Normal Imp Vol under SABR')
plt.xlabel('Strike')
plt.grid()
plt.show()
In [19]:
sabr_norm = opt.sabr.ModelNormalHagan(texp, sigma, alpha=alpha, rho=rho)
sabr_norm.__dict__
Out[19]:
In [20]:
price = sabr_norm.price(strike, forward)
norm_vol = sabr_norm.norm_vol(strike, forward)
price, norm_vol
Out[20]:
In [21]:
# implied vol (e.g. sigma)
sabr_norm.impvol(price[11], strike[11], forward)
Out[21]:
In [22]:
strike3 = np.array([90, 100, 110])
price3 = sabr_norm.price(strike3, forward)
norm_vol3 = sabr_norm.norm_vol(strike3, forward)
price3, norm_vol3
Out[22]:
In [23]:
# makre sure this return the original sigma, alpha, rho
sabr_norm.calibrate3(norm_vol3, strike3, forward, is_vol=True)
Out[23]:
In [24]:
# makre sure this return the original sigma, alpha, rho
sabr_norm.calibrate3(price3, strike3, forward, is_vol=False)
Out[24]:
Below is same for sabr_bsm
In [25]:
strike3 = np.array([90, 100, 110])
price3 = price = sabr_bsm.price(strike3, forward)
bsm_vol3 = sabr_bsm.bsm_vol(strike3, forward)
price3, bsm_vol3
Out[25]:
In [26]:
# makre sure this return the original sigma, alpha, rho
sabr_norm.calibrate3(bsm_vol3, strike3, forward, is_vol=True)
Out[26]:
In [27]:
# makre sure this return the original sigma, alpha, rho
sabr_norm.calibrate3(price3, strike3, forward, is_vol=False)
Out[27]:
In [31]:
strike = np.linspace(75,125,num=25)
forward = 100
In [41]:
# instantiate mc model from the hagan model's parameters
print(sabr_bsm.__dict__)
sabr_bsm_mc = opt.sabr.ModelBsmMC(sabr_bsm.texp, sabr_bsm.sigma,
alpha=sabr_bsm.alpha, rho=sabr_bsm.rho, beta=sabr_bsm.beta)
In [42]:
price_hagan = sabr_bsm.price(strike, forward)
price_mc = sabr_bsm_mc.price(strike, forward)
# make sure the two prices are similar
price_hagan, price_mc
Out[42]:
Repeat the same for beta = 0
In [43]:
# instantiate mc model from the hagan model's parameters
print(sabr_norm.__dict__)
sabr_norm_mc = opt.sabr.ModelNormalMC(sabr_norm.texp, sabr_norm.sigma,
alpha=sabr_norm.alpha, rho=sabr_norm.rho, beta=sabr_norm.beta)
In [44]:
price_hagan = sabr_norm.price(strike, forward)
price_mc = sabr_norm_mc.price(strike, forward)
# make sure the two prices are similar
price_hagan, price_mc
Out[44]:
In [ ]:
In [31]:
strike = np.linspace(75,125,num=25)
forward = 100
In [46]:
# instantiate mc model from the hagan model's parameters
print(sabr_bsm.__dict__)
sabr_bsm_cmc = opt.sabr.ModelBsmCondMC(sabr_bsm.texp, sabr_bsm.sigma,
alpha=sabr_bsm.alpha, rho=sabr_bsm.rho, beta=sabr_bsm.beta)
In [47]:
price_hagan = sabr_bsm.price(strike, forward)
price_mc = sabr_bsm_cmc.price(strike, forward)
# make sure the two prices are similar
price_hagan, price_mc
Out[47]:
Repeat the same for beta = 0
In [50]:
# instantiate mc model from the hagan model's parameters
print(sabr_norm.__dict__)
sabr_norm_cmc = opt.sabr.ModelBsmCondMC(sabr_norm.texp, sabr_norm.sigma, alpha=sabr_norm.alpha,
rho=sabr_norm.rho, beta=sabr_norm.beta)
In [51]:
price_hagan = sabr_norm.price(strike, forward)
price_mc = sabr_norm_cmc.price(strike, forward)
# make sure the two prices are similar
price_hagan, price_mc
Out[51]:
In [ ]: