Skip to content

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)

公司债收益率与同期限无风险利率(通常用同期限国债收益率或互换利率)之间的差额。它是衡量市场对信用风险定价的关键指标。

PYTHON36 行 · 1.2 KB
📄此处有展示代码36 行 · 1.2 KB展开 ▼
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)$$

其中 E 为权益市值,V 为资产市值,D 为债务面值。d1d2 的定义与 Black-Scholes 公式一致,但以资产波动率 σV 替代股价波动率。

违约概率为资产价值 VT 低于债务面值 D 的概率:

$$PD = \Phi\left(-\frac{\ln(V/D) + (\mu - \sigma_V^2/2)T}{\sigma_V\sqrt{T}}\right) = \Phi(-d_2^*)$$
PYTHON41 行 · 1.3 KB
📄此处有展示代码41 行 · 1.3 KB展开 ▼
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}}$$
PYTHON29 行 · 1.0 KB
📄此处有展示代码29 行 · 1.0 KB展开 ▼
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)**的可能原因:

  • 流动性差异(债券流动性更差)
  • 融资成本差异
  • 卖空债券的难度/成本
PYTHON14 行 · 444 B
📄此处有展示代码14 行 · 444 B展开 ▼
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)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。

信用曲线构建

类似于收益率曲线,信用曲线描述了信用利差随期限的变化。构建方法通常分为两类:

  1. 分段常数风险率法:假设各期之间的违约强度为常数,从短到长 bootstrap
  2. 参数化方法:使用指数衰减或多项式参数化违约强度函数
PYTHON33 行 · 1.1 KB
📄此处有展示代码33 行 · 1.1 KB展开 ▼
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 报价构建信用曲线(分段常数风险率))。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。

信用曲线的形状反映了市场对不同期限违约风险的时间分布预期。例如,前高后低的信用曲线通常表明市场预期短期信用压力较大,而长期基本面相对健康。