多期二叉树下欧式看涨期权蒙特卡洛定价实现问题
欧式看涨期权二叉树定价实现
闭式解实现
你使用的二叉树欧式看涨期权闭式定价公式如下:
原有代码逻辑整体正确,但存在一处笔误:二项分布概率项中风险中性上涨概率q的指数应为单条路径的上涨次数i,而非总期数T。修正后的闭式解可直接得到期权精确理论价格。
蒙特卡洛多路径模拟定价实现
你需要实现的蒙特卡洛定价公式如下:
核心实现逻辑
风险中性测度下的二叉树路径模拟不需要使用你代码中定义的真实世界上涨概率p=0.2,必须使用风险中性概率q = ((1+r)-d)/(u-d)生成路径,否则定价结果会出现系统性偏差。实现步骤如下:
- 初始化N条路径的起点价格为S0
- 对每条路径的每一期,独立做伯努利抽样:以概率q判定股价上涨,乘以上涨因子u;以概率1-q判定股价下跌,乘以下跌因子d,递推得到每一期的股价,直到T时刻
- 计算每条路径T时刻的期权到期收益
max(S_T - K, 0) - 对所有路径的到期收益取算术平均,乘以T期的无风险折现因子,得到蒙特卡洛估计的期权价值
可运行代码(标准库版本,无第三方依赖)
import math import random # 基础参数与闭式解保持一致 T = 2 # 二叉树期数 S0 = 10 # 股票初始价格 K = 9 # 看涨期权行权价 r = 0.2 # 单期无风险利率 u = 1.5 # 单期上涨乘数 d = 0.5 # 单期下跌乘数 N = 200 # 模拟路径总条数 q = ((1 + r) - d) / (u - d) # 风险中性测度下单期上涨概率 discount_factor = 1 / (1 + r) ** T # 到期收益折现因子 random.seed(42) # 固定随机种子,方便结果复现 total_payoff = 0 all_price_paths = [] # 如需留存所有路径的各期价格可使用该列表 for _ in range(N): current_S = S0 path = [S0] # 递推生成单条路径的各期价格 for _ in range(T): if random.random() < q: current_S *= u else: current_S *= d path.append(current_S) all_price_paths.append(path) # 累加到期收益 total_payoff += max(path[-1] - K, 0) # 计算蒙特卡洛定价结果 mc_price = discount_factor * (total_payoff / N) print(f"N={N}次蒙特卡洛模拟得到的期权价格:{mc_price:.4f}") # 闭式解结果对照 closed_form_payoff = 0 for i in range(T+1): prob = math.comb(T, i) * (q ** i) * ((1 - q) ** (T - i)) ST = (u ** i) * (d ** (T - i)) * S0 closed_form_payoff += max(ST - K, 0) * prob closed_form_price = discount_factor * closed_form_payoff print(f"二叉树闭式解得到的期权精确价格:{closed_form_price:.4f}")
运行上述代码可以看到,N=200时蒙特卡洛结果已经和2.1528的精确价格非常接近,当N增大到10000以上时,模拟结果会进一步收敛到精确值。
大样本加速版本(numpy向量化实现)
如果需要模拟十万甚至百万级别的路径数,用原生Python循环速度较慢,可以用numpy做向量化计算,代码如下:
import numpy as np T = 2 S0 = 10 K = 9 r = 0.2 u = 1.5 d = 0.5 N = 20000 q = ((1 + r) - d) / (u - d) discount_factor = 1 / (1 + r) ** T # 一次性生成所有路径的涨跌抽样 up_down = np.random.binomial(1, q, size=(N, T)) period_returns = np.where(up_down == 1, u, d) # 批量计算所有路径的各期价格 price_paths = S0 * np.cumprod(period_returns, axis=1) price_paths = np.hstack([np.full((N, 1), S0), price_paths]) # 批量计算到期收益和期权价格 terminal_payoffs = np.maximum(price_paths[:, -1] - K, 0) mc_price_fast = discount_factor * terminal_payoffs.mean() print(f"N={N}次向量化模拟得到的期权价格:{mc_price_fast:.4f}")
内容的提问来源于stack exchange,提问作者FlubberBeer
相关产品推荐
相关产品推荐

