跳到正文

Heston 模型:从二状态 SDE 到半解析定价

给波动率一个自己的随机源之后,可解性靠什么保住:Heston 的仿射结构、特征函数的完整推导、傅里叶反演的数值细节,以及五参数校准的病态之处。

第 11 篇 · 共 12 篇 约 12 分钟

上一篇局部 vol 的三个缺陷——前向微笑太平、现货-波动率相关钉死在 −1-1、没有独立的波动率风险——其实是同一句话:模型里缺第二个随机源。补上它很容易,难的是补上之后还能算。随便给 σ\sigma 加一个随机过程,得到的二维模型多半只能靠蒙特卡洛硬跑。Steven Heston 在 1993 年找到的组合拳是:让方差走一个均值回归的平方根过程,于是模型落在仿射类里,特征函数有闭式,欧式期权定价归结为一个一维积分。可解性不是运气,是结构;本文就沿着这条结构线走一遍:模型怎么搭、闭式怎么推、数值怎么算、校准哪里病态、以及它自己又错在哪。

设置

SDE 系统:

dSt=rSt dt+vt St dWtSdS_t = r S_t \, dt + \sqrt{v_t} \, S_t \, dW^S_t dvt=κ(θ−vt) dt+σvt dWtvdv_t = \kappa(\theta - v_t) \, dt + \sigma \sqrt{v_t} \, dW^v_t

带 Corr(dWS,dWv)=ρ\text{Corr}(dW^S, dW^v) = \rho。五个参数各管一件事:κ\kappa 是方差的均值回归速度(单位 1/time1/\text{time}),θ\theta 是方差回归的长期水平,σ\sigma 是 vol of vol——为了不和 BS 的 σ\sigma 混淆,文献里也常写作 ξ\xi 或 η\eta(它是模型参数,别和二阶希腊字母 volga 搞混),ρ\rho 是股票与方差创新的相关,v0v_0 是初始方差。

方差方程的漂移是 Ornstein-Uhlenbeck 式的拉回,但作用在 vv 上而非过程本身;扩散项的 vt\sqrt{v_t} 让波动在 vv 接近零时自动收小,在 Feller 条件 2κθ>σ22\kappa\theta > \sigma^2 下过程保持严格为正。整个模型通常直接在风险中性测度 Q\mathbb{Q} 下陈述;方差风险的市场价格只有在你要回到物理测度 P\mathbb{P} 做情景分析时才需要显式引入,定价时可以不管。

ρ\rho 这个参数值得单独说。股票指数市场上 ρ<0\rho < 0:指数跌,方差涨。这是杠杆效应——经济机制至今有争论(行为解释、“价格跌则财务杠杆升”的制度解释都有拥趸),但经验事实本身很牢固,它正是负偏斜微笑的动力学来源。外汇市场则不同,主要货币对的收益大体对称、微笑也对称,同一个 Heston 带 ρ≈0\rho \approx 0 就能描述得不错。可以说负相关是 Heston 区别于纯对数正态混合模型、真正”挣到”股票偏斜的地方。

定价思路:特征函数

模型有了,怎么定价?Heston 的路线不走 PDE 数值解,而是绕道频域。定义 ln⁡ST\ln S_T 在风险中性测度下的特征函数:

ϕ(u,t)=EQ[eiuln⁡ST]\phi(u, t) = \mathbb{E}^{\mathbb{Q}}\left[e^{iu \ln S_T}\right]

其中 tt 是到期时间,所以 ϕ(u,0)=1\phi(u, 0) = 1。特征函数就是分布的全部信息;只要 ϕ\phi 有闭式,任何欧式收益的价格都能用一个傅里叶型积分反演出来。对看涨,一个方便的形式(Lewis 型,沿 Im(u)=−1/2\text{Im}(u) = -1/2 的轮廓)是:

C=S0−K e−rTπ∫0∞Re[e−iuln⁡K ϕ(u−i/2,T)]u2+1/4 duC = S_0 - \frac{\sqrt{K}\, e^{-rT}}{\pi} \int_0^\infty \frac{\text{Re}\left[e^{-iu\ln K}\, \phi(u - i/2, T)\right]}{u^2 + 1/4}\, du

(这里 ϕ\phi 已含 ln⁡S0+rT\ln S_0 + rT 的漂移,ϕ(u−i/2)\phi(u - i/2) 展开后会吐出一个 S0erT\sqrt{S_0 e^{rT}} 因子,和 Ke−rT\sqrt{K} e^{-rT} 合成对称的 S0K e−rT/2\sqrt{S_0 K}\, e^{-rT/2} 前因子——量纲是对的。)被积函数按 u−2u^{-2} 衰减,标准数值积分每个行使价不到一毫秒。

