请问为什么下面两段代码的计算结果会大相径庭呀?只在最后用循环定价的时候有不同,一个用了拟合,另一个是直接进行的判断,但是二者的计算结果一个是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'))
两份代码的差异主要在于在每个时间步如何计算期权的价值。第一份代码直接比较继续持有和行权两种情况下的价值,而第二份代码则通过多项式拟合得到一个拟合的期权价值,然后与当前期权价值进行比较
可以使用bagging算法(如随机森林)。因为,低偏差意味着模型的预测值接近实际值,换句话说,该模型有足够的灵活性,以模仿训练数据的分布。这样貌似很好,但是别忘了,一个灵活的模型没有泛化能力,意味着当这个模型用在对一个未曾见过的数据集进行测试的时候,它会令人很失望。在这种情况下,我们可以使用bagging算法(如随机森林),以解决高方差问题。bagging算法把数据集分成重复随机取样形成的子集。然后,这些样本利用单个学习算法生成一组模型。接着,利用投票(分类)或平均(回归)把模型预测结合在一起。另外,为了应对大方差,我们可以:
1.使用正则化技术,惩罚更高的模型系数,从而降低了模型的复杂性。
2.使用可变重要性图表中的前n个特征。可以用于当一个算法在数据集中的所有变量里很难寻找到有意义信号的时候。