请问为什么下面两段代码的计算结果会大相径庭呀?只在最后用循环定价的时候有不同,一个用了拟合,另一个是直接进行的判断,但是二者的计算结果一个是13,一个达到了23,请指点
import numpy as np
import math
import numpy.random as npr
S0 = 100.
r = 0.05
sigma = 0.25
T = 1.0
I = 50000
def gen_sn(M,I,anti_paths=True,mo_match=True):
if anti_paths is True:
sn = npr.standard_normal((M + 1, int(I / 2)))
sn = np.concatenate((sn, -sn), axis=1)
else:
sn = npr.standard_normal((M + 1, I))
if mo_match is True:
sn = (sn - sn.mean()) / sn.std()
return sn
def gbm_mcs_amer(K,option='call'):
M=50
dt=T/M
df=math.exp(-r*dt)
S=np.zeros((M+1,I))
S[0]=S0
sn=gen_sn(M,I)
for t in range(1,M+1):
S[t]=S[t-1]*np.exp((r-0.5*sigma**2)*dt+sigma*math.sqrt(dt)*sn[t])
if option=='call':
h=np.maximum(S-K,0)
elif option=='put':
h=np.maximum(K-S,0)
V=np.copy(h)
for t in range(M-1,0,-1):#t[1~49]
V[t]=np.where(df*V[t+1]>V[t],V[t+1]*df,V[t])
C0=df*np.mean(V[1])
return C0
print('the price of american option is:')
print('%.2f'%gbm_mcs_amer(110.,option='put'))
import numpy as np
import math
import numpy.random as npr
S0 = 100.
r = 0.05
sigma = 0.25
T = 1.0
I = 50000
def gen_sn(M,I,anti_paths=True,mo_match=True):
if anti_paths is True:
sn = npr.standard_normal((M + 1, int(I / 2)))
sn = np.concatenate((sn, -sn), axis=1)
else:
sn = npr.standard_normal((M + 1, I))
if mo_match is True:
sn = (sn - sn.mean()) / sn.std()
return sn
def gbm_mcs_amer(K,option='call'):
M=50
dt=T/M
df=math.exp(-r*dt)
S=np.zeros((M+1,I))
S[0]=S0
sn=gen_sn(M,I)
for t in range(1,M+1):
S[t]=S[t-1]*np.exp((r-0.5*sigma**2)*dt+sigma*math.sqrt(dt)*sn[t])
if option=='call':
h=np.maximum(S-K,0)
elif option=='put':
h=np.maximum(K-S,0)
V=np.copy(h)
for t in range(M-1,0,-1):
reg=np.polyfit(S[t],V[t+1]*df,7)
C=np.polyval(reg,S[t])
V[t]=np.where(C>h[t],V[t+1]*df,h[t])
C0=df*np.mean(V[1])
return C0
print('the price of american option is:')
print('%.2f'%gbm_mcs_amer(110.,option='put'))