forked from yhilpisch/py4fi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbsm_option_class.py
69 lines (61 loc) · 2.04 KB
/
bsm_option_class.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#
# Valuation of European call options in Black-Scholes-Merton Model
# incl. Vega function and implied volatility estimation
# -- class-based implementation
# bsm_option_class.py
#
from math import log, sqrt, exp
from scipy import stats
class call_option(object):
''' Class for European call options in BSM model.
Attributes
==========
S0 : float
initial stock/index level
K : float
strike price
T : float
maturity (in year fractions)
r : float
constant risk-free short rate
sigma : float
volatility factor in diffusion term
Methods
=======
value : float
return present value of call option
vega : float
return Vega of call option
imp_vol: float
return implied volatility given option quote
'''
def __init__(self, S0, K, T, r, sigma):
self.S0 = float(S0)
self.K = K
self.T = T
self.r = r
self.sigma = sigma
def value(self):
''' Returns option value. '''
d1 = ((log(self.S0 / self.K)
+ (self.r + 0.5 * self.sigma ** 2) * self.T)
/ (self.sigma * sqrt(self.T)))
d2 = ((log(self.S0 / self.K)
+ (self.r - 0.5 * self.sigma ** 2) * self.T)
/ (self.sigma * sqrt(self.T)))
value = (self.S0 * stats.norm.cdf(d1, 0.0, 1.0)
- self.K * exp(-self.r * self.T) * stats.norm.cdf(d2, 0.0, 1.0))
return value
def vega(self):
''' Returns Vega of option. '''
d1 = ((log(self.S0 / self.K)
+ (self.r + 0.5 * self.sigma ** 2) * self.T)
/ (self.sigma * sqrt(self.T)))
vega = self.S0 * stats.norm.pdf(d1, 0.0, 1.0) * sqrt(self.T)
return vega
def imp_vol(self, C0, sigma_est=0.2, it=100):
''' Returns implied volatility given option price. '''
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