option = call_option(self.S0, self.K, self.T, self.r, sigma_est)
for i in range(it):
option.sigma -= (option.value() - C0) / option.vega()
return option.sigma
This class can be used in an interactive IPython session as follows:
In [ 1 ]: from bsm_option_class import call_option
In [ 2 ]: o = call_option(100., 105., 1.0, 0.05, 0.2)
type(o)
Out[2]: bsm_option_class.call_option
In [ 3 ]: value = o.value()
value
Out[3]: 8.0213522351431763
In [ 4 ]: o.vega()
Out[4]: 54.222833358480528
In [ 5 ]: o.imp_vol(C0=value)
Out[5]: 0.20000000000000001
The option class can be easily used to visualize, for example, the value and Vega of the
option for different strikes and maturities. This is, in the end, one of the major advantages
of having such formulae available. The following Python code generates the option
statistics for different maturity-strike combinations:
In [ 6 ]: import numpy as np
maturities = np.linspace(0.05, 2.0, 20 )
strikes = np.linspace( 80 , 120 , 20 )
T, K = np.meshgrid(strikes, maturities)
C = np.zeros_like(K)
V = np.zeros_like(C)
for t in enumerate(maturities):
for k in enumerate(strikes):
o.T = t[ 1 ]
o.K = k[ 1 ]
C[t[ 0 ], k[ 0 ]] = o.value()
V[t[ 0 ], k[ 0 ]] = o.vega()
First, let us have a look at the option values. For plotting, we need to import some libraries
and functions:
In [ 7 ]: import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from pylab import cm
%matplotlib inline
The output of the following code is presented in Figure B-1:
In [ 8 ]: fig = plt.figure(figsize=( 12 , 7 ))
ax = fig.gca(projection=‘3d’)
surf = ax.plot_surface(T, K, C, rstride= 1 , cstride= 1 ,
cmap=cm.coolwarm, linewidth=0.5, antialiased=True)
ax.set_xlabel(‘strike’)
ax.set_ylabel(‘maturity’)
ax.set_zlabel(‘European call option value’)
fig.colorbar(surf, shrink=0.5, aspect= 5 )
Second, we have the results for the Vega of the call option, as shown in Figure B-2:
In [ 9 ]: fig = plt.figure(figsize=( 12 , 7 ))
ax = fig.gca(projection=‘3d’)
surf = ax.plot_surface(T, K, V, rstride= 1 , cstride= 1 ,
cmap=cm.coolwarm, linewidth=0.5, antialiased=True)
ax.set_xlabel(‘strike’)
ax.set_ylabel(‘maturity’)
ax.set_zlabel(‘Vega of European call option’)
fig.colorbar(surf, shrink=0.5, aspect= 5 )
plt.show()