所以全部的难度集中在一处:算出 ϕ\phi 的闭式。这就是仿射结构登场的地方。

ϕ\phi 的 backward PDE

ϕ(u,t)\phi(u, t) 作为条件期望,满足 Kolmogorov backward 方程:

∂ϕ∂t=Lϕ\frac{\partial \phi}{\partial t} = \mathcal{L}\phi

其中 L\mathcal{L} 是联合 (S,v)(S, v) 过程的无穷小生成元,在风险中性测度下:

L=rS∂∂S+12vS2∂2∂S2+κ(θ−v)∂∂v+12σ2v∂2∂v2+ρσvS∂2∂S∂v\mathcal{L} = r S \frac{\partial}{\partial S} + \frac{1}{2} v S^2 \frac{\partial^2}{\partial S^2} + \kappa(\theta - v)\frac{\partial}{\partial v} + \frac{1}{2}\sigma^2 v \frac{\partial^2}{\partial v^2} + \rho \sigma v S \frac{\partial^2}{\partial S \partial v}

这是一个二维 PDE,直接解并不比蒙特卡洛便宜。关键一步是猜对解的形状——试仿射 ansatz ϕ=exp⁡(iuln⁡S+A(u,t)+B(u,t)v)\phi = \exp(iu\ln S + A(u, t) + B(u, t) v):状态变量 ln⁡S\ln S 和 vv 只以线性组合出现在指数上。之所以敢这么猜,是因为生成元的每一项系数都对 vv 线性(注意 S2∂S2S^2\partial^2_S 作用在 eiuln⁡Se^{iu\ln S} 上只产生 vv 的一次项)——这正是”仿射模型”的定义性特征,Heston 的可解性全部来自这里。

代入之后,PDE 按 vv 的幂次分拆成两条 ODE。vv 的一次项给出 BB 的方程:

dBdt=−12(u2+iu)−(κ−iρσu)B+12σ2B2\frac{dB}{dt} = -\frac{1}{2}(u^2 + iu) - (\kappa - i\rho\sigma u) B + \frac{1}{2}\sigma^2 B^2

这是 Heston Riccati 方程。三项各有出处:−12(u2+iu)-\frac{1}{2}(u^2 + iu) 来自对数价格的扩散与 Itô 漂移修正,(κ−iρσu)B(\kappa - i\rho\sigma u)B 打包了方差的均值回归和杠杆效应(相关 ρ\rho 在这里进入),12σ2B2\frac{1}{2}\sigma^2 B^2 是 vol-of-vol 的贡献。常数项给出 AA 的方程:

dAdt=κθB+riu\frac{dA}{dt} = \kappa\theta B + riu

BB 是标准 Riccati,AA 只是对 BB 积分。初值条件在 t=0t = 0(到期时刻):A(u,0)=0A(u, 0) = 0、B(u,0)=0B(u, 0) = 0,沿到期时间 tt 正向积分即可。

闭式解

Riccati 方程可以显式解。定义判别式:

d=(ρσiu−κ)2+σ2(iu+u2)d = \sqrt{(\rho\sigma iu - \kappa)^2 + \sigma^2(iu + u^2)}

和比率:

g=κ−ρσiu−dκ−ρσiu+dg = \frac{\kappa - \rho\sigma iu - d}{\kappa - \rho\sigma iu + d}

在相关的定义域上 ∣g∣<1|g| < 1。BB 的解(取 −d-d 的数值稳定形式):

B(u,t)=κ−ρσiu−dσ2⋅1−e−dt1−ge−dtB(u, t) = \frac{\kappa - \rho\sigma iu - d}{\sigma^2} \cdot \frac{1 - e^{-dt}}{1 - g e^{-dt}}

Heston 原始论文写的是代数上等价的另一形式,用 g~=1/g\tilde{g} = 1/g 和增长指数:

B(u,t)=κ−ρσiu+dσ2⋅1−edt1−g~ edtB(u, t) = \frac{\kappa - \rho\sigma iu + d}{\sigma^2} \cdot \frac{1 - e^{dt}}{1 - \tilde{g}\, e^{dt}}

