Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 美式看跌期权定价的迭代方法_Python_Algorithm_Quantitative Finance - Fatal编程技术网

Python 美式看跌期权定价的迭代方法

Python 美式看跌期权定价的迭代方法,python,algorithm,quantitative-finance,Python,Algorithm,Quantitative Finance,我正试图实现一种算法,用迭代法对美式期权进行定价,如《美式期权估价的简单迭代法》一文中所述 数学可能很复杂,但我们不必太担心。基本思想是,我们将成熟时间划分为n个区间(n+1个节点),在每个节点上,我们有一个最佳练习边界,并尝试拟合一条穿过所有这些点的曲线(n次多项式)。“迭代法”的名称表明,我们进行了几次这种近似,每次我们有一个更好的曲线,它将更接近正确的曲线 说够了,有以下参数:S,T,K,n,r,sigma,K;算法如下: 将到期时间划分为n个时间间隔,这将创建n+1个练习边界。t0,t1

我正试图实现一种算法,用迭代法对美式期权进行定价,如《美式期权估价的简单迭代法》一文中所述

数学可能很复杂,但我们不必太担心。基本思想是,我们将成熟时间划分为n个区间(n+1个节点),在每个节点上,我们有一个最佳练习边界,并尝试拟合一条穿过所有这些点的曲线(n次多项式)。“迭代法”的名称表明,我们进行了几次这种近似,每次我们有一个更好的曲线,它将更接近正确的曲线

说够了,有以下参数:S,T,K,n,r,sigma,K;算法如下:

  • 将到期时间划分为n个时间间隔,这将创建n+1个练习边界。t0,t1,t2,…ti,…tn
  • 在t=0(到期日)时,最佳行使边界为K(履约价格)
  • B(ti)=K的初始猜测
  • 应用公式(6)计算B(i)的第一轮估算值
  • B(ti)n+1个数据点的近似多项式函数

    使用方程式(5)进行下一轮迭代

    继续重复第5步。k次,或直到收敛

  • 下面是我用Python编写的这两个步骤的代码:

    dt=T/n
    B = [K]*(n+1)
    #first iteration - equation (6) in paper
    for i in range(n):
        i+=1
        tt = i*dt
        A1 = K*(NCDF(d12(K,tt,K)[0])+(1/sig/np.sqrt(2*np.pi*tt))*np.exp(-0.5*d12(K,tt,K)[0]**2))**(-1)
        A2 = 1/sig/np.sqrt(2*np.pi*tt)*np.exp(-(r*tt+0.5*d12(K,tt,K)[1]**2))
        A3 = (2*sig*r)/(2*r+sig**2)*(2*NCDF((2*r+sig**2)*np.sqrt(tt)/(2*sig))-1)
        B[i]=A1*(A2+A3)
    
    for i in range(k): #kth iteration as in equation (5)
        xvals=np.linspace(0,T,n+1)
        params=np.polyfit(xvals,B,deg=n)
        for j in range(n): #equation (5) at each node point
            j+=1
            tt = j*dt
            A1 = (NCDF(d12(B[j],tt,K)[0])+(1/sig/np.sqrt(2*np.pi*tt))*np.exp(-0.5*d12(B[j],tt,K)[0]**2))**(-1)
            A2 = (1/sig/np.sqrt(2*np.pi*tt)*K*np.exp(-(r*tt+0.5*d12(B[j],tt,K)[1]**2)))
            A3 = r*K*sci.fixed_quad(lambda x: (1/sig/np.sqrt(2*np.pi*(tt-x)))*r*np.exp(-(r*(tt-x)+\
            0.5*d12(B[j],tt,Polyf(params,x))[1]**2)),0,tt)[0]
            B[j]=A1*(A2+A3)
    
    xvals=np.linspace(0,T,n+1)
    params=np.polyfit(xvals,B,deg=n)
    
    Price = BSPut(S0,K,r,sig,T) + sci.fixed_quad(lambda x: r*K*np.exp(-r*(T-x))*NCDF(-d12(S0,T-x,Polyf(params,x))[1]),0,T)[0]
    return Price
    
    不要担心函数Polyf和BSPut,因为我已经仔细检查了它们。问题是我无法用这些代码复制正确的结果。即使是第一轮迭代后的B(ti)曲线,在S=45、K=45、r=0.05、sigma=0.2、t=0.5、n=16时,也与论文中的结果不匹配。如果你运行我的代码,B1(ti)远低于论文中的B1(ti)(我认为最小值约为41,而我的程序在第一次迭代后给了我B(16)=37)

    如果有人能告诉我在我的实现中可能出现的错误,我将不胜感激


    非常感谢!

    如果有一个示例代码可以在开箱即用的同时尽可能短,这将使问题更容易回答。另请参见。您好,在循环中,您有
    i+=1
    ,您希望它提前
    i
    1还是2?在第二个循环中,与
    j+=1,在python中,范围(n)中j的
    语句相当于(j=0;jHi Triarion,恐怕不是。对不起,我应该将顶行作为def IterativeMethod(S,K,r,sig,T,n,K)Hi Phong,我之所以将索引提前1是因为在到期时(T=0),最佳练习边界始终为K,因此无需进行任何计算。方程式(5)和(6)仅从第一个时间节点开始。Python循环从0开始