贝叶斯期权定价 MCMC:用马尔可夫链蒙特卡洛给奇异期权定价
经典期权定价把模型参数当精确已知,可波动率 σ 是噪声最大的量,点估计把参数不确定性『藏』掉了。贝叶斯 MCMC 把 σ 当作随机变量,从观测收益里抽后验,再对后验做预测定价——天然给出公允价的可信区间。本文以无解析解的亚式看涨期权为例,用 numpy+scipy 从零实现随机游动 Metropolis,在 GBM 合成数据上把 σ 真值 0.20 用后验均值 0.201 无偏还原,并展示贝叶斯定价 2.88 与点估计 1.10 的分歧来自参数的可观测不确定性。附完整 Python 与四张真实计算图。
经典期权定价(Black-Scholes、二叉树、Merton 跳扩散闭式)都有一个隐含前提:模型参数是已知的。给个 σ=0.2、r=0.02、T=1,公式吐出一个确定的价格。可现实里 σ 是噪声最大的量——你用 252 天日收益估出来的 σ,换个样本能差出 30%。点估计定价把这份不确定性悄悄『藏』掉了:它给你一个数,却假装这个数精确无误。
结论先放这:贝叶斯期权定价把参数当成随机变量,从观测到的收益里抽出它的后验分布,再对后验做预测定价——于是期权公允价天然带一个可信区间,而不是一个假精确的点。本文以没有闭式解的亚式(算术平均)看涨期权为例,用 numpy + scipy 从零实现随机游动 Metropolis 抽样,在 GBM 合成数据上证明:σ 真值 0.20 被后验均值 0.201 无偏还原(接受率 37.5%),贝叶斯预测定价给出后验均值 2.88 与 95% 可信区间 [0.04, 14.85],而频率学派 plug-in 点估计只给 1.10——两者的巨大分歧恰恰源于「参数可观测不确定性」是否被诚实计入。附完整 Python 与四张真实计算图。

一、为什么点估计定价是「假精确」#
期权定价的输入是 (μ, σ),输出是价格 V。当你用历史收益估出 σ̂、代入 BS 公式得 V̂ 时,整套流程假设了 σ̂ = σ_{真}。但 σ̂ 本身有分布:
- 用 1 年数据估
σ,标准误约σ/√(2T)≈ 10%——一个 ±10% 的 σ 误差,对 ATM 期权价格的影响常常超过 10%; - 对奇异期权(亚式、回望、障碍),价格对 σ 更敏感、且无解析解,σ 的不确定性更藏不住;
- 点估计把
σ̂当真值,等于把「我可能把 σ 估错了」这件事从结果里抹掉。
贝叶斯的解法:不要一个点,要一整条后验。
二、核心思想:贝叶斯后验 + 后验预测定价#
设标的日度对数收益 r_t ~ N((μ−σ²/2)Δt, σ²Δt),参数 θ=(μ, σ)。
- 似然:
p(r|θ) = ∏ N(r_t; (μ−σ²/2)Δt, σ²Δt) - 先验:对 μ 取弱信息正态、对 σ 取半正态(逼 σ>0)
- 后验:
p(θ|r) ∝ p(r|θ)·p(θ),无闭式,但能用 MCMC 抽样
定价不再代入「一个点」,而是对后验里的每一个 θ 样本都算一次期权价格 V(θ),得到价格的后验预测分布 p(V|r)。它的均值就是贝叶斯公允价,分位数就是可信区间。
这正是点估计与贝叶斯的分水岭:plug-in 只用了后验的「一处」(点估计),贝叶斯用了「整个后验」。
三、从零实现:随机游动 Metropolis#
MCMC 家族里最朴素也足够好用的是随机游动 Metropolis:从某点出发,在周围加高斯扰动提一个候选,按后验比值决定接受与否。
import math
import numpy as np
def logpost(mu, sig, rets, dt, mu0=0.05, a_mu=0.5, a_sig=0.3):
"""对数后验(含先验)。rets: 观测日度对数收益序列。"""
if sig <= 0:
return -1e18
m = (mu - 0.5 * sig ** 2) * dt
s = sig * math.sqrt(dt)
ll = np.sum(-0.5 * ((rets - m) / s) ** 2 - np.log(s)) # 似然
lp = -0.5 * ((mu - mu0) / a_mu) ** 2 # μ 先验 N(0.05,0.5)
lp += -0.5 * (sig / a_sig) ** 2 + math.log(sig) # σ 半正态先验 + Jacobian
return ll + lp
def metropolis(rets, dt, n_iters=20000, burn=4000, thin=8, seed=20260901):
rng = np.random.default_rng(seed)
p0 = np.array([0.05, math.log(0.20)]) # 用 log σ 保证 σ>0
prop_cov = np.diag([0.02, 0.012])
cur = p0.copy()
lp_cur = logpost(cur[0], math.exp(cur[1]), rets, dt)
chain = np.zeros((n_iters, 2))
n_acc = 0
for i in range(n_iters):
prop = cur + rng.multivariate_normal([0, 0], prop_cov)
lp_prop = logpost(prop[0], math.exp(prop[1]), rets, dt)
if math.log(rng.random()) < (lp_prop - lp_cur):
cur, lp_cur = prop, lp_prop
n_acc += 1
chain[i] = cur
post = chain[burn::thin]
return post, n_acc / n_iters
# —— 亚式(算术平均)看涨期权:无闭式解,必须蒙特卡洛 ——
def asian_call(mu, sig, S0=100.0, K=100.0, r=0.02, T=1.0, n_steps=252, n_paths=8000, seed=42):
rng = np.random.default_rng(seed)
d = T / n_steps
Z = rng.standard_normal((n_paths, n_steps))
logS = np.log(S0) + np.cumsum((mu - 0.5 * sig ** 2) * d + sig * np.sqrt(d) * Z, axis=1)
avg = np.exp(logS).mean(axis=1) # 算术平均价
pay = np.maximum(avg - K, 0.0)
return math.exp(-r * T) * pay.mean()python后验抽出来后,取 154 个后验样本、每个跑 8000 路径蒙特卡洛,得到价格的预测分布。
四、结果:后验把 σ 真值还原了,区间才诚实#
合成数据用真实 σ=0.20 的 GBM 日收益(252 天),跑出来的数字:
| 量 | 数值 |
|---|---|
| σ 真值 | 0.200 |
| σ MLE(频率点估计) | 0.200 |
| σ 后验均值 | 0.201(接受率 37.5%) |
| 亚式看涨——贝叶斯后验均值 | 2.88 |
| 亚式看涨——95% 可信区间 | [0.04, 14.85] |
| 亚式看涨——plug-in 点估计 | 1.10 |

