4. 简约化模型定价:强度模型、泊松过程、Cox 过程与违约强度估计
各位同学,欢迎来到第四章。前面我们聊了结构化模型,用公司资产和负债来刻画违约。说实话,那个思路很直观,但用起来有点「重」——你得知道公司资产的市场价值,还得假设它服从某种随机过程。现实中,很多交易员和风控人员更喜欢另一种思路:简约化模型。
简约化模型的核心思想很简单——违约是一个随机事件,就像车祸一样,你不知道它什么时候发生,但你知道它发生的概率有多大。我们不去深究公司为什么会违约,而是直接对违约时间建模。我个人习惯把这种思路叫做「黑箱法」——我不关心箱子里有什么,我只关心箱子什么时候坏。
核心概念:简约化模型将违约视为一个外生的随机事件,其发生由「违约强度」驱动。强度越高,短期内违约的概率就越大。
4.1 强度模型的基本框架
先问一个问题:如果让你用一个数字来描述一家公司「违约的可能性」,你会用什么?
在简约化模型里,这个数字就是违约强度,记作 λ(t)。它表示在时刻 t 之后的一个无穷小时间段内,违约发生的瞬时概率。数学上可以写成:
P(违约发生在 [t, t+dt) | 到 t 时刻还没违约) = λ(t) dt
嗯,这里要注意:λ(t) 可以随时间变化,也可以随其他风险因子变化。它不是一个常数,而是一个函数。
有了违约强度,我们就可以计算生存概率和违约概率了。假设从今天(t=0)到未来某个时间 T,公司一直没违约的概率是:
P(τ > T) = exp(-∫₀ᵀ λ(s) ds)
这个公式看着眼熟吧?对,就是指数分布的形式。如果 λ 是常数,那生存概率就是 e^{-λT},违约时间服从指数分布。
我在项目中遇到过一个问题:用常数强度去定价 CDS,结果短端和长端的价差对不上。后来发现,市场隐含的违约强度其实是「期限结构」的——短期强度低,长期强度高,因为谁也不知道三年后这家公司会变成什么样。
4.2 泊松过程:违约事件的基本模型
强度模型背后,其实是一个泊松过程。你想想看,违约事件的发生,是不是有点像公交车到站?你不知道下一辆什么时候来,但你知道平均多久来一辆。
标准的齐次泊松过程有两个特点:
- 事件之间的间隔时间服从指数分布(参数 λ)
- 在任意时间区间 [0, t] 内,事件发生的次数服从泊松分布(均值 λt)
把违约事件看成泊松过程的「第一次跳跃」,那违约时间 τ 就是泊松过程的首次到达时间。这个思路非常简洁——你只需要估计一个 λ,就能算出所有期限的违约概率。
但现实哪有这么简单?
注意:齐次泊松过程假设违约强度是常数。这在短期或许可以接受,但长期来看,公司的信用状况会变化,经济周期会波动,违约强度不可能一成不变。
我曾经用常数强度给一家周期性行业的公司做 CDS 定价,结果市场波动一大,模型完全跟不上。后来我学乖了——对于信用风险,强度必须能随时间变化。
4.3 Cox 过程:让强度「活」起来
这就是Cox 过程登场的地方。Cox 过程也叫「双随机泊松过程」,它的核心思想是:违约强度本身也是一个随机过程。
说白了,就是 λ(t) 不再是固定的,而是随着市场状态、宏观经济、公司基本面等因素随机波动。你观察到的违约事件,是在「随机强度」这个背景下发生的。
Cox 过程的数学定义是这样的:
- 给定强度过程 λ(t) 的路径,违约事件是一个非齐次泊松过程
- 但 λ(t) 本身是随机的,所以违约概率需要「对强度路径求期望」
生存概率的公式变成了:
P(τ > T) = E[ exp(-∫₀ᵀ λ(s) ds) ]
注意这个期望符号 E[·]——它表示我们要对所有的强度路径取平均。这就把问题从「估计一个数」变成了「估计一个随机过程」。
我个人习惯用 CIR 过程来建模违约强度:
dλ(t) = κ(θ - λ(t)) dt + σ √λ(t) dW(t)
这个模型的好处是:λ(t) 始终非负,而且有均值回归的特性。经济好的时候强度低,经济差的时候强度高,但长期会回到均值 θ 附近。嗯,很符合直觉。
实战技巧:用 Cox 过程定价 CDS 时,通常需要数值方法(比如蒙特卡洛模拟)来计算生存概率。因为那个期望 E[·] 很少有解析解。我在做交易台支持时,经常用 10 万条路径模拟,配合 antithetic variates 来加速收敛。
4.4 违约强度估计:从市场数据中「反推」
好,模型有了,参数怎么定?
违约强度不是直接能观测到的。我们需要从市场数据中把它「反推」出来。常用的方法有几种:
4.4.1 从 CDS 价差反推
这是最主流的方法。CDS 的价差(spread)直接反映了市场对违约风险的定价。假设 CDS 的保费是 s(每年支付的基点),那么我们可以解出隐含的违约强度 λ:
s ≈ λ × (1 - 回收率)
这个近似公式虽然粗糙,但很直观。比如一家公司的 CDS 价差是 200 bps,回收率假设 40%,那隐含的违约强度就是 200 / (1-0.4) ≈ 333 bps,也就是每年 3.33% 的违约概率。
当然,实际定价中要考虑贴现、保费支付频率、违约日期等细节。我一般用下面的公式做精确计算:
CDS 保费现值 = 违约保护现值
解这个方程就能得到 λ。如果 λ 是常数,那一步就能算出来。如果是时变的,就需要用 bootstrap 方法逐期限求解。
4.4.2 从债券价格反推
如果没有 CDS 市场,也可以用公司债券的价格来反推。债券价格 = 无风险债券价格 × 生存概率 + 回收价值 × 违约概率。解这个方程也能得到隐含的违约强度。
我记得有一次,一家亚洲的航空公司没有 CDS 交易,但发了美元债。我就用它的债券价格反推出了违约强度曲线,然后用这个曲线给它的其他衍生品做信用调整。效果还不错。
4.4.3 历史违约率估计
对于没有市场数据的公司,只能用历史数据。穆迪、标普每年都会发布违约率统计,按评级、行业、地区分类。比如 A 级公司 1 年历史违约率是 0.05%,那我们可以把 λ 设为 0.05%。
但这里有个坑:历史违约率是「真实世界」的概率,而 CDS 价差隐含的是「风险中性」的概率。两者之间差了一个风险溢价。我在做内部风控模型时,通常会在历史违约率上加一个 20%-50% 的溢价,来反映市场对违约风险的厌恶。
避坑指南:千万不要把历史违约率直接当成风险中性违约率来用。我曾经见过一个团队用历史违约率给 CDS 定价,结果模型价格比市场价格低了 30%。原因就是没考虑风险溢价。
4.5 知识体系总览
下面这张图总结了本章的核心逻辑。你可以看到,从最简单的泊松过程,到更灵活的 Cox 过程,再到参数估计方法,整个框架是层层递进的。
4.6 一个简单的定价示例
最后,我们看一个具体的例子。假设我们要给一家公司定价 1 年期 CDS,面值 100 元,回收率 40%。
场景一:常数强度
假设从 CDS 市场反推出 λ = 2%。那么:
- 生存概率 = e^{-0.02} = 0.9802
- 违约概率 = 1 - 0.9802 = 0.0198
- 预期损失 = 0.0198 × 100 × (1-0.4) = 1.188 元
- CDS 价差 ≈ 1.188 / 100 = 1.188% = 118.8 bps
场景二:时变强度(Cox 过程)
假设 λ(t) 服从 CIR 过程,参数 κ=0.3, θ=0.02, σ=0.1, λ(0)=0.01。我们需要用蒙特卡洛模拟:
# Python 伪代码示例
import numpy as np
def simulate_CIR_paths(T, n_paths, n_steps, kappa, theta, sigma, lambda0):
dt = T / n_steps
lambdas = np.zeros((n_paths, n_steps+1))
lambdas[:, 0] = lambda0
for i in range(n_steps):
dW = np.random.normal(0, np.sqrt(dt), n_paths)
lambdas[:, i+1] = (lambdas[:, i]
+ kappa*(theta - lambdas[:, i])*dt
+ sigma*np.sqrt(np.maximum(lambdas[:, i], 0))*dW)
lambdas[:, i+1] = np.maximum(lambdas[:, i+1], 0) # 保证非负
return lambdas
# 计算生存概率
lambdas = simulate_CIR_paths(1, 100000, 252, 0.3, 0.02, 0.1, 0.01)
integral = np.trapz(lambdas, dx=1/252, axis=1)
survival_prob = np.mean(np.exp(-integral))
print(f"模拟生存概率: {survival_prob:.4f}")
你看,Cox 过程比常数强度复杂了不少,但它能捕捉到违约强度的随机波动。我在实际项目中,对于投资级公司(强度低、波动小),用常数强度就够了;但对于高收益债或 distressed 公司,必须用 Cox 过程。
我的建议:刚开始做 CDS 定价时,先用常数强度模型跑一遍,理解基本逻辑。然后再逐步加入时变强度、随机波动等复杂因素。不要一上来就搞最复杂的模型——你可能会迷失在数学细节里,反而忽略了市场直觉。
好了,这一章的内容就到这里。简约化模型的核心就是「用强度说话」——你不需要知道公司为什么会违约,你只需要知道它违约的概率有多大。下一章我们会把这些模型应用到实际的 CDS 定价中,包括期限结构、信用曲线构建等实战内容。
公众号:蓝海资料掘金营,微信deep3321