Vasicek 和 CIR:仿射期限结构模型
两个单因子短期利率模型的完整推导:债券价格为什么是指数仿射的,Feller 条件在管什么,以及校准时会踩到的两个坑。
接受了利率是随机的之后,真正的问题不是”利率服从哪个 SDE”,而是”服从哪个 SDE 之后,债券价格还算得出来”。这两件事不是一回事。你可以给短期利率写任意复杂的动态,代价是贴现因子只能靠蒙特卡洛去逼近;而 Vasicek (1977) 和 Cox-Ingersoll-Ross (1985) 之所以在四十多年后还在教科书第三章,是因为它们两头都占:动态足够像利率,价格还能写成闭式。
这篇文章把两个模型从头推一遍,给出债券定价公式,并说明什么时候该用哪个。贯穿全文的是同一条结构性事实——债券价格是短期利率的指数仿射函数。Vasicek 允许负利率、CIR 不允许,这个差别很显眼;但让两个模型都能算的,是那条不显眼的仿射性质。
先把要算的东西写清楚
到期日 的零息债券在时刻 支付 1。它在时刻 的价格是
这就是贴现因子,时刻 收到的 1 美元的现值。映射 是时刻 的利率期限结构,收益率曲线则是 。
注意期望里面是 ,不是 。所以要给债券定价,你需要的不是短期利率某一时刻的分布,而是它在整段区间上的积分的分布。这个区别决定了哪些模型好算: 边际分布漂亮不够,得是”积分之后还漂亮”。Vasicek 和 CIR 就是这样的两个情形。
Vasicek:把 OU 过程直接当利率
Vasicek 假设短期利率服从 Ornstein-Uhlenbeck 过程:
其中 。上一篇推过, 是高斯的,均值和方差都显式:
关键一步在积分上。 是高斯过程的线性泛函,因此它本身也是高斯的:
其中 和 是 、、、、 的显式函数。剩下的只是对数正态的期望: 时 。把 代进去,
整个推导没有用到任何金融,只用了”高斯过程的线性泛函还是高斯”这一条。这也是为什么 Vasicek 的债券价格是所有短期利率模型里最容易推的。
Vasicek 债券价格公式
把积分算出来,定义
价格就写成
其中
是债券对短期利率的久期式敏感度: 越长它越大,但被 封顶,因为均值回归会把远期的利率拉回 ,长端债券对当前利率的敏感度不会无限增长。 则是对利率积分漂移的调整,里面那个 项是 Jensen 效应:波动本身会压低贴现因子的期望,也就是抬高债券价格。
顺带把下面这个式子记下来,它长得很像上面的 ,但不属于 Vasicek:
它把今天的贴现曲线 和今天的瞬时远期利率 直接塞进了 里,从而强迫模型精确穿过当前市场曲线。这是 Hull-White 的做法,下一篇讲。Vasicek 本身做不到这件事:它的 完全由三个常数 决定,能不能拟合今天的曲线要看运气。
Vasicek 有两条性质值得单独拎出来。第一条是 对 是仿射的——线性加常数,这是整个仿射期限结构模型类的定义性质,下一节展开。第二条是负利率: 高斯,OU 的平稳分布也是高斯, 有正概率为负。这条在 1977 年被视为模型的缺陷,2014 年之后反而成了它在欧元和日元曲线上还能用的理由。
仿射结构:一般图景
Vasicek 属于一类更大的仿射期限结构模型,其中状态向量 的漂移和扩散(的平方)都是状态的仿射函数:
对这一整类模型,
对某组显式的 和 成立(这里的 已经是对数形式,与上一节的 差一个 )。债券价格是状态的指数仿射函数。
这是个深刻的结构性结果,因为它把一个函数空间上的问题降维成了一个常微分方程组的问题:如果 SDE 系数对状态仿射,债券定价 PDE 就退化成 和 满足的 Riccati ODE 方程组,单因子情形能闭式解出,多因子情形几十行数值积分就能解。你不需要在每个 上重新做一次期望。
这类模型包括 Vasicek、CIR、Hull-White,以及高斯 HJM 作为特例。多因子扩展(Cox-Ingersoll-Ross 1985b、Chen and Scott 1993、Dai and Singleton 2000)基本上就是现代期限结构文献的全部版图。
CIR:用平方根扩散换掉负利率
Cox、Ingersoll、Ross (1985) 只改了一处——让波动率正比于 :
这一处改动带来三个后果,第一个是当初的动机,另外两个是附赠的。
利率不再为负:平方根扩散在 接近零时自己消失,只要 Feller 条件 成立, 严格为正。同时模型自动带上了异方差——利率水平高的时候波动率也高,这与经验观察一致,而 Vasicek 的 是常数,在利率从 1% 走到 5% 的过程中给出同样的波动。代价在转移密度上: 不再是高斯,而是缩放的非中心卡方,密度里带 Bessel 函数。债券价格仍然是闭式的、仍然是指数仿射的,只是 和 的表达式更绕。
因为这套性质,CIR 后来在信用建模里比在利率建模里用得还多:违约强度天然非负、天然异方差,CIR 过程几乎是为它量身定做的。
Feller 条件在管什么
要让 CIR 过程严格保持正,需要 。直觉是一场竞赛: 接近零时,朝向 的漂移大约是 ,而扩散是 ,随 一起趋于零。漂移以固定速度往上推,扩散以 的速度衰减——条件成立时漂移赢,零成为不可达边界,过程可以任意接近零但不能穿过。
如果 Feller 条件失败,过程能碰到零。碰到之后扩散消失(),漂移仍然是正的 ,于是过程被弹回正的区域。边界是只进不出:能进去,出不来的方向只有一个。实际中你会看到利率短暂下探到接近零然后反弹,而不是卡在零上不动。
代入数字看一下距离有多远。对美元利率的典型校准,,,,于是 ,——差两个数量级,Feller 舒服地成立。对一些新兴市场校准,波动率大得多而均值回归慢,Feller 可能失败,你会看到利率触及零。
CIR 的转移密度和债券价格
CIR 过程 给定 的条件分布是
其中 , 是自由度 、非中心参数 的非中心卡方。均值和方差是
均值与 Vasicek 完全相同——两个模型的漂移项本来就一样,改的只是扩散。方差则暴露了差别:一项正比于 (异方差部分,当前利率越高、短期不确定性越大),一项正比于 (渐近部分, 很大时剩下的就是它)。Vasicek 的方差里没有第一项。
债券价格仍是指数仿射:
其中
涉及 、、、、 的更复杂公式,写出来占半页,见原 CIR 论文或 Brigo and Mercurio 第 3 章。结构和 Vasicek 一致:对 仿射,只是对 的依赖更绕。
是理解这个公式的钥匙:它是同时考虑漂移和波动率之后的有效均值回归速率。 时 , 退化回 Vasicek 的形式; 变大时 ,等效回归更快。 的分母恒为正,所以 ,久期式敏感度的符号不会翻。
一个算例:两个模型并排
对 Vasicek 下的 5 年期零息债券定价,取 ,,,当前短期利率 。
先算 :
再算 (把上面 的表达式里的 除进括号):
所以 ,债券价格
收益率 ,即 4.42%。落在当前短期利率(4%)和长期均值(5%)之间,正是向上倾斜且带均值回归的曲线该有的样子:五年不够让利率完全回归到 ,所以收益率停在中间偏低的位置。
同样参数换 CIR。先算 ,再算
在两个模型下几乎一样,这不是巧合: 时 相对 可以忽略, 只比 大 0.4%。差别全在 上,它对 和 的依赖方式不同。所以对足够小的 ,两个模型给出相似的价格——你在这个参数区间里为了正利率付出的代价几乎是零。 变大之后 CIR 会产生更陡峭的期限结构,平方根波动率项开始说话。
校准
实际中你把 Vasicek 或 CIR 校准到当前期限结构。需要的输入是今日的贴现曲线 (一组到期日 )、今日的瞬时短期利率 (通常从最短到期日的利率反推),以及可选的掉期期权波动率曲面。Vasicek 有三个参数 ,有三个或更多债券价格就能拟合;CIR 参数个数相同,只是函数形式不同。
做法本身很朴素:用解析债券价格公式算出 ,然后在 上极小化 。这是个非线性最小二乘问题,求解器例程就能处理。
import numpy as np
from scipy.optimize import minimize
def vasicek_bond_price(r0, kappa, theta, sigma, T):
B = (1 - np.exp(-kappa * T)) / kappa
A = np.exp((B - T) * (kappa**2 * theta - 0.5 * sigma**2) / kappa**2
- sigma**2 * B**2 / (4 * kappa))
return A * np.exp(-B * r0)
def calibrate_vasicek(maturities, market_prices, r0):
def objective(params):
kappa, theta, sigma = params
if kappa <= 0 or sigma <= 0:
return 1e10
model_prices = np.array([vasicek_bond_price(r0, kappa, theta, sigma, T) for T in maturities])
return np.sum((model_prices - market_prices)**2)
x0 = [0.5, 0.05, 0.02]
bounds = [(1e-4, 5), (1e-4, 0.5), (1e-4, 0.5)]
result = minimize(objective, x0, bounds=bounds, method='L-BFGS-B')
return result.x
这段能跑,目标是债券价格的平方误差和,边界强制正性。真实世界的校准会按久期或价格敏感度加权来稳定拟合,因为长端债券的价格误差在绝对值上天然更大。
这里有两个坑,都不会报错,只会给你一组看上去合理的参数。
第一个是自由度。三个参数拟合三个点必然完美,但那不是拟合好,那是恒等式——你没有任何过拟合检验。用更多到期日,并加正则项惩罚极端参数值。
第二个更隐蔽:校准出来的 经常是负的(Vasicek)或贴近零(CIR)。原因是你在强迫一个”利率会回归到 “的模型去拟合一条离长期均值很远的曲线。当前短期利率 5%,为了拟合倒挂的曲线,优化器把 压到 1%,于是模型内部是不自洽的:模型说利率将回归到 1%,而市场并没有在给这件事定价,优化器只是找到了一组能复现今天价格的数字。修法有两条——在 下用物理长期均值作为 ,再单独调整风险中性漂移;或者干脆换成时变参数化(Hull-White),让曲线在任何时刻可以是任何形状。下一篇讲后者。
顺带一提:你校准的是哪个测度
上面所有 SDE 都写在风险中性测度 下。在物理测度 下, 的漂移带一个风险溢价 :
度量投资者为承担利率风险所要求的额外漂移。经验估计通常是正的(持有久期有风险),但噪声很大。 下这个溢价被吸收进 :风险中性 是 下的长期均值,与物理长期均值差一个正比于 的项。
对衍生品定价只需要风险中性动态,物理动态才是预测利率、资产负债建模、风险管理要用的东西。所以当你看到”利率的长期均值是 4%“,先问一句:在哪个测度下?上一节那个” 校准成负数”的坑,本质上就是把 下的拟合参数当成了 下的经济预测。
何时用哪个,以及什么时候两个都不够
Vasicek 的优势就是简单。它的转移密度是高斯,模拟一行代码,债券价格一个 exp,适合做快速估算和近似——你需要在几万条路径上算贴现因子的时候,这个差别是实打实的。它允许负利率这件事,取决于你在哪个市场:对日元、欧元、瑞郎这些明确出现过负利率的曲线,这不是缺陷而是必要条件;对短期利率有零下界约束的建模场景,它会给出一部分你不想要的路径。
CIR 换来正性和异方差,代价是复杂度。你需要非负利率的时候用它,观察到波动率随利率水平上升的时候用它,建模信用利差或违约强度的时候几乎只能用它——平方根过程在那个领域是标准做法。但它买回来的正性有前提,就是上面那个 Feller 条件;如果你的校准结果让 逼近 ,你实际上得到的是一个会贴着零走的过程,而不是一个正利率模型。
更值得说清楚的是两个模型共同的天花板:它们都只有一个因子,也就是一个随机源。这在三件事上会明确失败。
收益率曲线会扭转。单个短期利率驱动的曲线,所有到期日的变动完全同向,产生不了真实曲线里那种短端上行、长端下行的形态。经验上你至少需要两到三个因子才能捕捉不同到期日债券价格的联合分布——通常被解释为水平、斜率、曲率。
跨到期日的相关性太高。同样的原因:单因子模型预测的债券收益相关性接近 1,实际数据低得多。
隐含波动率是平的。Cap 和 floor 价格隐含出跨行权价的波动率微笑或偏斜,单因子模型给不出来。给利率期权定价需要利率的随机波动率,那要求多因子。
多因子扩展就是冲着这些去的。Cox-Ingersoll-Ross 1985b 用多个相关的平方根过程;Chen and Scott (1993) 和 Longstaff and Schwartz (1992) 给出双因子模型;Dai and Singleton (2000) 提供了仿射期限结构模型的典范分类。最常用的那个反而最简单:Hull-White 保持 Vasicek 的结构不变,只让参数随时间变化,就解决了拟合初始曲线的问题。下一篇讲它。
至于该怎么选,可以粗略这样记:快速估债券价格用 Vasicek;要正利率的精确拟合用 CIR;要给带微笑的利率衍生品定价,往 Hull-White 或多因子仿射模型走;奇异或路径依赖的合约,用校准好的参数直接模拟 CIR 或 Vasicek;深度虚值期权和压力情景下,先承认单因子的局限再加扩展,而不是把参数硬拧到能拟合为止。
仿射性质到底买到了什么
前面反复提到”指数仿射”。值得把它带来的东西一次性讲完,因为这条性质比 Vasicek 和 CIR 各自的细节都重要。
最直接的是闭式债券价格:单因子模型有解析公式,多因子模型有 Riccati ODE,可以解析或数值求解。往上一层是闭式期权价格——cap、floor、swaption 的收益依赖短期利率的积分,而仿射模型下这些积分的分布已知闭式,于是能得到 Black 风格的 cap/floor 定价公式。
再往上是估计。仿射模型可以写成线性状态空间形式,这直接把它们接到了 Kalman 滤波和高斯-线性状态空间估计上,构成了相当一部分期限结构实证方法的基础。无套利约束在这个框架里也变得容易检查:漂移和扩散系数要满足一定条件模型才无套利,而对仿射模型这些条件化简成了系数上的线性代数约束,而不是需要逐一验证的泛函条件。
最后是和宏观经济学的接口。状态变量可以解释为产出、通胀或其他宏观因子,而仿射结构恰好会从对数线性化的宏观模型里自然出现——这不是巧合式的形式相似,而是宏观-金融文献(比如 Ang and Piazzesi 2003)能成立的原因。
把这几条放一起看,仿射框架大概是期限结构建模里最重要的单个结构性结果。我们能用闭式或近闭式算出债券价格、期权价格和风险度量,都是因为它。
同一个 SDE,换个状态变量
CIR 过程还有一个不在利率里的用处。Heston (1993) 的股票期权随机波动率模型用的是
其中 是股票的瞬时方差。这就是 CIR,把 换成了 。相同的 Feller 条件保证 为正,相同的非中心卡方转移密度。
Heston 的贡献是认识到:对 的这个 SDE,股票期权价格通过 Fourier 变换是闭式的。对数价格的特征函数已知,期权价格是它在 处的逆 Fourier 变换。公式里有两个复特征函数,对应上行和下行的积分轮廓,积分数值计算。结果是实践中最广泛使用的股票期权定价公式之一。
所以平方根扩散最初是为利率提出的,最后成了随机波动率的自然模型。同样的 SDE,不同的状态变量。这里可以提取一条一般原则:为一类资产建的 SDE 工具箱,跨资产类别是可复用的——你在利率上写的非中心卡方模拟器,在股票波动率上一行不改就能用。
一段历史注记
Vasicek 模型 1977 年发表,是期限结构的第一个连续时间随机模型。它之所以是分水岭,是因为它在随机利率设定下给出了闭式债券价格。在此之前,期限结构建模主要是曲线拟合(样条一类)或者临时设定的预期假设形式,没有一个内部一致的随机动态。
CIR 出现在 1985 年,加上了无负利率性质,这在当时经验上很重要。之后期限结构文献开始膨胀:Cox-Ingersoll-Ross 1985b 引入多因子扩展,Chen and Scott (1993) 和 Longstaff and Schwartz (1992) 引入双因子模型,Dai and Singleton (2000) 提供典范分类。Hull and White (1990, 1993) 把 Vasicek 扩展到时变参数,这才让模型能在某个时点精确拟合观测到的期限结构——也就是本文中段那个”不属于 Vasicek 的 “公式的出处。
如果这篇只留一句话:债券价格对短期利率是指数仿射的。期权定价、校准、模拟,其他一切都从这里衍生。
参考文献
- Vasicek, O. (1977). Journal of Financial Economics.
- Cox, J., Ingersoll, J., Ross, S. (1985). Econometrica. 这篇是金融领域被引最多的论文之一,配得上。
- Brigo, D. and Mercurio, F. (2006). Interest Rate Models: Theory and Practice. 第 1-3 章,CIR 的 完整表达式在第 3 章。
- Hull, J. Options, Futures, and Other Derivatives. 利率衍生品那几章覆盖均衡短期利率模型,包括 CIR。
- Luenberger, D. (1998). Investment Science. 第 11 章。ISBN:978-0-19-510809-5。
- Ang, A. and Piazzesi, M. (2003). 仿射模型的宏观-金融方向。
- Dai, Q. and Singleton, K. (2000). 仿射期限结构模型的典范分类。