Heston 模型:从二状态 SDE 到半解析定价
给波动率一个自己的随机源之后,可解性靠什么保住:Heston 的仿射结构、特征函数的完整推导、傅里叶反演的数值细节,以及五参数校准的病态之处。
上一篇局部 vol 的三个缺陷——前向微笑太平、现货-波动率相关钉死在 、没有独立的波动率风险——其实是同一句话:模型里缺第二个随机源。补上它很容易,难的是补上之后还能算。随便给 加一个随机过程,得到的二维模型多半只能靠蒙特卡洛硬跑。Steven Heston 在 1993 年找到的组合拳是:让方差走一个均值回归的平方根过程,于是模型落在仿射类里,特征函数有闭式,欧式期权定价归结为一个一维积分。可解性不是运气,是结构;本文就沿着这条结构线走一遍:模型怎么搭、闭式怎么推、数值怎么算、校准哪里病态、以及它自己又错在哪。
设置
SDE 系统:
带 。五个参数各管一件事: 是方差的均值回归速度(单位 ), 是方差回归的长期水平, 是 vol of vol——为了不和 BS 的 混淆,文献里也常写作 或 (它是模型参数,别和二阶希腊字母 volga 搞混), 是股票与方差创新的相关, 是初始方差。
方差方程的漂移是 Ornstein-Uhlenbeck 式的拉回,但作用在 上而非过程本身;扩散项的 让波动在 接近零时自动收小,在 Feller 条件 下过程保持严格为正。整个模型通常直接在风险中性测度 下陈述;方差风险的市场价格只有在你要回到物理测度 做情景分析时才需要显式引入,定价时可以不管。
这个参数值得单独说。股票指数市场上 :指数跌,方差涨。这是杠杆效应——经济机制至今有争论(行为解释、“价格跌则财务杠杆升”的制度解释都有拥趸),但经验事实本身很牢固,它正是负偏斜微笑的动力学来源。外汇市场则不同,主要货币对的收益大体对称、微笑也对称,同一个 Heston 带 就能描述得不错。可以说负相关是 Heston 区别于纯对数正态混合模型、真正”挣到”股票偏斜的地方。
定价思路:特征函数
模型有了,怎么定价?Heston 的路线不走 PDE 数值解,而是绕道频域。定义 在风险中性测度下的特征函数:
其中 是到期时间,所以 。特征函数就是分布的全部信息;只要 有闭式,任何欧式收益的价格都能用一个傅里叶型积分反演出来。对看涨,一个方便的形式(Lewis 型,沿 的轮廓)是:
(这里 已含 的漂移, 展开后会吐出一个 因子,和 合成对称的 前因子——量纲是对的。)被积函数按 衰减,标准数值积分每个行使价不到一毫秒。
所以全部的难度集中在一处:算出 的闭式。这就是仿射结构登场的地方。
的 backward PDE
作为条件期望,满足 Kolmogorov backward 方程:
其中 是联合 过程的无穷小生成元,在风险中性测度下:
这是一个二维 PDE,直接解并不比蒙特卡洛便宜。关键一步是猜对解的形状——试仿射 ansatz :状态变量 和 只以线性组合出现在指数上。之所以敢这么猜,是因为生成元的每一项系数都对 线性(注意 作用在 上只产生 的一次项)——这正是”仿射模型”的定义性特征,Heston 的可解性全部来自这里。
代入之后,PDE 按 的幂次分拆成两条 ODE。 的一次项给出 的方程:
这是 Heston Riccati 方程。三项各有出处: 来自对数价格的扩散与 Itô 漂移修正, 打包了方差的均值回归和杠杆效应(相关 在这里进入), 是 vol-of-vol 的贡献。常数项给出 的方程:
是标准 Riccati, 只是对 积分。初值条件在 (到期时刻):、,沿到期时间 正向积分即可。
闭式解
Riccati 方程可以显式解。定义判别式:
和比率:
在相关的定义域上 。 的解(取 的数值稳定形式):
Heston 原始论文写的是代数上等价的另一形式,用 和增长指数:
两式在纸面上相等,在浮点数里不等价: 随期限指数增长,配合复对数取分支会在长期限上产生跳变——这是 Heston 实现里最著名的坑,修法就是统一用 形式(Lord & Kahl, 2010 对复对数分支问题有完整处理)。 的解(同一约定下):
合起来:
这就是 Heston 特征函数。看涨定价在带 内有效;看跌用平价关系或移轮廓。
数值反演与代码
除了上面的 Lewis 形式,Heston (1993) 原文用的是概率分解表示:
其中 是风险中性行权概率( 即上面的 ), 是以股票计价的行权概率()。不同作者的写法差在轮廓和归一化上,内容等价。被积函数按 衰减,几百个积分点就有 6 位精度;截断到 通常绰绰有余。
可运行的实现(稳定 形式,已对 极限与 Black-Scholes 核对):
import numpy as np
from scipy.integrate import quad
def heston_phi(u, S0, r, T, v0, kappa, theta, sigma, rho):
d = np.sqrt((rho * sigma * 1j * u - kappa)**2
+ sigma**2 * (1j * u + u**2))
g = (kappa - rho * sigma * 1j * u - d) / (kappa - rho * sigma * 1j * u + d)
e = np.exp(-d * T)
B = (kappa - rho * sigma * 1j * u - d) / sigma**2 * (1 - e) / (1 - g * e)
A = (1j * u * (np.log(S0) + r * T)
+ kappa * theta / sigma**2
* ((kappa - rho * sigma * 1j * u - d) * T
- 2 * np.log((1 - g * e) / (1 - g))))
return np.exp(A + B * v0)
def heston_call(S0, K, r, T, v0, kappa, theta, sigma, rho):
"""Lewis 轮廓 Im(u) = -1/2 上的一维积分。
phi(u - i/2) 内含 sqrt(S0 e^{rT}) 因子,故前因子只剩 sqrt(K) e^{-rT}。"""
def integrand(u):
return np.real(np.exp(-1j * u * np.log(K))
* heston_phi(u - 0.5j, S0, r, T, v0, kappa, theta, sigma, rho)
) / (u**2 + 0.25)
val, _ = quad(integrand, 0, 200, limit=400)
return S0 - np.sqrt(K) * np.exp(-r * T) / np.pi * val
五十行以内,Heston 下的欧式期权就有了。逐个行使价调 quad 对研究够用;要给整条链定价,用 FFT 类方法(Carr & Madan, 1999)或 COS 方法(Fang & Oosterlee, 2008),下文会讲。
校准
拿到定价函数,下一步是从市场反推参数:在 上做优化拟合市场 IV。五个参数对几百个报价,听起来超定得很安全,实际上病态得很有特点。流程是标准的:选一个校准集(比如逐周到期、每个到期 5 个行使价),定义损失 ,然后用 Levenberg-Marquardt 做局部优化或差分进化做全局搜索。
病在哪?第一,可识别性。不同的参数组合能长出几乎相同的曲面:ATM 水平主要由 和 定,偏斜主要由 定,两翼陡度由 和 的乘积定——最优点附近参数高度共线。第二,多个局部极小,不带全局搜索容易停在错的盆里。第三, 是五个参数里识别最弱的:数据钉不死它,股票上的合理范围大约在 到 之间,对短期期权几乎不敏感——这也正是上一节 时 从期望方差里完全消失那个现象的校准侧写照。
一个典型的 SPX 校准从 起步。优化收敛后,残差通常集中在深度虚值看跌上——那正是模型灵活性最差的地方:连续路径的扩散给不出足够肥的短期左尾,要修这个得加跳跃(Merton, 1976),这是下一篇文章的主题。
Heston 自己错在哪
局部 vol 的病 Heston 治了一半,自己也留了三个,按严重程度排。
第一,偏斜动态。 是常数,所以模型里偏斜陡度和波动率水平的关系被焊死了。经验上,低波动时期偏斜(以适当口径衡量)往往更平、高波动时期更陡,而且两者的联动本身在变。常数 表达不了这个。
第二,前向微笑。Heston 的前向微笑比局部 vol 的更接近现实(它不会无限变平),但校准到今天香草曲面的参数,给出的远期起始期权价格仍然对不上这类产品的市场报价——前向微笑动态仍然太”温顺”。
第三,vol-of-vol 自己也在动。参数 是常数,而现实里波动率的波动率在平静期低、压力期飙升。这层动态 Heston 完全没有,粗糙波动率和多因子 Bergomi 类模型要修的就是它。
香草之外:仿真
欧式期权走特征函数;路径依赖产品——亚式、障碍、回望——就得回到路径本身,要么在 上解二维 PDE(低维收益可行但慢),要么蒙特卡洛。仿真 Heston 的第一课是:朴素 Euler-Maruyama 会死。平方根扩散离散化后, 会采出负值, 直接 NaN。生产级方案都绕着这个设计:Andersen (2008) 的 Quadratic-Exponential (QE) 方案按 的大小分支—— 大时用矩匹配的二次(高斯平方)近似, 小时切换到矩匹配的指数分布,天然非负;同文还给出带鞅修正的变体,把离散化引入的远期偏差压掉。Alfonsi (2005) 的隐式方案是另一条保正性的路线。
def simulate_heston_qe(S0, r, T, v0, kappa, theta, sigma, rho, n_paths, n_steps):
"""QE 方案骨架(Andersen, 2008)。psi <= psi_c 走二次分支,否则走指数分支。"""
dt = T / n_steps
psi_c = 1.5
S = np.full(n_paths, S0)
v = np.full(n_paths, v0)
for step in range(n_steps):
# v 的条件矩(CIR 过程有闭式)
m = theta + (v - theta) * np.exp(-kappa * dt)
s2 = (v * sigma**2 * np.exp(-kappa * dt) / kappa * (1 - np.exp(-kappa * dt))
+ theta * sigma**2 / (2 * kappa) * (1 - np.exp(-kappa * dt))**2)
psi = s2 / m**2
# 二次分支: v' = a (b + Z)^2, a、b 由 (m, s2) 矩匹配解出
# 指数分支: v' 按 p 的概率取 0、否则取指数样本,同样矩匹配
# 对数价格步: 用 Andersen 的 K0..K4 系数把 v 的路径积分和相关性接进去
...
return S
完整实现大约一百行细致的数值工作,每一步都直白;QuantLib 等库有现成版本。分支常数、对数价格步的 系数,都在 Andersen 原文里列得清清楚楚。
反演的工程学:阻尼与 COS
直接对着定价积分堆积分点之外,有两件工程武器值得知道。
第一是阻尼。看涨收益本身不可积(随 线性增长),Carr 和 Madan (1999) 的处理是给价格乘上 ()再做傅里叶变换,得到的变换有闭式:
对 做逆变换、再除掉 就是价格。 的选取影响被积函数的衰减和振荡,选得好积分区间可以收得很短;选得差(尤其长期限、极端行使价)会撞上复对数分支和数值下溢——这也是为什么特征函数要用 稳定形式的又一个理由。
第二是 COS 方法(Fang & Oosterlee, 2008):在截断区间 上把密度按余弦基展开,价格变成一个快速收敛的级数:
其中 是收益函数的余弦系数(香草收益有闭式),撇号表示首项减半。特征函数的求值和行使价无关,算一次就能喂给整条链;系数结构还能用 FFT 批量化。典型设置 到 4 位精度、 到 6 位,整链毫秒级。
import numpy as np
def cos_heston_chain(S0, K_array, r, T, v0, kappa, theta, sigma, rho, N=512, L=10):
"""COS 方法骨架(Fang & Oosterlee, 2008)。"""
# 截断区间 [a, b]: 用 ln(S_T/K) 的前几阶累积量定,L 控制覆盖宽度
a, b = -L * np.sqrt(T) * 0.3, L * np.sqrt(T) * 0.3 # 示意;正式实现用累积量公式
x = np.log(S0 / K_array)
n = np.arange(N)
u_n = n * np.pi / (b - a)
phi_n = np.array([heston_phi(u, 1.0, r, T, v0, kappa, theta, sigma, rho)
for u in u_n]) # 与 K 无关,只算一次
V_n = cos_payoff_coeffs_call(a, b, N) # 香草收益系数,闭式
w = np.ones(N); w[0] = 0.5
series = (w * np.real(phi_n[None, :] * np.exp(1j * np.outer(x - a, u_n))) * V_n).sum(axis=1)
return np.exp(-r * T) * K_array * series
COS 是仿射模型整链定价的生产标准;它的适用范围就是”特征函数已知”这一条,所以从 Heston 到 Bates 到 Lévy 模型通吃。
微笑动态
校准好的 Heston 不只给今天的价格,还隐含地回答”现货动了之后微笑怎么动”。两个参照系:sticky-strike——现货动,每个固定行使价上的 IV 不动;sticky-delta / sticky-moneyness——现货动,每个 moneyness 上的 IV 不动,整张微笑跟着现货平移。Heston 这类现货齐次的随机 vol 模型,基线行为是 sticky-moneyness:模型里只有 有意义,微笑天然跟着现货走。局部 vol 恰好相反,微笑对现货的响应偏 sticky-strike 甚至反向移动。市场本身介于两者之间,而且随 regime 切换——趋势市里更像 sticky-strike,恐慌重定价时更像 sticky-delta。用哪个模型对冲,delta 会差出一个”微笑修正项”,这是两类模型对冲比率分歧的直接来源。带随机利率的扩展(如 Heston–Hull-White)能再改善长期限的动态,但基本格局不变。
一个容易踩的推论:反推局部 vol
有一个常见操作:把校准好的参数曲面(Heston 或任何参数形式)当作输入,用 Dupire 公式反推局部 vol,喂给蒙特卡洛。这里有个区别值得分清:Heston 模型自身生成的曲面按构造无套利,反推的 理论上非负;但实际流程里你反推的往往不是模型曲面,而是插值、外推过的市场拟合曲面——插值方案不带无套利约束时, 就会在网格角落里冒出来。校准后检查负性应当是流水线的固定一站。查出来之后的选择依用途而定:换更灵活的参数形式重拟合、把局部 vol 在阈值处截断、换 Bates 这类本来就更能容纳陡微笑的模型;或者——如果你只定价欧式——直接信 Heston 的特征函数,它对这类插值伪影天然免疫。
为什么它 25 年还活着
替代品一直在出:SABR、局部-随机 vol 混合、Bergomi、粗糙 vol。Heston 仍然是多数台的默认校准,理由务实。半解析定价快,比蒙特卡洛和有限差分快出数量级,校准循环里这是决定性的。五个参数大多数时候条件尚可,工具链成熟。对短期香草的对冲账簿,它的表现不输许多”更好”的模型。还有一层教学价值:初级量化通过 Heston 学会仿射框架,之后迁移到别的模型是增量学习。下一代系统可能跑在粗糙 Bergomi 或代理模型上,但 Heston 会在遗留代码里活几十年。
现代衍生品台的常态也不是”选一个模型”,而是并行跑一组:Heston 管香草的速度,Bates(Heston 加跳跃)管带偏斜的奇异,SABR 管利率波动率曲面,局部 vol 做确定性拟合喂蒙特卡洛,Bergomi 或粗糙 vol 管波动率风险的动态。每个模型守一段战线,组合起来覆盖产品线——单模型的时代早就过去了。
接下来两篇分别处理 Heston 留下的两个尾巴:跳跃扩散(修短期左尾),以及波动率曲面构造(给微笑一套无套利的拟合基础设施)。
阅读清单。 Hull, Options, Futures, and Other Derivatives, 第 10 版(2018)。Wilmott, Paul Wilmott on Quantitative Finance, 第 2 版(2007)关于一般随机波动率。Heston, “A Closed-Form Solution for Options with Stochastic Volatility,” Review of Financial Studies (1993)——原文可读性很好。Gatheral, The Volatility Surface (2006)关于微笑动态。Andersen, “Simple and Efficient Simulation of the Heston Model” (2008)关于方差仿真方案。Carr & Madan (1999) 与 Fang & Oosterlee (2008) 关于变换方法;Lord & Kahl (2010) 关于复对数的分支处理。