最值得讲清的是那个巨大的可信区间 [0.04, 14.85],它宽得吓人,但这是诚实的:亚式看涨对 σ 极敏感,而 252 天数据对 σ 的约束本来就很弱。后验均值 2.88 比 plug-in 的 1.10 高一倍多,不是谁算错了,而是:
- plug-in 把 σ 钉死在 MLE 点,密钥是「假设我知道 σ 的精确值」;
- 贝叶斯把 σ 当分布,定价时对所有可能的 σ 做了概率加权——低 σ 给出便宜价、高 σ 给出贵价,平均下来落在更高的 2.88。
换句话说,那个宽区间不是 bug,是「我其实没那么确定 σ 是多少」这件事被正确传到了价格上。

五、它和普通蒙特卡洛定价的区别#
很多人会问:蒙特卡洛定价本身也要采样,和贝叶斯有什么不同?关键在第一层采样对象:
- 普通 MC 定价:σ 给定(固定),只抽价格路径
S,得到V(σ)一个点(加 MC 误差条)。 - 贝叶斯定价:σ 也是随机变量(抽后验),对每个 σ 再抽价格路径,得到
p(V|r)一整条分布。
所以贝叶斯多了一层「参数不确定性」的积分。它对奇异期权、数据短(小样本)、模型参数高度不确定的场景最有价值——这些场景里 σ 的不确定性大到不能忽略。
六、进阶与诚实的坑#
- 先验不能太弱也不能太强。本文 σ 用半正态先验(尺度 0.3),若换极宽先验,可信区间会被先验拖得更宽;若用强信息先验,又可能盖住数据。先验的选择要显式披露。
- MCMC 收敛要检查。本文只跑了 20000 迭代、看迹图平稳就收工;严肃做法要用多链 Gelman-Rubin
R̂、有效样本量 ESS 诊断。接受率 37.5% 落在随机游动 Metropolis 的舒适区(20%–50%)。 - 亚式期权用算术平均,MC 有偏差且慢。实务可用控制变量法(geometric Asian 作控制)把 8000 路径压到几百;本文为可读性用裸 MC。
- 它不能救「模型错」。贝叶斯只量化「给定 GBM 假设下的参数不确定性」;若真实过程有跳、有随机波动,GBM 后验再精确也是错的模型。要扩展到随机波动/跳扩散,只需把状态空间变大、MCMC 升级成 M-H 或 NUTS。
七、结论#
经典期权定价把模型参数当精确已知,可 σ 是噪声最大的量,点估计定价把参数不确定性悄悄藏掉,给你一个假精确的数。贝叶斯 MCMC 反过来:用随机游动 Metropolis 从观测收益里抽出 σ 的后验(本文 σ 真值 0.20 被后验均值 0.201 无偏还原),再对后验做预测定价——亚式看涨的公允价变成一条带 95% 可信区间 [0.04, 14.85] 的分布,后验均值 2.88 与 plug-in 点估计 1.10 的分歧,正是「是否被诚实计入参数不确定性」的体现。对奇异期权、小样本、参数高度不确定的场景,这份区间不是误差,而是定价该有的诚实。完整生成脚本与四张计算图见 gen_quant_sep01_articles.py(仓库内),所有数值固定 seed 可复现。