本文描述的是CreditRisk+模型闲先,該模型是一個信用風(fēng)險模型含蓉,根據(jù)銀行自身的違約率平均值乏冀,結(jié)合回收率和風(fēng)險暴露间校,得到所有債務(wù)人的資產(chǎn)組合的預(yù)期違約損失分布生百。該分布可以給銀行做參考揍魂,準備相應(yīng)的年度信用準備金物独。
目錄
1.CreditRisk+模型簡介:主要說明CreditRisk+模型是什么重荠,該模型需要的假設(shè)以及大概的計算流程栋豫。
2.計算過程:主要說明Z計分模型里的特征含義挤安,以及Z值的用途。
3.用到的python庫及其方法:主要說明導(dǎo)入的庫的用途以及使用方法
4.模型演示:給出數(shù)據(jù)丧鸯,看一下Python代碼是如何實現(xiàn)的蛤铜,并分析結(jié)果。
5.總結(jié):總結(jié)該模型的優(yōu)缺點丛肢。
1围肥、CreditRisk+模型簡介
在財產(chǎn)保險精算思想和方法的啟發(fā)下,瑞士信貸銀行金融產(chǎn)品部開發(fā)出了基于財險精算方法的違約模型蜂怎,記為CreditRisk+模型穆刻。
該模型只考慮違約或不違約兩種狀態(tài),同時假定違約率是隨機的杠步,并以此為前提度量預(yù)期損失氢伟、未預(yù)期損失及其變化,所以CreditRisk+模型是一個違約模型幽歼。
定義:
CreditRisk+模型僅僅考慮了違約風(fēng)險朵锣,而沒有考慮信用等級降級風(fēng)險,屬于信用違約風(fēng)險度量模型试躏。利用CreditRisk+模型可以得到貸款組合損失的概率分布猪勇。
模型假設(shè):
(1)每筆貸款在給定期間內(nèi)違約率不變;
(2)每個借款人的違約率非常小颠蕴,且違約數(shù)相互獨立泣刹。
所以違約事件發(fā)生的概率分布服從泊松分布助析。
流程:
(1)先用貸款組合中最大一筆風(fēng)險暴露值與風(fēng)險暴露頻段值L相除并四舍五入為整數(shù)得到風(fēng)險暴露頻段總級數(shù)m;
(2)然后將每筆貸款的風(fēng)險暴露數(shù)除以L四舍五入為整數(shù)將其歸類到該整數(shù)對應(yīng)的頻段級椅您,即將所有貸款分類在m個頻段級里外冀;
(3)再計算每個頻段級的貸款違約數(shù)量的概率分布和違約損失的概率分布(貸款違約數(shù)服從泊松分布,違約損失=違約數(shù)量*平均風(fēng)險暴露)掀泳;
(4)最后計算貸款組合的違約損失的概率分布(相同的組合損失金額可能對應(yīng)多種損失組合雪隧,所以要加總概率)
2、計算過程
2.1员舵、模型所需特征
輸入:貸款組合的風(fēng)險暴露脑沿,風(fēng)險暴露頻段值L
中間:風(fēng)險暴露頻段級數(shù)m,各個頻段級的貸款違約數(shù)量的概率分布和違約損失的概率分布
輸出:貸款組合的違約損失的概率分布
2.2马僻、計算過程
所需特征已經(jīng)給出庄拇,那么接下來就是說明這些特征的處理或計算的過程了,這些過程主要分三步
2.2.1 第一步:風(fēng)險暴露頻段分級法
我們以N筆貸款構(gòu)成的組合為例韭邓,具體介紹頻段分級法:
(1)先根據(jù)所有貸款的風(fēng)險暴露情況設(shè)定風(fēng)險暴露頻段值措近,記為L,例如可以取L=2萬元作為一個頻段值女淑。
(2)用N筆貸款中最大一筆貸款風(fēng)險暴露值除以頻段值L瞭郑,將計算數(shù)值按照四舍五入湊成整數(shù),稱之為風(fēng)險暴露的頻段總級數(shù)鸭你,設(shè)為m屈张,于是,就得到m個風(fēng)險暴露頻段級袱巨,以此為v1袜茧、v2、…瓣窄、vm笛厦,vi所對應(yīng)的風(fēng)險暴露量為Li。
(3)將每筆貸款的風(fēng)險暴露量除以頻段值L俺夕,再按照四舍五入的規(guī)則將計算數(shù)值湊成整數(shù)裳凸,然后將該筆貸款歸類到該整數(shù)值歲對應(yīng)的頻段值,類似地劝贸,可將所有貸款歸類姨谷。
2.2.2 第二步:各個頻段級的違約概率和損失分布
假設(shè)處于vi頻段級的貸款的平均違約數(shù)為λi,同時設(shè)將N筆貸款劃級歸類后處于vi頻段級的貸款數(shù)目為Ni映九,顯然梦湘,N1 + N2 + … + Nm = N于是,可得:
其中,Li = L × i 為vi頻段級對應(yīng)的風(fēng)險暴露數(shù)捌议,L為頻段值哼拔。于是,我們可以得到處于vi頻段級的違約概率分布及其對應(yīng)的損失分布瓣颅。
2.2.3 第三步:N筆貸款組合的違約概率和損失分布
求出各個頻段級的貸款違約概率和預(yù)期損失后倦逐,要加總共m個風(fēng)險暴露頻段級的損失,以得到N筆貸款組合的損失分布宫补。
(1)首先要考慮各種預(yù)期損失可能的結(jié)合來計算概率檬姥。
假設(shè)N筆貸款中處于vi頻段級的違約數(shù)為ni,這樣得到一個依次對應(yīng)于m個頻段級的違約組合(n1粉怕,n2健民,…,nm)贫贝,于是荞雏,根據(jù) Li = L × i 可計算出該違約組合對應(yīng)的風(fēng)險暴露量為:
(2)根據(jù)貸款違約事件的獨立性假設(shè)和泊松分布假設(shè),得到對應(yīng)于違約組合(n1平酿,n2,…悦陋,nm)的N筆貸款組合的違約概率為:
(3)我們用G表示滿足的所有不同組合的違約組合(n1蜈彼,n2,…俺驶,nm)的集合幸逆,即:
則N筆貸款組合的風(fēng)險暴露或違約損失=nL的概率及其對應(yīng)的預(yù)期損失分別為:
其中,n = 1暮现,2还绘,…,于是栖袋,通過上式就可以得到N筆貸款組合的違約概率和損失分布拍顷。
3、用到的python庫及其方法
這里用到了兩個庫塘幅,分別是scipy和numpy昔案。
3.1、scipy
scipy庫建立在Numpy庫之上电媳,提供了大量科學(xué)算法踏揣,主要包括這些主題:
*特殊函數(shù)(scipy.special)
*積分(scipy.integrate)
*最優(yōu)化(scipy.optimize)
*插值(scipy.interpolate)
*傅立葉變換(scipy.fftpack)
*信號處理(scipy.signal)
*線性代數(shù)(scipy.linalg)
稀疏特征值(scipy.sparse)
統(tǒng)計(scipy.stats)
多維圖像處理(scipy.ndimage)
文件IO(scipy.io)
CreditRisk+模型引入第三方科學(xué)計算庫模塊scipy.stats,使用poisson(λ) 計算泊松分布的概率質(zhì)量函數(shù):
用法如下:
importscipy.statsasst
po=st.poisson(1)
[po.pmf(i)foriinrange(5)]#pmf:probabilitymassfunction匾乓,概率質(zhì)量函數(shù)
Output:
[0.36787944117144233,
0.36787944117144233,
0.18393972058572114,
0.061313240195240391,
0.015328310048810101]
3.2捞稿、numpy
使用NumPy可以執(zhí)行以下操作:
(1)數(shù)組的算數(shù)和邏輯運算。
(2)傅立葉變換和用于圖形操作的例程。
(3)與線性代數(shù)有關(guān)的操作娱局。NumPy擁有線性代數(shù)和隨機數(shù)生成的內(nèi)置函數(shù)彰亥。
這里使用了數(shù)組有關(guān)的操作。
4铃辖、模型演示
考察一家銀行6筆貸款的情況剩愧,如下圖,假設(shè)風(fēng)險暴露頻段值選定為L = 5萬人民幣娇斩,—個信貸組合中一年內(nèi)發(fā)生1個違約事件仁卷,即 λ = 1
代碼和計算過程一樣分為3個部分:
第一部分為將6筆貸款除以風(fēng)險暴露頻段值,將貸款分成兩類犬第,輸出字典變量label锦积。
第二部分是計算各個頻段級的違約概率和損失分布,輸出的每一列對應(yīng)每個頻段級的概率分布arr歉嗓。
第三部分計算更多了丰介,先是計算各個違約損失組合的違約概率,然后整理成一個數(shù)組對象并計算出概率分布鉴分。最后得出未來一年內(nèi)的預(yù)期損失期望哮幢,變量為E_loss。
代碼如下志珍,代碼里用到的重要變量都有注釋:
import numpy as np
import scipy.stats as st
money = [5,4,8,9,10,3]
L = 5
labelnum = round(max(money) / L) # 風(fēng)險暴露總級數(shù)
label = {} # 頻段級及對應(yīng)的貸款貸款金額
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))# 各個頻段級對應(yīng)的違約數(shù)的概率分布
# λ=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])) # 聯(lián)合違約概率
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}
—————————————————————————————————
“”“
繪制圖像
”“”
plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
x_list = list(range(0,10,1))
height_list = list(accu_pro.values())
rects1 = plt.bar(x=x_list, height=height_list, width=0.5, alpha=0.8, color='red', linewidth=2)
# 設(shè)置x軸坐標點顯示
tick_labels = list(accu_pro.keys())
tick_pos = x_list
plt.xticks(tick_pos, tick_labels)
plt.title("資產(chǎn)組合的預(yù)期違約損失分布", size=16)
plt.xlabel("期望損失金額", size=14)
plt.ylabel("不違約概率", size=14)
for a,b in zip(x_list,height_list):
plt.text(a, b+0.02, '%.4f' % b, ha='center', va= 'bottom',fontsize=10)
plt.show()
—————————————————————————————————
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
結(jié)果分析:該銀行6筆貸款組成的貸款組合橙垢,未來一年期望的損失金額為1.35萬人民幣,大致可看出未來有95%的把握損失不會超過40萬人民幣伦糯。
5柜某、總結(jié)
credit disk+模型優(yōu)缺點總結(jié)如下:
優(yōu)點:
(1)要求的估計量和輸入數(shù)據(jù)較少,僅需要債務(wù)工具的違約和風(fēng)險暴露的數(shù)據(jù)敛纲,模型應(yīng)用比較簡單
(2)不需要對違約原因做任何假設(shè)
(3)將違約率視為連續(xù)隨機變量喂击,并將違約率的波動率納入模型體現(xiàn)違約率本身的不確定性這一特征。通過使用違約波動率參數(shù)淤翔,模型得到簡化翰绊,而且不用考慮違約相關(guān)性特征
缺點:
(1)忽略了信用等級變化,因而貸款信用風(fēng)險在計算期間內(nèi)固定不變旁壮,與實際情況不符合
(2)分組時辞做,對每筆貸款暴露近似到組,從而將高估投資組合的方差
(3)忽略了市場風(fēng)險
代碼及參考文獻下載地址:https://gitee.com/hwang_zc/Financial-model/tree/master/Credit%20Risk+