Credit Risk+模型

1、简介

模型假设:(1)每笔贷款在给定期间内违约率不变;(2)每个借款人的违约率非常小,且违约数相互独立。所以违约事件发生的概率分布服从泊松分布
定义:Credit Risk+模型仅仅考虑了违约风险,而没有考虑信用等级降级风险,属于信用违约风险度量模型。利用CreditRisk+模型可以得到贷款组合损失的概率分布。
流程:先用贷款组合中最大一笔风险暴露值与风险暴露频段值L相除并四舍五入为整数得到风险暴露频段总级数m;然后将每笔贷款的风险暴露数除以L四舍五入为整数将其归类到该整数对应的频段级,即将所有贷款分类在m个频段级里;再计算每个频段级的贷款违约数量的概率分布和违约损失的概率分布(贷款违约数服从泊松分布,违约损失=违约数量*平均风险暴露);最后计算贷款组合的违约损失的概率分布(相同的组合损失金额可能对应多种损失组合,所以要加总概率)

2、计算过程

2.1模型所需特征

输入:贷款组合的风险暴露,风险暴露频段值L
中间:风险暴露频段级数m,各个频段级的贷款违约数量的概率分布和违约损失的概率分布
输出:贷款组合的违约损失的概率分布

2.2计算过程

风险暴露频段级数m:最大一笔风险暴露值/风险暴露频段值L再四舍五入
各个频段级的违约数和违约损失的概率分布:

贷款组合的违约数和违约损失的概率分布:

3、用到的python库及其方法

这里用到了两个库,分别是scipy和numpy。

3.1、scipy

scipy库建立在 Numpy 库之上,提供了大量科学算法,主要包括这些主题:

  • 特殊函数 (scipy.special)
  • 积分 (scipy.integrate)
  • 最优化 (scipy.optimize)
  • 插值 (scipy.interpolate)
  • 傅立叶变换 (scipy.fftpack)
  • 信号处理 (scipy.signal)
  • 线性代数 (scipy.linalg)
  • 稀疏特征值 (scipy.sparse)
  • 统计 (scipy.stats)
  • 多维图像处理 (scipy.ndimage)
  • 文件 IO (scipy.io)
    Credit Risk+模型引入第三方科学计算库模块scipy.stats,使用poisson(λ)计算泊松分布的概率质量函数:

用法如下:

import scipy.stats as st
po = st.poisson(1)
[po.pmf(i) for i in range(5)] # pmf: probability mass function,概率质量函数

Output:
[0.36787944117144233,
 0.36787944117144233,
 0.18393972058572114,
 0.061313240195240391,
 0.015328310048810101]

3.2、numpy

使用NumPy可以执行以下操作:
(1)数组的算数和逻辑运算。
(2)傅立叶变换和用于图形操作的例程。
(3)与线性代数有关的操作。 NumPy 拥有线性代数和随机数生成的内置函数。
这里使用了数组有关的操作。

4、模型演示

考察一家银行6笔贷款的情况,如下图,假设风险暴露频段值选定为L=5万人民币

代码如下:

import numpy as np
import scipy.stats as st
money = [5,4,8,9,10,3]
L = 5
labelnum = round(max(money) / L)# 风险暴露总级数
label = {}# 频段级及对应的贷款贷款金额
for i in money:
    for j in range(1, labelnum+1):
        if round(i / L) == j:
            if j not in label.keys():
                label[j] = [i]
            else:
                label[j].append(i)
label
Output:{1: [5, 4, 3], 2: [8, 9, 10]}
—————————————————————————————————
arr = np.zeros((len(label[1])+1,labelnum))# 各个频段级对应的违约数的概率分布
# λ=1
rv = st.poisson(1)
for i in range(arr.shape[0]):
    for j in range(arr.shape[1]):
        arr[i][j] = round(rv.pmf(i), 4)
arr
Output:array([[ 0.3679,  0.3679],
       [ 0.3679,  0.3679],
       [ 0.1839,  0.1839],
       [ 0.0613,  0.0613]])