两式在纸面上相等,在浮点数里不等价:edte^{dt} 随期限指数增长,配合复对数取分支会在长期限上产生跳变——这是 Heston 实现里最著名的坑,修法就是统一用 −d-d 形式(Lord & Kahl, 2010 对复对数分支问题有完整处理)。AA 的解(同一约定下):

A(u,t)=riu t+κθσ2[(κ−ρσiu−d)t−2log⁡(1−ge−dt1−g)]A(u, t) = riu\, t + \frac{\kappa\theta}{\sigma^2}\left[(\kappa - \rho\sigma iu - d)t - 2\log\left(\frac{1 - ge^{-dt}}{1 - g}\right)\right]

合起来:

ϕ(u,t)=exp⁡(A(u,t)+B(u,t)v0+iuln⁡S0)\phi(u, t) = \exp\left(A(u, t) + B(u, t) v_0 + iu \ln S_0\right)

这就是 Heston 特征函数。看涨定价在带 Im(u)∈[−1,0]\text{Im}(u) \in [-1, 0] 内有效;看跌用平价关系或移轮廓。

数值反演与代码

除了上面的 Lewis 形式,Heston (1993) 原文用的是概率分解表示:

C=S0P1−Ke−rTP2,Pj=12+1π∫0∞Re[e−iuln⁡K ϕj(u,T)iu]duC = S_0 P_1 - K e^{-rT} P_2, \qquad P_j = \frac{1}{2} + \frac{1}{\pi}\int_0^\infty \text{Re}\left[\frac{e^{-iu\ln K}\,\phi_j(u, T)}{iu}\right] du

其中 P2P_2 是风险中性行权概率(ϕ2\phi_2 即上面的 ϕ\phi),P1P_1 是以股票计价的行权概率(ϕ1(u)=ϕ(u−i)/ϕ(−i)\phi_1(u) = \phi(u - i)/\phi(-i))。不同作者的写法差在轮廓和归一化上,内容等价。被积函数按 u−2u^{-2} 衰减,几百个积分点就有 6 位精度;截断到 u≤200u \leq 200 通常绰绰有余。

可运行的实现(稳定 −d-d 形式,已对 σ→0\sigma \to 0 极限与 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),下文会讲。

校准

拿到定价函数,下一步是从市场反推参数:在 (v0,κ,θ,σ,ρ)(v_0, \kappa, \theta, \sigma, \rho) 上做优化拟合市场 IV。五个参数对几百个报价,听起来超定得很安全,实际上病态得很有特点。流程是标准的:选一个校准集(比如逐周到期、每个到期 5 个行使价),定义损失 RMSE=1N∑i(σmkti−σHestoni)2\text{RMSE} = \sqrt{\frac{1}{N}\sum_i (\sigma_{\text{mkt}}^i - \sigma_{\text{Heston}}^i)^2},然后用 Levenberg-Marquardt 做局部优化或差分进化做全局搜索。

病在哪?第一,可识别性。不同的参数组合能长出几乎相同的曲面:ATM 水平主要由 θ\theta 和 v0v_0 定,偏斜主要由 ρ\rho 定,两翼陡度由 σ\sigma 和 ρ\rho 的乘积定——最优点附近参数高度共线。第二,多个局部极小,不带全局搜索容易停在错的盆里。第三,κ\kappa 是五个参数里识别最弱的:数据钉不死它,股票上的合理范围大约在 0.50.5 到 55 之间,对短期期权几乎不敏感——这也正是上一节 v0=θv_0 = \theta 时 κ\kappa 从期望方差里完全消失那个现象的校准侧写照。

一个典型的 SPX 校准从 κ=2,θ=0.04,σ=0.3,ρ=−0.7,v0=0.04\kappa=2, \theta=0.04, \sigma=0.3, \rho=-0.7, v_0=0.04 起步。优化收敛后,残差通常集中在深度虚值看跌上——那正是模型灵活性最差的地方:连续路径的扩散给不出足够肥的短期左尾,要修这个得加跳跃(Merton, 1976),这是下一篇文章的主题。

Heston 自己错在哪

局部 vol 的病 Heston 治了一半,自己也留了三个,按严重程度排。

第一,偏斜动态。ρ\rho 是常数,所以模型里偏斜陡度和波动率水平的关系被焊死了。经验上,低波动时期偏斜(以适当口径衡量)往往更平、高波动时期更陡,而且两者的联动本身在变。常数 ρ\rho 表达不了这个。

第二,前向微笑。Heston 的前向微笑比局部 vol 的更接近现实(它不会无限变平),但校准到今天香草曲面的参数,给出的远期起始期权价格仍然对不上这类产品的市场报价——前向微笑动态仍然太”温顺”。

