1. 这节究竟解决什么实际问题?¶
10.1 蒙特卡洛方法:期权定价与风险模拟 的具体任务是:用随机路径估计期权价格和风险,量化模拟误差而非只报一个价格。 本节将明确输入数据、计算过程、输出及其在后续研究中的用途。
2. 前置知识¶
掌握基础代数、概率和 Python 数组操作。 对公式的理解应包括变量定义、单位、时间索引和适用条件。
3. 数据说明¶
使用模拟或固定教学数据;重点是说明模型假设、估计误差和数值误差。 运行前先检查 shape、日期范围、列名与缺失值。数据看起来能画图,不代表它适合回答研究问题。
4. 学习目标与完成标准¶
完成本节后,你应能用自己的话解释 10.1 蒙特卡洛方法:期权定价与风险模拟 的输入、计算步骤、输出和局限;尤其能说明:用随机路径估计期权价格和风险,量化模拟误差而非只报一个价格。 你还应能独立改动一个参数并解释结果为什么变化,指出至少一个会让结论失真的假设。
5. 核心概念与公式¶
数学方法给出明确的计算规则;结论是否有效仍取决于研究对象、输入数据和模型假设。
先给出符号、单位、假设和可识别条件,再把公式翻译为逐步代码。 看到公式时依次确认:每个符号的单位是什么?它属于哪个时点?分母会不会为零?它是描述性统计量、预测量,还是交易规则?
6. 从零实现¶
原始代码按照“准备输入 → 计算中间量 → 得到结果 → 解释输出”的顺序组织。每个单元应检查变量类型、索引、维度和代表性数值。中间变量用于核对公式实现和定位计算错误。
7. 成熟库实现¶
数值库帮你稳定求解;理解目标函数、约束和诊断仍不可省略。 使用库函数前先阅读参数含义、默认值和返回对象;库输出一个数字,并不说明这个数字适合你的交易假设。
8. 两种实现的差异¶
从零实现便于核对公式、调试和识别隐含假设;成熟库适合在计算逻辑已验证后复用。两种实现依赖相同的数据口径与时点假设,使用库函数不会改变输入数据的质量。
9. 预期结果与检查范围¶
你应看到维度正确的 Series/DataFrame、日期单调递增的索引,以及能支持“用随机路径估计期权价格和风险,量化模拟误差而非只报一个价格。”这一任务的表格或图形。金融日收益率均值通常接近 0;若出现极大的连续收益、空表、全 NaN 或索引错位,应先排查数据和对齐逻辑,而不是立即相信结果。
10. 常见错误与诊断¶
随机种子未固定、矩阵维度错配、优化约束遗漏、把数值收敛当成模型正确。
诊断顺序:先打印类型与 shape,再看 head()/tail(),接着检查日期和 NaN,最后才比较数值。这样能避免在错误的对象上反复改参数。
11. 研究偏差检查¶
数学模型的简化假设也会引入偏差;需要做参数敏感性与极端情景检查。 结果至少应与一个简单基线比较,并明确哪些部分只是教学演示。
12. 三层练习与答案¶
- 基础练习:验证一个中间变量、补全一段小计算,并用一句话解释输出。
- 研究练习:改变窗口、样本区间、约束或标的,记录哪些结论仍成立。
- 开放项目:把本节方法嵌入模块项目,报告基线、失败结果和限制。
题目在 ../exercises/10_math_methods/01_monte_carlo_exercises.ipynb;完整推导、可运行参考实现与结果检查在 ../solutions/10_math_methods/01_monte_carlo_solutions.ipynb。请先独立作答,再打开答案。
13. 延伸阅读¶
延伸材料:QuantEcon Python Lectures。阅读记录应包括研究假设、数据频率、样本范围和结论适用条件。
14. 下一节¶
下一节是 02_linear_programming。本节的概念会成为理解它的输入,而不是孤立的名词。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(42)
print('Libraries loaded')
Libraries loaded
import matplotlib.pyplot as plt
# 1. 设置系统自带的中文字体(这里使用黑体 SimHei)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 如果你想用微软雅黑,可以改成 ['Microsoft YaHei']
# 2. 解决更换字体后,负号(-)显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
1. 几何布朗运动(GBM):股价路径模拟¶
$$dS_t = \mu S_t dt + \sigma S_t dW_t$$
离散化(Euler-Maruyama): $$S_{t+\Delta t} = S_t \cdot \exp\left[(\mu - \frac{\sigma^2}{2})\Delta t + \sigma\sqrt{\Delta t}\,Z_t\right]$$
其中 $Z_t \sim N(0,1)$ 是标准正态随机变量。
S0 = 100 # 初始股价
mu_gbm = 0.08 # 年化漂移率
sigma_gbm = 0.20 # 年化波动率
T = 1.0 # 期限 1 年
dt = 1/252 # 日频步长
N = int(T/dt) # 总步数
n_paths = 2000 # 模拟路径数
# 批量模拟 GBM 路径
Z = np.random.standard_normal((N, n_paths))
log_returns = (mu_gbm - 0.5*sigma_gbm**2)*dt + sigma_gbm*np.sqrt(dt)*Z
paths = S0 * np.exp(log_returns.cumsum(axis=0)) # shape: (N, n_paths)
# 可视化部分路径
plt.figure(figsize=(12, 5))
plt.plot(paths[:, :50], alpha=0.3, lw=0.8, color='steelblue')
plt.plot(paths[:, 0], color='red', lw=1.5, label='单条路径样例')
plt.axhline(S0, color='black', linestyle='--', alpha=0.5, label=f'S0={S0}')
plt.title(f'GBM 股价路径模拟 (μ={mu_gbm:.0%}, σ={sigma_gbm:.0%}, {n_paths}条)')
plt.xlabel('交易日'); plt.ylabel('股价'); plt.legend(); plt.grid(alpha=0.3)
plt.show()
print(f'期末股价分布: 中位数={np.median(paths[-1]):.1f}, 均值={paths[-1].mean():.1f}')
期末股价分布: 中位数=105.9, 均值=108.0
2. 欧式期权的蒙特卡洛定价¶
欧式看涨期权到期日 $T$ 时的收益为: $$\text{Payoff} = \max(S_T - K, 0)$$
期权价格 = 贴现的期望收益: $$C = e^{-rT} \cdot E[\max(S_T - K, 0)]$$
K = 105 # 行权价
r = 0.04 # 无风险利率
# MC 估计:期末股价的期权收益
S_T = paths[-1] # 期末股价(N条路径)
payoffs = np.maximum(S_T - K, 0)
C_mc = np.exp(-r*T) * payoffs.mean()
C_mc_std = np.exp(-r*T) * payoffs.std() / np.sqrt(n_paths) # 标准误
# Black-Scholes 解析公式(验证)
def bs_call(S, K, r, sigma, T):
d1 = (np.log(S/K) + (r + 0.5*sigma**2)*T) / (sigma*np.sqrt(T))
d2 = d1 - sigma*np.sqrt(T)
return S * stats.norm.cdf(d1) - K*np.exp(-r*T) * stats.norm.cdf(d2)
C_bs = bs_call(S0, K, r, sigma_gbm, T)
print(f'MC 期权价格: {C_mc:.4f} ± {C_mc_std*1.96:.4f} (95% CI)')
print(f'BS 解析公式: {C_bs:.4f}')
print(f'MC 误差: {abs(C_mc - C_bs):.4f} ({abs(C_mc-C_bs)/C_bs:.2%})')
MC 期权价格: 9.8284 ± 0.6368 (95% CI) BS 解析公式: 7.5670 MC 误差: 2.2614 (29.89%)
# 对偶变量法
n_antithetic = 1000
Z_half = np.random.standard_normal((N, n_antithetic))
# 正向路径
lr_pos = (mu_gbm - 0.5*sigma_gbm**2)*dt + sigma_gbm*np.sqrt(dt)*Z_half
ST_pos = S0 * np.exp(lr_pos.sum(axis=0))
# 对偶路径(用 -Z)
lr_neg = (mu_gbm - 0.5*sigma_gbm**2)*dt + sigma_gbm*np.sqrt(dt)*(-Z_half)
ST_neg = S0 * np.exp(lr_neg.sum(axis=0))
# 对偶估计量
payoff_antithetic = (np.maximum(ST_pos-K, 0) + np.maximum(ST_neg-K, 0)) / 2
C_antithetic = np.exp(-r*T) * payoff_antithetic.mean()
std_antithetic = np.exp(-r*T) * payoff_antithetic.std() / np.sqrt(n_antithetic)
# 普通 MC(同样路径数)
payoff_plain = np.maximum(S0*np.exp(lr_pos.sum(axis=0))-K, 0)
C_plain = np.exp(-r*T) * payoff_plain.mean()
std_plain = np.exp(-r*T) * payoff_plain.std() / np.sqrt(n_antithetic)
print(f'路径数: {n_antithetic}')
print(f'普通 MC: {C_plain:.4f} 标准误 = {std_plain:.4f}')
print(f'对偶变量: {C_antithetic:.4f} 标准误 = {std_antithetic:.4f}')
print(f'方差减少比: {(std_plain/std_antithetic)**2:.1f}x')
路径数: 1000 普通 MC: 9.8887 标准误 = 0.4512 对偶变量: 9.8767 标准误 = 0.2364 方差减少比: 3.6x
练习¶
- 将期权类型改为亚式期权(payoff 基于路径平均价格而非期末价格),重新计算 MC 定价。
- 绘制期权价格 vs 行权价 K 的曲线(K 从 80 到 130),与 Black-Scholes 公式对比。
- 用 MC 方法计算含 5 只股票(有相关性)的组合在 95% 置信水平下的一年期 VaR。
下一节 → 02_linear_programming.ipynb