python美式期权估值问题

请问为什么下面两段代码的计算结果会大相径庭呀?只在最后用循环定价的时候有不同,一个用了拟合,另一个是直接进行的判断,但是二者的计算结果一个是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'))

两份代码的差异主要在于在每个时间步如何计算期权的价值。第一份代码直接比较继续持有和行权两种情况下的价值,而第二份代码则通过多项式拟合得到一个拟合的期权价值,然后与当前期权价值进行比较

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7711661
  • 你也可以参考下这篇文章:Python三种方法计算皮尔逊相关系数以及实现给定数据集,返回数据集中每个特征和标签的相关系数
  • 除此之外, 这篇博客: Python机器学习方向企业面试题(三)中的 14.你意识到你的模型受到低偏差和高方差问题的困扰。那么,应该使用哪种算法来解决问题呢?为什么? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •   可以使用bagging算法(如随机森林)。因为,低偏差意味着模型的预测值接近实际值,换句话说,该模型有足够的灵活性,以模仿训练数据的分布。这样貌似很好,但是别忘了,一个灵活的模型没有泛化能力,意味着当这个模型用在对一个未曾见过的数据集进行测试的时候,它会令人很失望。在这种情况下,我们可以使用bagging算法(如随机森林),以解决高方差问题。bagging算法把数据集分成重复随机取样形成的子集。然后,这些样本利用单个学习算法生成一组模型。接着,利用投票(分类)或平均(回归)把模型预测结合在一起。另外,为了应对大方差,我们可以:
    
      1.使用正则化技术,惩罚更高的模型系数,从而降低了模型的复杂性。
    
      2.使用可变重要性图表中的前n个特征。可以用于当一个算法在数据集中的所有变量里很难寻找到有意义信号的时候。
    
  • 您还可以看一下 jeevan老师的Python量化交易,大操手量化投资系列课程之内功修炼篇课程中的 讲师简介,量化交易介绍及自动化交易演示小节, 巩固相关知识点