流心巧克力曲奇 2023-06-29 12:24 采纳率: 0%
浏览 10

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'))

  • 写回答

2条回答 默认 最新

  • 流心巧克力曲奇 2023-06-29 13:09
    关注

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

    评论

报告相同问题?

问题事件

  • 创建了问题 6月29日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错