信用评级体系:外部评级与内部评级法

信用评级,说白了就是给借钱的人或机构打个分。这个分决定了他们违约的可能性有多大。我在做衍生品定价时,评级是最基础的输入参数之一。没有它,后面的模型全是空中楼阁。

一、三大外部评级机构

全球公认的三家评级机构:标普、穆迪、惠誉。它们各有各的评级符号体系,但核心逻辑差不多。

评级机构 最高等级 投资级分界线 违约级
标普 (S&P) AAA BBB- D
穆迪 (Moody's) Aaa Baa3 C
惠誉 (Fitch) AAA BBB- D

关键点:投资级 vs 投机级。很多机构投资者只允许持有投资级债券。一旦被降级到投机级,会引发强制抛售。我在2015年就见过一个案例,某公司被从BBB-降到BB+,当天债券价格暴跌15%。

二、外部评级的局限性

外部评级有个大问题——滞后性。评级机构往往在经济危机之后才下调评级。2008年雷曼兄弟破产前一天,评级还是A级。你想想看,这能信吗?

另外,外部评级覆盖范围有限。很多中小企业和结构化产品根本没有外部评级。这时候就需要内部评级法了。

三、内部评级法 (IRB)

巴塞尔协议II提出了内部评级法。银行可以用自己的模型来评估信用风险。我个人习惯把IRB分为两类:

  • 基础IRB:银行自己算违约概率(PD),其他参数用监管给定的
  • 高级IRB:所有参数都自己算,包括违约损失率(LGD)、违约敞口(EAD)

内部评级法的核心是四个参数:

  1. PD (违约概率):未来一年内违约的可能性
  2. LGD (违约损失率):违约后能收回多少?一般40%-60%
  3. EAD (违约敞口):违约时欠了多少钱
  4. M (期限):剩余期限

我的经验:内部评级最容易被忽视的是数据质量。我曾经接手一个项目,历史违约数据里有一半是手工录入的,错漏百出。后来我花了三个月清洗数据,才敢用这些数据建模。记住:垃圾进,垃圾出。

四、评级迁移矩阵

评级不是一成不变的。公司可能升级,也可能降级。评级迁移矩阵就是描述这种变化的工具。

举个例子,标普的年度迁移矩阵(简化版):

初始\终态 AAA AA A BBB BB B CCC D
AAA 90.0% 8.0% 1.5% 0.3% 0.1% 0.05% 0.02% 0.03%
AA 0.5% 88.0% 8.5% 2.0% 0.5% 0.3% 0.1% 0.1%
A 0.05% 2.0% 87.0% 7.5% 2.0% 0.8% 0.3% 0.35%
BBB 0.02% 0.3% 4.0% 85.0% 6.0% 2.5% 1.0% 1.18%
BB 0.01% 0.1% 0.5% 5.0% 80.0% 8.0% 3.0% 3.39%
B 0.0% 0.05% 0.2% 0.5% 5.0% 78.0% 8.0% 8.25%
CCC 0.0% 0.0% 0.1% 0.3% 1.0% 5.0% 70.0% 23.6%

注意:迁移矩阵的对角线元素代表评级不变的概率。AAA级有90%的概率保持不变,而CCC级只有70%。为什么会这样?因为高评级公司更稳定,低评级公司波动大。我曾经用这个矩阵做过压力测试,发现经济下行时,迁移概率会整体向右偏移——降级概率翻倍。

五、如何用Python计算迁移矩阵

实际工作中,我们不会直接用标普的矩阵。每个机构都有自己的迁移矩阵。下面是我常用的计算方法:

import pandas as pd
import numpy as np

def calculate_transition_matrix(ratings_data, start_date, end_date):
    """
    计算评级迁移矩阵
    ratings_data: DataFrame,包含['company', 'date', 'rating']三列
    """
    # 获取起始和结束评级
    start = ratings_data[ratings_data['date'] == start_date]
    end = ratings_data[ratings_data['date'] == end_date]
    
    # 合并数据
    merged = pd.merge(start, end, on='company', suffixes=('_start', '_end'))
    
    # 构建迁移矩阵
    ratings = ['AAA', 'AA', 'A', 'BBB', 'BB', 'B', 'CCC', 'D']
    matrix = pd.DataFrame(0, index=ratings, columns=ratings)
    
    for _, row in merged.iterrows():
        matrix.loc[row['rating_start'], row['rating_end']] += 1
    
    # 归一化
    matrix = matrix.div(matrix.sum(axis=1), axis=0)
    
    return matrix

# 使用示例
# matrix = calculate_transition_matrix(data, '2023-01-01', '2024-01-01')
# print(matrix.round(4))

避坑指南:我曾经在计算迁移矩阵时,忽略了"评级撤销"的情况。有些公司可能因为并购、退市等原因不再有评级。这些数据不能简单丢弃,否则会高估迁移概率。我的做法是单独加一列"NR"(Not Rated),把撤销评级的公司归到这一列。

六、评级体系在信用衍生品中的应用

评级迁移矩阵在CDS定价中特别有用。比如,你要给一份5年期CDS定价,就需要知道这5年内评级变化的路径。不同路径对应不同的违约概率。

具体做法是:

  1. 用迁移矩阵模拟未来N年的评级路径
  2. 每条路径对应一个违约概率
  3. 对所有路径的违约概率取期望

嗯,这里要注意:迁移矩阵假设评级变化是马尔可夫过程——未来只取决于当前评级,与过去无关。这个假设在现实中不完全成立,但作为一阶近似已经够用了。

七、知识体系总览

下面这张图展示了本章的核心逻辑:

信用评级体系知识结构 外部评级 内部评级法 评级迁移矩阵 标普、穆迪、惠誉 投资级 vs 投机级 PD / LGD / EAD / M 基础IRB vs 高级IRB 迁移概率计算 CDS定价应用 三者关系:外部评级提供基准 → 内部评级法细化 → 迁移矩阵动态跟踪

这张图把三者的关系说清楚了。外部评级是起点,内部评级法做精细化,迁移矩阵负责动态跟踪。三者缺一不可。

最后说一句:评级体系不是万能的。我见过太多人迷信评级,结果吃了大亏。评级只是一个参考,真正的风险要靠自己的模型去量化。记住:模型是工具,不是真理。

专注资料整理