信用风险基础:从定义到量化

大家好,我是老张。今天咱们聊聊信用风险的基础知识。

说实话,我刚入行那会儿,觉得信用风险就是“借钱不还”。后来做了几个项目才发现,这事儿远没那么简单。你想想看,一个企业从正常经营到违约,中间有多少坑?

信用风险的定义与分类

信用风险,说白了就是交易对手不履约的风险。我习惯把它分成三类:

  • 违约风险:最直接的风险。对方直接不还钱了。
  • 信用利差风险:信用状况恶化导致的市场价值变化。
  • 评级迁移风险:信用评级变动带来的影响。

我在项目中遇到过一家企业,评级从AA降到BBB,债券价格直接跌了15%。这就是典型的信用利差风险。

违约概率(PD)

PD是信用风险建模的起点。它回答一个问题:这个对手在未来一年内违约的可能性有多大?

我个人习惯用Logistic回归来建模PD。为什么?因为它输出的是0到1之间的概率值,天然适合做违约预测。

import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression

# 假设我们有历史数据
X = df[['资产负债率', '流动比率', 'ROA', '营收增长率']]
y = df['是否违约']

model = LogisticRegression()
model.fit(X, y)

# 预测新客户的违约概率
new_customer = [[0.65, 1.2, 0.08, 0.15]]
pd_pred = model.predict_proba(new_customer)[0][1]
print(f'预测违约概率: {pd_pred:.2%}')

避坑指南:我曾经用全量数据训练PD模型,结果发现样本不平衡问题严重。违约样本只占1%,模型直接学成了“永远不违约”。后来用了SMOTE过采样,效果才正常。

违约损失率(LGD)

LGD衡量的是:一旦违约,我们会损失多少?

举个例子:一笔100万的贷款,抵押物价值80万,回收成本5万。那么回收率是75%,LGD就是25%。

嗯,这里要注意:LGD不是固定的。经济好的时候回收率高,经济差的时候回收率低。我见过一个极端案例,2008年金融危机时,某些次级贷款的LGD高达80%。

抵押品类型 典型LGD范围
现金/国债 0% - 10%
房地产 20% - 40%
应收账款 40% - 60%
无抵押 60% - 100%

违约风险敞口(EAD)

EAD就是违约时我们暴露在风险中的金额。听起来简单,但实际计算时有很多坑。

比如授信额度1000万,客户只用了600万。违约时EAD是多少?不是600万,也不是1000万。我习惯用“信用转换系数”来处理:

def calculate_ead(limit, drawn_amount, ccf=0.75):
    """
    limit: 授信额度
    drawn_amount: 已使用额度
    ccf: 信用转换系数 (Credit Conversion Factor)
    """
    undrawn = limit - drawn_amount
    ead = drawn_amount + undrawn * ccf
    return ead

# 例子
ead = calculate_ead(1000, 600, 0.75)
print(f'EAD = {ead}万')  # 输出: EAD = 900万

注意:CCF不是拍脑袋定的。我建议用历史数据回测,不同行业、不同产品类型的CCF差异很大。曾经有个项目,我们直接用0.5的CCF,结果资本计提严重不足。

预期损失(EL)与非预期损失(UL)

这两个概念是信用风险管理的核心。我习惯这样理解:

  • EL:平均来看,我们会亏多少?
  • UL:最坏情况下,我们会亏多少?

EL的计算公式很简单:

EL = PD × LGD × EAD

举个例子:

pd = 0.02  # 2%
lgd = 0.4  # 40%
ead = 100  # 100万

el = pd * lgd * ead
print(f'预期损失: {el:.2f}万')  # 输出: 0.80万

UL的计算就复杂多了。它需要知道损失分布的标准差。我一般用蒙特卡洛模拟:

import numpy as np

def simulate_ul(pd, lgd, ead, n_simulations=100000):
    losses = []
    for _ in range(n_simulations):
        # 模拟违约事件
        default = np.random.binomial(1, pd)
        # 模拟损失率
        loss_rate = np.random.beta(2, 3) * lgd
        loss = default * loss_rate * ead
        losses.append(loss)
    
    losses = np.array(losses)
    el = np.mean(losses)
    ul = np.std(losses)
    return el, ul

el, ul = simulate_ul(0.02, 0.4, 100)
print(f'EL: {el:.2f}万, UL: {ul:.2f}万')

关键点:EL是定价的基础,UL是资本计提的依据。银行赚的是EL以上的钱,但必须为UL准备足够的资本。

知识体系总览

下面这张图是我自己整理的信用风险基础框架,你看一眼就能明白各要素之间的关系:

信用风险 PD 违约概率 LGD 违约损失率 EAD 风险敞口 EL = PD × LGD × EAD UL = σ(损失分布) 定价 & 准备金 资本计提 (RWA) 压力测试 信用风险量化框架:从基础要素到业务应用

这张图把信用风险的几个核心要素串起来了。从PD、LGD、EAD出发,计算出EL和UL,最后应用到定价、资本计提和压力测试中。

我个人觉得,理解这张图比背公式重要得多。你想想看,如果连风险从哪来、怎么传导都不清楚,算出来的数字再漂亮也没用。

实战建议:刚开始做信用风险建模时,别急着上复杂模型。先把PD、LGD、EAD这三个基础要素搞清楚。我见过太多人一上来就搞机器学习,结果连基础逻辑都没理顺。

好了,这一章就到这里。信用风险的基础框架已经搭好了,后面我们会一步步深入每个要素的具体建模方法。


公众号:蓝海资料掘金营,微信deep3321