注:美式看跌期权的求解
import pandas as pd
import numpy as np
T=5/12
n=10
Smax=100
m=20
dt=T/n
ds=Smax/m
r=0.1
sigma=0.4
k=50
q=0
a=lambda j:0.5*(r-q)*j*dt-1/2*sigma**2*j**2*dt
b=lambda j:1+sigma**2*j**2*dt+r*dt
c=lambda j:-0.5*(r-q)*j*dt-0.5*sigma**2*j**2*dt
#定义纵轴为股票价格向上递增 横轴为到期时间且向右递减
f=np.zeros((m+2,n+2))
#第0行为时间
for i in range(1,n+2):
f[0,i]=T-(i-1)*dt
#第0列为股票价格
for j in range(1,m+2):
f[j,0]=Smax-(j-1)*ds
#边界条件1:到期时间为0的期权价格等于max( k-sT,0)
for j in range(1,m+2):
x=f[j,0]
if k-x>=0:
f[j,11]=k-x
else:
f[j,11]=0
#边界条件2:资产价格为0即 s=0时 美式看跌期权价格为k
for i in range(1,n+2):
f[21,i]=k
#边界条件3:标的资产价格趋于无穷 期权价格趋于0
for i in range(1,n+2):
f[1,i]=0
# #求解期权价格
xishu=np.zeros((m-1,m+1))
#i从0~m-2
j=m-1
jj=1
for i in range(m-1):
a1=a(j)
#print(a1)
b1=b(j)
c1=c(j)
xishu[i,jj-1]=c1
xishu[i,jj]=b1
xishu[i,jj+1]=a1
jj=jj+1
j=j-1
xishu=np.matrix(xishu)
xishu1=xishu[:,1:(m)]
#系数的逆
xishu2=xishu1.I
#取到期期限为0的数列
qq_price0=f[2:m+1,n+1]
#从n+1(11)到2
for i in range(n+1,1,-1):
qq_price0=f[2:m+1,i]
qq_price0[0]=qq_price0[0]-c(m-1)*f[1,i-1]
qq_price0[m-2]=qq_price0[m-2]-a(1)*f[m+1,i-1]
f[m,i]=k-f[m,0]
qq_price1=qq_price0.reshape(-1,1)
#解出上一期的期权价格
qq_price2=xishu2*qq_price1
for j in range(2,m+1):
f[j,i-1]=max(qq_price2[j-2],(k-f[j,0]))
g=pd.DataFrame(f)
g.columns=['股票价格','5个月','4.5个月','4个月','3.5个月','3个月','2.5个月','2个月','1.5个月','1个月','0.5个月','0个月']
g.set_index('股票价格',inplace=True)
h=g.tail(len(g)-1)
h