第三,vol-of-vol 自己也在动。参数 σ\sigma 是常数,而现实里波动率的波动率在平静期低、压力期飙升。这层动态 Heston 完全没有,粗糙波动率和多因子 Bergomi 类模型要修的就是它。

香草之外:仿真

欧式期权走特征函数;路径依赖产品——亚式、障碍、回望——就得回到路径本身,要么在 (S,v)(S, v) 上解二维 PDE(低维收益可行但慢),要么蒙特卡洛。仿真 Heston 的第一课是:朴素 Euler-Maruyama 会死。平方根扩散离散化后,vv 会采出负值,v\sqrt{v} 直接 NaN。生产级方案都绕着这个设计:Andersen (2008) 的 Quadratic-Exponential (QE) 方案按 vv 的大小分支——vv 大时用矩匹配的二次(高斯平方)近似,vv 小时切换到矩匹配的指数分布,天然非负;同文还给出带鞅修正的变体,把离散化引入的远期偏差压掉。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 等库有现成版本。分支常数、对数价格步的 K0…K4K_0 \ldots K_4 系数,都在 Andersen 原文里列得清清楚楚。

反演的工程学:阻尼与 COS

直接对着定价积分堆积分点之外,有两件工程武器值得知道。

第一是阻尼。看涨收益本身不可积(随 STS_T 线性增长),Carr 和 Madan (1999) 的处理是给价格乘上 eαke^{\alpha k}(k=ln⁡Kk = \ln K)再做傅里叶变换,得到的变换有闭式:

ψ(u)=e−rT ϕ(u−(α+1)i,  T)α2+α−u2+i(2α+1)u\psi(u) = \frac{e^{-rT}\,\phi\big(u - (\alpha + 1)i,\; T\big)}{\alpha^2 + \alpha - u^2 + i(2\alpha + 1)u}

对 ψ\psi 做逆变换、再除掉 eαke^{\alpha k} 就是价格。α\alpha 的选取影响被积函数的衰减和振荡,选得好积分区间可以收得很短;选得差(尤其长期限、极端行使价)会撞上复对数分支和数值下溢——这也是为什么特征函数要用 −d-d 稳定形式的又一个理由。

第二是 COS 方法(Fang & Oosterlee, 2008):在截断区间 [a,b][a, b] 上把密度按余弦基展开,价格变成一个快速收敛的级数:

V(S0,K,T)=e−rT∑n=0N−1′  Re[ϕ ⁣(nπb−a)einπx−ab−a]Vn,x=ln⁡(S0/K)V(S_0, K, T) = e^{-rT} \sum_{n=0}^{N-1}{}' \; \text{Re}\left[\phi\!\left(\frac{n\pi}{b-a}\right) e^{i n\pi \frac{x - a}{b - a}}\right] V_n, \qquad x = \ln(S_0 / K)

其中 VnV_n 是收益函数的余弦系数(香草收益有闭式),撇号表示首项减半。特征函数的求值和行使价无关,算一次就能喂给整条链;系数结构还能用 FFT 批量化。典型设置 N=1024N = 1024 到 4 位精度、N=4096N = 4096 到 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:模型里只有 S/KS/K 有意义,微笑天然跟着现货走。局部 vol 恰好相反,微笑对现货的响应偏 sticky-strike 甚至反向移动。市场本身介于两者之间,而且随 regime 切换——趋势市里更像 sticky-strike,恐慌重定价时更像 sticky-delta。用哪个模型对冲,delta 会差出一个”微笑修正项”,这是两类模型对冲比率分歧的直接来源。带随机利率的扩展(如 Heston–Hull-White)能再改善长期限的动态,但基本格局不变。

一个容易踩的推论:反推局部 vol

有一个常见操作:把校准好的参数曲面(Heston 或任何参数形式)当作输入,用 Dupire 公式反推局部 vol,喂给蒙特卡洛。这里有个区别值得分清:Heston 模型自身生成的曲面按构造无套利,反推的 σloc2\sigma^2_{\text{loc}} 理论上非负;但实际流程里你反推的往往不是模型曲面,而是插值、外推过的市场拟合曲面——插值方案不带无套利约束时,σloc2<0\sigma^2_{\text{loc}} < 0 就会在网格角落里冒出来。校准后检查负性应当是流水线的固定一站。查出来之后的选择依用途而定:换更灵活的参数形式重拟合、把局部 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) 关于复对数的分支处理。