主题切换
12.4 信用利差与CDS
信用利差的构成
信用利差(Credit Spread)是指具有信用风险的债券收益率与同期限无风险利率之间的差值。这个看似简单的数值背后隐藏着复杂的风险溢价分解:
$$\text{Credit Spread} = \underbrace{\text{Expected Loss}}_{违约概率 \times 违约损失率} + \underbrace{\text{Risk Premium}}_{信用风险溢价} + \underbrace{\text{Liquidity Premium}}_{流动性溢价} + \underbrace{\text{Tax Effects}}_{税收效应}$$
名词解释:信用利差(Credit Spread)
公司债收益率与同期限无风险利率(通常用同期限国债收益率或互换利率)之间的差额。它是衡量市场对信用风险定价的关键指标。
此处有展示代码展开 ▼
python
import numpy as np
def decompose_credit_spread(corp_yield, risk_free_rate, recovery_rate,
liquidity_premium=0, tax_adj=0):
"""
信用利差的分解
corp_yield: 公司债收益率
risk_free_rate: 同期限无风险利率
recovery_rate: 预期回收率(1 - LGD)
liquidity_premium: 流动性溢价估计(bp)
tax_adj: 税收调整(bp)
"""
spread = (corp_yield - risk_free_rate) * 10000 # 转为基点
# 假设风险中性违约概率可以从 CDS 市场或其他来源获得
# 这里用简化方式分解
expected_loss_component = spread - liquidity_premium - tax_adj
# 隐含违约概率(简化:λ ≈ spread / (1 - recovery_rate))
implied_hazard_rate = (expected_loss_component / 10000) / (1 - recovery_rate)
return {
'total_spread_bps': spread,
'liquidity_bps': liquidity_premium,
'tax_bps': tax_adj,
'expected_loss_bps': expected_loss_component,
'implied_hazard_rate': implied_hazard_rate
}
# 示例
result = decompose_credit_spread(
corp_yield=0.055, risk_free_rate=0.035,
recovery_rate=0.40, liquidity_premium=20, tax_adj=5
)
for k, v in result.items():
print(f" {k}: {v:.2f}")点击展开可浏览运行结果
total_spread_bps: 200.00 liquidity_bps: 20.00 tax_bps: 5.00 expected_loss_bps: 175.00 implied_hazard_rate: 0.03
实证发现:历史数据显示,信用利差覆盖的预期违约损失通常只占实际利差的一小部分。大量的利差来自于风险溢价和流动性溢价——这就是为什么实际违约频率远低于利差所隐含的违约概率。这一现象被称为"信用利差之谜(Credit Spread Puzzle)"。
Merton 结构模型
Merton (1974) 模型是信用风险建模的里程碑。它将公司权益视为以公司资产为标的、债务面值为行权价的看涨期权:
$$E = V \cdot \Phi(d_1) - D \cdot e^{-rT} \cdot \Phi(d_2)$$
其中
违约概率为资产价值
$$PD = \Phi\left(-\frac{\ln(V/D) + (\mu - \sigma_V^2/2)T}{\sigma_V\sqrt{T}}\right) = \Phi(-d_2^*)$$
此处有展示代码展开 ▼
python
from scipy.stats import norm
from scipy.optimize import fsolve
def merton_model(E, D, r, T, sigma_E):
"""
Merton 结构模型——从权益市值和波动率反推资产价值和资产波动率
E: 权益市值
D: 债务面值(默认点)
r: 无风险利率
T: 债务期限
sigma_E: 权益波动率
"""
def equations(x):
V, sigma_V = x
d1 = (np.log(V / D) + (r + 0.5 * sigma_V**2) * T) / (sigma_V * np.sqrt(T))
eq1 = V * norm.cdf(d1) - D * np.exp(-r * T) * norm.cdf(d1 - sigma_V * np.sqrt(T)) - E
eq2 = V * norm.cdf(d1) * sigma_V / E - sigma_E
return [eq1, eq2]
V0, sigma_V0 = E + D, sigma_E * E / (E + D)
V, sigma_V = fsolve(equations, [V0, sigma_V0])
# 违约距离 (Distance to Default)
DD = (np.log(V / D) + (r - 0.5 * sigma_V**2) * T) / (sigma_V * np.sqrt(T))
PD = norm.cdf(-DD)
return {
'asset_value': V,
'asset_volatility': sigma_V,
'distance_to_default': DD,
'default_probability': PD,
'credit_spread_implied': -np.log(1 - PD * (1 - 0.4)) / T # 假设40%回收率
}
# 示例
result = merton_model(E=100, D=80, r=0.03, T=1.0, sigma_E=0.35)
print(f"资产价值: {result['asset_value']:.2f}")
print(f"违约距离: {result['distance_to_default']:.2f}")
print(f"违约概率: {result['default_probability']:.4%}")点击展开可浏览运行结果
资产价值: 177.64 违约距离: 4.10 违约概率: 0.0020%
Merton 模型的局限:假设过于简化(单一零息债务、资产价值服从几何布朗运动、只在到期时可能违约),导致其估计的短期限信用利差系统性偏低。因此实务中通常使用其扩展形式(如 KMV 模型,也称为预期违约频率 EDF 模型),或转而使用约化模型(Reduced-form Models)。
CDS 定价与 CDS-Bond Basis
信用违约互换(CDS)是信用衍生品市场的基础工具。在一个标准 CDS 合约中,保护买方定期向保护卖方支付保费(CDS Spread),一旦参考实体发生信用事件,保护卖方赔偿保护买方的损失。
CDS 的公平保费
CDS 保费由保护买卖双方的期望现金流相等确定:
$$\text{PV}_{\text{Premium Leg}} = \text{PV}_{\text{Protection Leg}}$$
此处有展示代码展开 ▼
python
def cds_pricing(hazard_rates, discount_factors, recovery_rate, times):
"""
CDS 定价 —— 从违约强度曲线计算公平 CDS 利差
hazard_rates: 各期的风险率(违约强度)
discount_factors: 各期的无风险折现因子
recovery_rate: 回收率
times: 保费支付时间点
"""
n = len(times)
dt = np.diff([0] + list(times))
survival_prob = np.ones(n)
# 计算生存概率
for i in range(1, n):
survival_prob[i] = survival_prob[i-1] * np.exp(-hazard_rates[i-1] * dt[i-1])
# 保费端的现值
premium_leg = 0
for i, t in enumerate(times):
premium_leg += discount_factors[i] * survival_prob[i] * dt[i]
# 保护端:在每个时间区间内发生违约的预期赔偿
protection_leg = 0
for i in range(1, n):
prob_default_in_interval = survival_prob[i-1] - survival_prob[i]
protection_leg += discount_factors[i] * prob_default_in_interval * (1 - recovery_rate)
cds_spread = protection_leg / premium_leg
return cds_spread点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `cds_pricing`(CDS 定价 —— 从违约强度曲线计算公平 CDS 利差)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
CDS-Bond Basis
CDS-Bond Basis是指 CDS 利差与同一参考实体的债券信用利差之间的差异。理论上两者应该相等(无套利定价),但实际中经常出现偏离:
$$\text{Basis} = \text{CDS Spread} - \text{Bond Credit Spread}$$
**Basis 为正(CDS > 债券利差)**的可能原因:
- 债券的稀缺性溢价(CTD 期权价值)
- 债券交割期权价值
- 交易对手风险
**Basis 为负(债券利差 > CDS)**的可能原因:
- 流动性差异(债券流动性更差)
- 融资成本差异
- 卖空债券的难度/成本
此处有展示代码展开 ▼
python
def calculate_cds_bond_basis(cds_spread, bond_ytm, risk_free_rate):
"""
计算 CDS-Bond Basis
"""
# 资产的互换利差 (Asset Swap Spread) 近似为债券信用利差
bond_credit_spread = bond_ytm - risk_free_rate
basis = cds_spread - bond_credit_spread
return {
'cds_spread': cds_spread,
'bond_credit_spread': bond_credit_spread,
'basis': basis,
'basis_bps': basis * 10000
}点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `calculate_cds_bond_basis`(计算 CDS-Bond Basis)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
信用曲线构建
类似于收益率曲线,信用曲线描述了信用利差随期限的变化。构建方法通常分为两类:
- 分段常数风险率法:假设各期之间的违约强度为常数,从短到长 bootstrap
- 参数化方法:使用指数衰减或多项式参数化违约强度函数
此处有展示代码展开 ▼
python
def bootstrap_cds_curve(cds_spreads, maturities, recovery_rate, discount_curve):
"""
从 CDS 报价构建信用曲线(分段常数风险率)
cds_spreads: 各期限 CDS 利差
maturities: 期限
recovery_rate: 回收率
discount_curve: 函数,输入期限返回折现因子
"""
n = len(maturities)
hazard_rates = np.zeros(n)
for i in range(n):
T = maturities[i]
S = cds_spreads[i]
dt = 0.25 # 季度支付
times = np.arange(dt, T + dt, dt)
# 使用二分法求解该段的风险率
lo, hi = 0.0, 0.5
for _ in range(50):
mid = (lo + hi) / 2
test_hazards = np.array(list(hazard_rates[:i]) + [mid] * (len(times) - i + 1))
test_spread = cds_pricing(test_hazards,
np.array([discount_curve(t) for t in times]),
recovery_rate, times)
if test_spread < S:
lo = mid
else:
hi = mid
hazard_rates[i] = (lo + hi) / 2
return maturities, hazard_rates点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `bootstrap_cds_curve`(从 CDS 报价构建信用曲线(分段常数风险率))。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
信用曲线的形状反映了市场对不同期限违约风险的时间分布预期。例如,前高后低的信用曲线通常表明市场预期短期信用压力较大,而长期基本面相对健康。