—————————————————————————————————
pro = np.zeros((arr.shape[0], arr.shape[0]))# 联合违约概率
loss = np.zeros((arr.shape[0], arr.shape[0]))# 违约总损失
for i in range(pro.shape[0]):
    for j in range(pro.shape[1]):
        loss[i, j] = i * L + j * 2* L
        pro[i, j] = round(arr[i, 0] * arr[j, 1], 4)
pro
Output:array([[ 0.1354,  0.1354,  0.0677,  0.0226],
       [ 0.1354,  0.1354,  0.0677,  0.0226],
       [ 0.0677,  0.0677,  0.0338,  0.0113],
       [ 0.0226,  0.0226,  0.0113,  0.0038]])
loss
Output:array([[  0.,  10.,  20.,  30.],
       [  5.,  15.,  25.,  35.],
       [ 10.,  20.,  30.,  40.],
       [ 15.,  25.,  35.,  45.]])
—————————————————————————————————
arr2 = {}# 整理之后的贷款违约损失的概率分布
for i in range(pro.shape[0]):
    for j in range(pro.shape[1]):
        if loss[i, j] not in arr2.keys():
            arr2[loss[i, j]] = pro[i, j]
        else:
            arr2[loss[i, j]] = round((arr2[loss[i, j]] + pro[i, j]), 4)
arr2 = sorted(arr2.items(), key=lambda x: x[0])
arr2 = dict(arr2)
arr2
Output:{0.0: 0.13539999999999999,
 5.0: 0.13539999999999999,
 10.0: 0.2031,
 15.0: 0.158,
 20.0: 0.13539999999999999,
 25.0: 0.090300000000000005,
 30.0: 0.056399999999999999,
 35.0: 0.0339,
 40.0: 0.011299999999999999,
 45.0: 0.0038}
—————————————————————————————————
accu_pro = {}# 累积概率密度
for j in range(len(arr2)):
    sum = 0
    for i in range(j+1):
        sum = sum + list(arr2.values())[i]
    accu_pro[list(arr2.keys())[j]] = sum 
accu_pro = sorted(accu_pro.items(), key=lambda x: x[0])
accu_pro = dict(accu_pro)
accu_pro
Output:{0.0: 0.13539999999999999,
 5.0: 0.27079999999999999,
 10.0: 0.47389999999999999,
 15.0: 0.63190000000000002,
 20.0: 0.76729999999999998,
 25.0: 0.85760000000000003,
 30.0: 0.91400000000000003,
 35.0: 0.94790000000000008,
 40.0: 0.95920000000000005,
 45.0: 0.96300000000000008}
—————————————————————————————————
E_loss = [i*j for i,j in arr2.items()]# 期望损失
E_loss  
Output:[0.0,
 0.67699999999999994,
 2.0310000000000001,
 2.3700000000000001,
 2.7079999999999997,
 2.2575000000000003,
 1.6919999999999999,
 1.1864999999999999,
 0.45199999999999996,
 0.17100000000000001]
—————————————————————————————————
print(np.mean(E_loss))
print(np.std(E_loss))
Output:1.3545
0.93740327501

结果分析:该银行6笔贷款组成的贷款组合,未来一年期望的损失金额为1.35万人民币,大致可看出未来有95%的把握损失不会超过40万人民币。

5、模型优缺点

优点:
(1)要求的估计量和输入数据较少,仅需要债务工具的违约和风险暴露的数据,模型应用比较简单
(2)不需要对违约原因做任何假设
(3)将违约率视为连续随机变量,并将违约率的波动率纳入模型体现违约率本身的不确定性这一特征。通过使用违约波动率参数,模型得到简化,而且不用考虑违约相关性特征
缺点:
(1)忽略了信用等级变化,因而贷款信用风险在计算期间内固定不变,与实际情况不符合
(2)分组时,对每笔贷款暴露近似到组,从而将高估投资组合的方差
(3)忽略了市场风险

你可能感兴趣的:(Credit Risk+模型)