【问题标题】:What is wrong with this Binomial Tree Backwards Induction European Call Option Pricing Function?这个二叉树反向归纳欧式看涨期权定价函数有什么问题?
【发布时间】:2020-09-30 20:06:42
【问题描述】:

以下功能完美运行,只需要一件事: 删除创建 1000 元素数组 arr 的 for 循环。

你能帮我摆脱那个 for 循环吗? 代码如下

#Test with european call
import numpy as np
T = 1
N = 1000
sigma = 0.5
r = 0.02
S = 1
K = 0.7
u = np.exp(sigma*np.sqrt(T/N))
d = 1/u

arr = np.zeros(N+1)    
arr[0] = S*np.power(u,N)

coeff = np.exp(-r*(T/N))
p = (np.exp(r*(T/N))-d)/(u-d)       

for i in range(1, N+1):
    arr[i] = arr[i-1] * (d/u)     

def get_payoff(S=arr, K=K): 
    payoff = np.maximum((S - K), 0)
    return payoff

payoff = get_payoff()

def binomial_tree(payoff,S,K,T,r,sigma,N):
    for i in range(0, N):
        upper_vector = np.delete(payoff, N - i)
        lower_vector = np.delete(payoff, 0)
        payoff = coeff*(p*upper_vector + (1-p)*lower_vector)   
    return payoff[0]

print(binomial_tree(payoff,1,0.7,1,0.02,0.5,1000))

【问题讨论】:

  • 你有定义模型的参考吗?
  • 请正确格式化您的代码,它不会按原样运行
  • 其实这不是一个可怕的问题。肯定不是很好,但我认为你不应该为此获得-6。当然,除非你在编辑之前得到它们。

标签: python numpy


【解决方案1】:

我注意到您是否可以以有效的方式省略该循环,但是当我们不使用 np.delete() 而只是在每次迭代中使用索引来缩小 payoff 时,我的机器上的速度已经有了很大的提高:

# ...
arr = np.full(N+1, d/u)
arr[0] = S*np.power(u, N)
arr[1:] = arr[0] * np.cumprod(arr[1:])

def get_payoff(s, k):
    return np.maximum((s - k), 0)

payoff = get_payoff(arr, K)

def binomial_tree(payoff,S,K,T,r,sigma,N):
    for i in range(0, N):
        payoff = coeff*(p*payoff[:-1] + (1-p)*payoff[1:])
    return payoff[0]

请注意,我还将arr 的生成更改为没有循环,并更改了payload() 函数的名称,使其不会干扰变量名称。


编辑

我问了一个类似的问题,因为我认为你的公式很有趣,而且 Frank Yellin 的 answer 也适用于这里(所以所有功劳归于他):

import numpy as np
from scipy.stats import binom

binomial = binom(p=p, n=N)
pmf = binomial(np.arange(N+1))
res = coeff**n*np.sum(payoff * pmf)

在这种形式中,循环中计算的内容也更清楚: 二项式分布随机变量收益的期望值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2011-07-24
    • 1970-01-01
    相关资源
    最近更新 更多