@@ -38,7 +38,7 @@ def find_sx(sx, k, sigma, t, r, q, option_type):
38
38
* sx / q1 + sx - k ) ** 2
39
39
40
40
41
- def baw_call (s , k , sigma , t , r , q ):
41
+ def baw_call (s , k , sigma , t , r , q = 0.0 ):
42
42
c = bsm_call (s , k , sigma , t , r , q )
43
43
sx = opt .fmin (lambda i : find_sx (i , k , sigma , t , r , q , 'Call' ), s )[0 ]
44
44
d1 = (log (sx / k ) + (r - q + sigma ** 2 / 2.0 )) / (sigma * sqrt (t ))
@@ -49,7 +49,7 @@ def baw_call(s, k, sigma, t, r, q):
49
49
return c + a2 * (s / sx ) ** q2 if s < sx else s - k
50
50
51
51
52
- def baw_put (s , k , sigma , t , r , q ):
52
+ def baw_put (s , k , sigma , t , r , q = 0.0 ):
53
53
p = bsm_put (s , k , sigma , t , r , q )
54
54
sx = opt .fmin (lambda i : find_sx (i , k , sigma , t , r , q , 'Put' ), s )[0 ]
55
55
d1 = (log (sx / k ) + (r - q + sigma ** 2 / 2.0 )) / (sigma * sqrt (t ))
@@ -60,7 +60,7 @@ def baw_put(s, k, sigma, t, r, q):
60
60
return p + a1 * (s / sx ) ** q1 if s > sx else k - s
61
61
62
62
63
- def call_iv (c , s , k , t , r = 0.03 , sigma_min = 0.0001 , sigma_max = 1 .0 , e = 0.00001 ):
63
+ def call_iv (c , s , k , t , r = 0.03 , sigma_min = 0.0001 , sigma_max = 3 .0 , e = 0.00001 ):
64
64
sigma_mid = (sigma_min + sigma_max ) / 2.0
65
65
call_min = bsm_call (s , k , sigma_min , t , r , 0.0 )
66
66
call_max = bsm_call (s , k , sigma_max , t , r , 0.0 )
@@ -81,7 +81,7 @@ def call_iv(c, s, k, t, r=0.03, sigma_min=0.0001, sigma_max=1.0, e=0.00001):
81
81
return sigma_mid
82
82
83
83
84
- def put_iv (c , s , k , t , r = 0.03 , sigma_min = 0.0001 , sigma_max = 1 .0 , e = 0.00001 ):
84
+ def put_iv (c , s , k , t , r = 0.03 , sigma_min = 0.0001 , sigma_max = 3 .0 , e = 0.00001 ):
85
85
sigma_mid = (sigma_min + sigma_max ) / 2.0
86
86
put_min = bsm_put (s , k , sigma_min , t , r , 0.0 )
87
87
put_max = bsm_put (s , k , sigma_max , t , r , 0.0 )
@@ -102,6 +102,55 @@ def put_iv(c, s, k, t, r=0.03, sigma_min=0.0001, sigma_max=1.0, e=0.00001):
102
102
return sigma_mid
103
103
104
104
105
+ def delta (s , k , sigma , t , r , option_type ):
106
+ if t == 0.0 :
107
+ if s == k :
108
+ return 0.5 if option_type == 'Call' else - 0.5
109
+ elif s > k :
110
+ return 1.0 if option_type == 'Call' else 0.0
111
+ else :
112
+ return 0.0 if option_type == 'Call' else - 1.0
113
+ else :
114
+ price_func = baw_call if option_type == 'Call' else baw_put
115
+ return (price_func (s + 0.01 , k , sigma , t , r ) -
116
+ price_func (s - 0.01 , k , sigma , t , r )) * 50.0
117
+
118
+
119
+ def gamma (s , k , sigma , t , r , option_type ):
120
+ if t == 0.0 :
121
+ return inf if s == k else 0.0
122
+ price_func = baw_call if option_type == 'Call' else baw_put
123
+ return (price_func (s + 0.01 , k , sigma , t , r ) +
124
+ price_func (s - 0.01 , k , sigma , t , r ) -
125
+ price_func (s , k , sigma , t , r ) * 2.0 ) * 10000.0
126
+
127
+
128
+ def theta (s , k , sigma , t , r , option_type ):
129
+ price_func = baw_call if option_type == 'Call' else baw_put
130
+ t_unit = 1.0 / 365.0
131
+ if t <= t_unit :
132
+ return price_func (s , k , sigma , 0.0001 , r ) - \
133
+ price_func (s , k , sigma , t , r )
134
+ else :
135
+ return price_func (s , k , sigma , t - t_unit , r ) - \
136
+ price_func (s , k , sigma , t , r )
137
+
138
+
139
+ def vega (s , k , sigma , t , r , option_type ):
140
+ price_func = baw_call if option_type == 'Call' else baw_put
141
+ if sigma < 0.02 :
142
+ return 0.0
143
+ else :
144
+ return (price_func (s , k , sigma + 0.01 , t , r ) -
145
+ price_func (s , k , sigma - 0.01 , t , r )) * 50.0
146
+
147
+
148
+ def rho (s , k , sigma , t , r , option_type ):
149
+ price_func = baw_call if option_type == 'Call' else baw_put
150
+ return (price_func (s , k , sigma , t , r + 0.001 ,) -
151
+ price_func (s , k , sigma , t , r - 0.001 ,)) * 500.0
152
+
153
+
105
154
if __name__ == '__main__' :
106
155
# print(baw_call(2707, 2900, 0.165, 78.0 / 365, 0.03, 0.0))
107
156
# print(baw_put(2710, 2750, 0.15, 78.0 / 365, 0.03, 0.0))
0 commit comments