将上面的计算期权价值和画图的程序合并
时间: 2024-03-19 16:45:33 浏览: 20
好的,下面是将计算期权价值和画图合并的代码:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import comb
def binomial_tree(S, K, r, q, sigma, T, N, option_type, plot_tree=False):
"""二叉树定价模型"""
dt = T/N
u = np.exp(sigma*np.sqrt(dt))
d = 1/u
p = (np.exp((r-q)*dt) - d)/(u-d)
f = np.zeros((N+1, N+1))
for j in range(N+1):
f[N][j] = max(0, K - S*(u**(N-j))*(d**j))
for i in range(N-1, -1, -1):
for j in range(i+1):
f[i][j] = np.exp(-r*dt)*(p*f[i+1][j] + (1-p)*f[i+1][j+1])
if option_type == 'put':
f[i][j] = max(f[i][j], K - S*(u**(i-j))*(d**j))
elif option_type == 'call':
f[i][j] = max(f[i][j], S*(u**(i-j))*(d**j) - K)
if plot_tree:
fig, ax = plt.subplots(figsize=(8, 5))
fig.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9, wspace=0.2, hspace=0.2)
pos = np.zeros((N+1, N+1))
for i in range(N+1):
for j in range(i+1):
pos[i][j] = (j-i/2, -i)
plt.plot(pos[i][j], 'wo', markersize=0)
plt.text(pos[i][j][0], pos[i][j][1], f'{S*(u**(i-j))*(d**j):.2f}', ha='center', va='center')
for i in range(N):
for j in range(i+1):
plt.plot([pos[i][j][0], pos[i+1][j][0]], [pos[i][j][1], pos[i+1][j][1]], 'k-', lw=1)
plt.plot([pos[i][j][0], pos[i+1][j+1][0]], [pos[i][j][1], pos[i+1][j+1][1]], 'k-', lw=1)
plt.axis('off')
plt.title(f'Binomial Tree (S={S:.2f}, K={K:.2f}, r={r:.2f}, q={q:.2f}, sigma={sigma:.2f}, T={T:.2f}, N={N})')
plt.show()
return f[0][0]
S = 100
K = 100
r = 0.05
q = 0.02
sigma = 0.3
T = 1
N = 3
option_type = 'call'
price = binomial_tree(S, K, r, q, sigma, T, N, option_type, plot_tree=True)
print(f'Option price: {price:.2f}')
```
你可以设置 `plot_tree` 参数来决定是否要画出二叉树图,如上面的代码中设置为 True,就会画出二叉树图。