Python实现离散监测欧式障碍看涨期权二叉树定价的代码问题求助
代码错误修正及说明
- 缺少numpy依赖导入:代码中大量使用
np前缀的numpy方法,但开头没有添加import numpy as np声明,运行会直接报错。 - 变量名拼写错误:回代过程中使用了未定义的变量
H,实际障碍参数定义为b,需要对应替换。 - 障碍条件完全写反:你的期权是向下敲出看涨期权,障碍值b=60低于初始价格S0=100,敲出条件是标的价格≤b时期权价值归零,你代码中写成
C[S >= b] = 0,会把所有正常存续的期权价值直接清零,导致结果恒为0。另外注释里的up-and-out也标注错误,应为down-and-out。 - 时间步设置与离散监测时点不匹配:你设置总时间步N=4,对应每步时长为10/4=2.5年,而你的监测时点是第2、4、7年,无法对应到二叉树的节点上,无法正确执行离散监测逻辑。建议将N设为10,每步对应1年,刚好所有监测时点都落在树节点上。
- 风险中性概率计算错误:你用了连续复利贴现
np.exp(-r*dt),对应的风险中性概率q应该是(np.exp(r*dt) - d)/(u-d),原代码用1+r是单利逻辑,和贴现方式不匹配,会导致定价偏差。 - 障碍检测逻辑错误:你是离散监测期权,仅需要在t=2、4、7这三个时点检查障碍,原代码每一步回代都检查障碍,属于连续监测的逻辑,不符合你的合约规则。
- 无输出的直接原因:你只调用了定价函数没有打印返回值,脚本模式下运行不会自动输出结果,需要添加
print()包裹函数调用。
修正后的可运行代码
import numpy as np # 初始化参数 S0 = 100 # 标的初始价格 K = 125 # 行权价 T = 10 # 到期年限 b = 60 # 向下敲出障碍值 r = 0.05 # 年无风险利率 N = 10 # 总时间步,每步对应1年,匹配监测时点 u = 1.1 # 上涨因子 d = 0.9 # 下跌因子 opttype = 'C' # 期权类型,C看涨P看跌 def barrier_binomial(K,T,S0,b,r,N,u,d,opttype='C'): dt = T/N # 修正风险中性概率计算 q = (np.exp(r*dt) - d)/(u-d) disc = np.exp(-r*dt) # 离散监测时点对应的步数,每步1年,对应第2、4、7步 monitor_steps = {2,4,7} # 初始化到期日标的价格 S = S0 * d ** (np.arange(N,-1,-1)) * u ** (np.arange(0,N+1,1)) # 到期日期权 payoff if opttype == 'C': C = np.maximum(S - K, 0) else: C = np.maximum(K - S, 0) # 到期日不在监测时点范围内,不需要检查障碍,直接回代 for i in np.arange(N-1, -1, -1): S = S0 * d ** (np.arange(i,-1,-1)) * u ** (np.arange(0,i+1,1)) # 递归计算节点价值 C[:i+1] = disc * ( q * C[1:i+2] + (1-q) * C[0:i+1] ) C = C[:-1] # 仅在监测时点检查障碍 if i in monitor_steps: C[S <= b] = 0 return C[0] # 打印输出结果 print(barrier_binomial(K,T,S0,b,r,N,u,d,opttype='C'))
定价方法属性说明
二叉树定价不属于模拟类方法,它属于网格类数值解析方法,基于无套利定价原理和风险中性定价假设,通过构造标的价格的树形结构向后递归计算期权价值。模拟类方法指的是蒙特卡洛类依赖随机抽样生成标的路径来计算期望收益的方法,二者逻辑完全不同。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

