Skip to content

Commit edaddd0

Browse files
author
DESKTOP-H85QCJO\shifulin
committed
改bug
1 parent 4927e30 commit edaddd0

File tree

2 files changed

+56
-7
lines changed

2 files changed

+56
-7
lines changed

american_option.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def gamma(s, k, sigma, r, t, option_type, steps=100):
8080
return inf if s == k else 0.0
8181
price_func = {'Call': call_price, 'Put': put_price}[option_type]
8282
return (price_func(s + 0.01, k, sigma, r, t, steps=steps) +
83-
price_func(s + 0.01, k, sigma, r, t, steps=steps) -
83+
price_func(s - 0.01, k, sigma, r, t, steps=steps) -
8484
price_func(s, k, sigma, r, t, steps=steps) * 2.0) * 10000.0
8585

8686

@@ -110,7 +110,7 @@ def rho(s, k, sigma, r, t, option_type, steps=100):
110110
price_func(s, k, sigma, r - 0.001, t, steps=steps)) * 500.0
111111

112112

113-
def call_iv(c, s, k, t, r=0.03, sigma_min=0.01, sigma_max=1.0, e=0.00001, steps=100):
113+
def call_iv(c, s, k, t, r=0.03, sigma_min=0.01, sigma_max=3.0, e=0.00001, steps=100):
114114
sigma_mid = (sigma_min + sigma_max) / 2.0
115115
call_min = call_price(s, k, sigma_min, r, t, steps)
116116
call_max = call_price(s, k, sigma_max, r, t, steps)
@@ -132,7 +132,7 @@ def call_iv(c, s, k, t, r=0.03, sigma_min=0.01, sigma_max=1.0, e=0.00001, steps=
132132
return sigma_mid
133133

134134

135-
def put_iv(c, s, k, t, r=0.03, sigma_min=0.01, sigma_max=1.0, e=0.00001, steps=100):
135+
def put_iv(c, s, k, t, r=0.03, sigma_min=0.01, sigma_max=3.0, e=0.00001, steps=100):
136136
sigma_mid = (sigma_min + sigma_max) / 2.0
137137
put_min = put_price(s, k, sigma_min, r, t, steps)
138138
put_max = put_price(s, k, sigma_max, r, t, steps)

baw.py

+53-4
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def find_sx(sx, k, sigma, t, r, q, option_type):
3838
* sx / q1 + sx - k) ** 2
3939

4040

41-
def baw_call(s, k, sigma, t, r, q):
41+
def baw_call(s, k, sigma, t, r, q=0.0):
4242
c = bsm_call(s, k, sigma, t, r, q)
4343
sx = opt.fmin(lambda i: find_sx(i, k, sigma, t, r, q, 'Call'), s)[0]
4444
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):
4949
return c + a2 * (s / sx) ** q2 if s < sx else s - k
5050

5151

52-
def baw_put(s, k, sigma, t, r, q):
52+
def baw_put(s, k, sigma, t, r, q=0.0):
5353
p = bsm_put(s, k, sigma, t, r, q)
5454
sx = opt.fmin(lambda i: find_sx(i, k, sigma, t, r, q, 'Put'), s)[0]
5555
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):
6060
return p + a1 * (s / sx) ** q1 if s > sx else k - s
6161

6262

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):
6464
sigma_mid = (sigma_min + sigma_max) / 2.0
6565
call_min = bsm_call(s, k, sigma_min, t, r, 0.0)
6666
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):
8181
return sigma_mid
8282

8383

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):
8585
sigma_mid = (sigma_min + sigma_max) / 2.0
8686
put_min = bsm_put(s, k, sigma_min, t, r, 0.0)
8787
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):
102102
return sigma_mid
103103

104104

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+
105154
if __name__ == '__main__':
106155
# print(baw_call(2707, 2900, 0.165, 78.0 / 365, 0.03, 0.0))
107156
# print(baw_put(2710, 2750, 0.15, 78.0 / 365, 0.03, 0.0))

0 commit comments

Comments
 (0)