信用评级体系:外部评级与内部评级法
信用评级,说白了就是给借钱的人或机构打个分。这个分决定了他们违约的可能性有多大。我在做衍生品定价时,评级是最基础的输入参数之一。没有它,后面的模型全是空中楼阁。
一、三大外部评级机构
全球公认的三家评级机构:标普、穆迪、惠誉。它们各有各的评级符号体系,但核心逻辑差不多。
| 评级机构 | 最高等级 | 投资级分界线 | 违约级 |
|---|---|---|---|
| 标普 (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)
内部评级法的核心是四个参数:
- PD (违约概率):未来一年内违约的可能性
- LGD (违约损失率):违约后能收回多少?一般40%-60%
- EAD (违约敞口):违约时欠了多少钱
- 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年内评级变化的路径。不同路径对应不同的违约概率。
具体做法是:
- 用迁移矩阵模拟未来N年的评级路径
- 每条路径对应一个违约概率
- 对所有路径的违约概率取期望
嗯,这里要注意:迁移矩阵假设评级变化是马尔可夫过程——未来只取决于当前评级,与过去无关。这个假设在现实中不完全成立,但作为一阶近似已经够用了。
七、知识体系总览
下面这张图展示了本章的核心逻辑:
这张图把三者的关系说清楚了。外部评级是起点,内部评级法做精细化,迁移矩阵负责动态跟踪。三者缺一不可。
最后说一句:评级体系不是万能的。我见过太多人迷信评级,结果吃了大亏。评级只是一个参考,真正的风险要靠自己的模型去量化。记住:模型是工具,不是真理。