信用风险是借款人因各种原因未能及时、足额偿还债务或银行贷款而违约的可能性。发生违约时,债权人或银行必将因为未能得到预期的收益而承担财务上的损失。 那么信用风险评估就是对借款人的违约可能性和可能承受到的损失进行评估。
1、信用风险评估模型
前面说到,金融模型评估的内容有分两种,一种是对借款人的违约可能性,另一种是当发生违约时,债权人或银行必将因为未能得到预期的收益而承担财务上的损失。下文介绍到的前2个模型是第一种情况的应用,后2个模型是第二种情况的应用。
1.1 Z计分模型
Z计分模型是阿克曼通过各种观察和计算得到,模型是多变量线性模型,根据当前上市公司的财务指标来判断当前公司的违约可能性,是这四个里面最简单。该模型判断的方法为Z值比较,若 Z < 2.675,借款人被划入违约组;反之,如果Z ≥ 2.675,则借款人被划入非违约组。当1.81 < Z < 2.99,判断失误比较大,称该重叠区域为未知区或称灰色区域。Z值的计算如下:
优点:
(1) 可以直接代入数据进行计算,计算资源需要少,可以在一些简单的场景使用
(2) 具有较强的操作性、适用性以及较强的预测能力
缺点:
(1)模型仅考虑了两个极端情况——违约和不违约,没法判断当发生违约时的资产回收率
(2)模型理论基础不强,这些权值都是根据历史的经验得出的,虽然有一定准确度但没法说明为什么是要这些特征而不是其他的特征因素
(3)权数不固定,调整周期不确定,费时费力
(4)没有考虑系统性风险的影响,如2008年的金融危机是无法预测的。
1.2 KMV模型
KMV 模型是 KMV 公司推出的一种计算信用风险的方法,用来评估上市公司的可能违约率。KMV模型利用证券市场相关数据并基于Black-Scholes期权定价模型,通过计算企业股权价值VE和股权收益率波动率σE推导出企业资产的市场价值VA 和资产收益率的波动率σA,之后根据同样是计算好的违约触发点DP,计算出当前的违约距离,最终根据经验或者标准正态分布表得到预期违约概率。
优点:
(1)该模型是一种动态的模型,可以及时反映信用风险的变化。
(2)该模型是一个前瞻性模型,不用依赖历史数据
(3)该模型的EDF指标在本质上是一种对风险的基数衡量法,即能判断出各个公司的违约概率差距。
缺点:
(1)由于数据只能用上市公司的财务报表,因此使用范围受限
(2)EDP的计算给予企业资产价值服从正态分布的假设
(3)KMV无法分辨长期债务的不同类型
(4)KMV没有考虑税收的影响
1.3 Credit risk+模型
信用风险(CreditRisk+)模型是第一波士顿信用监管机构(CreditSuisseFirstBoston)创建并公布的较为成熟的信用风险价值评估模型。该模型估计资产的违约损失需要每年的违约数以及每一笔投资额度。通过一系列计算可以得到资产组合的损失分布情况,如下图:
优点:
(1)传统的模型一般都是单期、单因素模型,而 CreditRisk+模型可以扩展到多期。
(2)违约率可看作是许多背景因素综合作用的结果,每个因素代表一种,可以用随机变量 Xk 来表示,每个债务人的平均违约率可以作是背景因素的线性函数,这些因素是相互独立的。
(3)CreditRisk+模型需要的输入信息简单,很容易计算边际风险贡献。
缺点:
CreditRisk+模型的局限性假定**滑有市场风险,每个债务的敞口固定不变,不依赖于发行人信用质量的最终变化和利率的变化而变化,而且这一模型不能处理非线性产品。 **
1.4 Credit metrics模型
运用 Creditmetrics 模型可以定量描述某一信用敞口对风险的边际贡献,从而判断是否将该敞口引入组合,提高识别、衡量和管理风险的能力;可以迫使银行收集信息,更明确地确定限额,更精确地基于风险和绩效进行评价,使银行的经济资本分配更合理;可以更好地对客户进行盈利分析,基于风险进行定价,更好地做好组合管理。
优点:
(1)运用该模型可以定量描述某一信用敞口对风险的边际贡献,从而判断是否将该敞口引入组合,提高识别、衡量和管理风险的能力
(2)可以迫使银行收集信息,更明确地确定限额,更精确地基于风险和绩效进行评价,使银行的经济资本分配更合理;可以更好地对客户进行盈利分析,基于风险进行定价,更好地做好组合管理。
局限性的表现:
(1)所有的预测和计算都以信用等级转移概率、违约概率为基础的,这两个历史统计数据库的可能性引起了一些专家的质疑。
(2)只要处于同一等级,所有企业的违约率都一样。
(3)实际违约率等于历史平均违约率。
(4)信用等级等同于信贷质量,信用等级与违约率是同义词,对担保因素考虑不够。
(5)信用等级的变化是独立的。这一假设存在一定问题,因为贷后的等级变化具有关联性,在同一行业、同一地区的企业,关联性大一些。在经济萧条时期,贷款的信用价值普遍变小,信用等级普遍变低,不同贷款的变化方向一致。
2. 基于神经网络的银行个人信用风险评估
前面介绍的评估违约可能性的模型的评估对象都是一些上市公司,因此现在就尝试对个人的信用风险评估进行建模,对我国的信用体系进行一些补充。本文对个人信用风险评估建模使用到的是B-P神经网络算法,通过该算法对现有的一些个人数据进行自学习然后完成模型。
2.1 B-P神经网络算法介绍
B-P 算法是一种有监督的学习算法,它利用均方误差最小和梯度下降法来实现对网络连接权值和偏置权值的修正。其学习的基本思路是:先将各单元间的连接权和偏置权设置为一个小的随机数(或由随机产生),然后选择一个训练样本,并计算样本的误差梯度,这涉及到两个过程:一个是前向过程,即信息的正向传播过程,输入信号从输入层通过激活函数向隐含层、输出层传播,每层神经元状态只影响下一层的神经元状态。将输入信息通过各个单元的传递,直至输出单元得到网络的输出结果为止。如果在输出层得不到期望的输出,即输出值与目标值的误差太大,则将误差信号由输出层向输入层逐层反推,通过修改各层神经元之间连接权值,使网络朝着能正确响应期望输出的方向不断变化下去,直至样本的实际输出值和期望输出值之间的误差小于预先给定的值为止。即完成一次误差的反向传播,当输出结果达到期望的预测精度,网络计算停止,目前 B-P算法已广泛用于信用风险领域,且使用较为稳定。
2.2 B-P神经网络算法的优势以及可行性
(1)B-P人工神经网络具有强大并行处理机制,高度自学习、自适应能力,内部有大量的可调参数,因此使系统灵活性更强。 我国的个人信用等级评估起步比较迟,相关信息残缺不全。而 B-P 神经网络是非线性交换单元的前馈式网络,具有很好的逼近非线性映射的能力。理论已证明,只要有足够的隐含层和隐神经单元,**B-P 网络可以逼近任意的非线性映射关系,从而求得问题的解答。这对于解决几乎没有规则、多约束条件或数据不完全的问题是非常适合的。 **
(2)B-P 人工神经网络的后天学习能力使之能够随环境的变化而不断学习。在进行个人信用等级评估与预测时,受到评估数据带有模糊性的特点制约,能够从未知模式的大量复杂数据中发现规律,与传统的评价方法相比,表现出更强的功能。
(3)B-P 人工神经网络方法是一种自然的非线性建模过程。它克服了传统分析过程的复杂性及选择适当模型函数形式的困难,无需分清存在何种非线性关系,给建立模型与分析带来了极大的方便。
(4)B-P 人工神经网络方法较好地保证了评估与预测结果的客观性。 在传统的个人信用风险评估中,大部分的决定因素是信贷员个人主观的判断,而B-P人工神经网络可以再现专家的经验、知识和直觉思维,较好地保证了评估与预测结果的客观性。
2.3 基于B-P算法的个人风险评估实现
2.3.1 数据特征
客户基本资料简化为收入、银行存款、失信次数三个指标。客户的信用额度划分为五个等级,分别用 0.2,0.4,0.6,0.8,1 来表示,说明模型建议授信的结果。样本数据及其定义如表 4.2、表 4.3 表示。
这里的数据均进行了归一化处理,归一化处理是为了防止小数值信息被大数值信息所淹没,需要对模型的样本输入进行归一化处理。归一化处理通常是将输入量归一化至[0,1],常用的有最大最小值法、指数函数法等。
最大最小归一化函数公式如下:
该方法对数据的归一化处理是一种线性的变换,所以数据归一化后能够较好地保留原始意义,不会过多地造成信息的丢失。
2.3.2 代码实现
具有单隐层的前馈神经网络可以映射任意连续函数,在此设计三层神经网络模拟信用风险评估过程,如图 2.3.4 所示。 其中,输入层节点数为 3,即输入向量 ,分别对应消费者信用风险评估所选择的 3 个要素:收入、银行存款、失信次数;隐层节点数为 5,即隐层向量 ;输出层节点数为 1,即变量 Z,其输出值为模型实际输出
输入和输出由于没有线性关系,选择了单极性 Sigmoid 函数,表达式如下:
具体实现代码如下,主要分3部分
(1)输入数据,数据手动输入,先转换为DataFrame格式,然后再转换为array数组格式,方便统计行列数和处理
(2)初始化神经网络各边的权重,设置学习率0.5,设置迭代次数80000,定义转换函数sigmoid
(3)开始迭代计算神经网络,最后得出最佳的权值,使用predict函数预测,并对比结果
测试结果如图2.3.5所示:
import pandas as pd
import numpy as np
data_dict = {
"序号": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27],
"收入指标": [1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1,
0.1, 1, 0.5],
"存款指标": [1, 1, 0.5, 0.5, 0.1, 0.1, 0.5, 0.1, 1, 1, 0.5, 0.5, 1, 0.1, 0.1, 0.1, 1, 0.5, 1, 0.5, 0.1, 0.1, 0.5, 0.1,
1, 1, 0.1],
"失信指标": [1, 0.1, 1, 0.1, 1, 0.1, 0.5, 0.5, 1, 0.1, 1, 0.5, 0.5, 0.5, 0.5, 0.1, 1, 1, 0.5, 0.5, 1, 0.1, 0.1, 0.5,
0.1, 0.5, 0.1],
"信用额度": [1, 0.8, 0.8, 0.6, 0.8, 0.4, 0.6, 0.6, 0.8, 0.6, 0.6, 0.4, 0.6, 0.4, 0.4, 0.2, 0.8, 0.6, 0.6, 0.4, 0.4, 0.2,
0.2, 0.2, 0.4, 0.8, 0.6]
}
dataset_df = pd.DataFrame(data_dict)
del dataset_df['序号']
dataset = dataset_df
dataset = np.array(dataset)
m, n = np.shape(dataset)
trueY = dataset[:, 0]
X = dataset[:, 1:]
m, n = np.shape(X)#(27,3)
# 初始化参数
import random
d = n # 输入向量的维数
l = 1 # 输出向量的维数
q = d+1 # 隐层节点的数量,这里用的是d+1,这个个数目前没有定论,通常是靠试错法来决定,几个结点表现好,就用几个
theta = [random.random() for i in range(l)] # 输出神经元的阈值
gamma = [random.random() for i in range(q)] # 隐层神经元的阈值
# v size= d*q .输入和隐层神经元之间的连接权重
v = [[random.random() for i in range(q)] for j in range(d)]
# w size= q*l .隐藏和输出神经元之间的连接权重
w = [[random.random() for i in range(l)] for j in range(q)]
eta = 0.5 # 训练速度
maxIter = 80000 # 最大训练次数
import math
def sigmoid(iX,dimension): # 激活函数,iX is a matrix with a dimension
if dimension == 1:
for i in range(len(iX)):
iX[i] = 1 / (1 + math.exp(-iX[i]))
else:
for i in range(len(iX)):
iX[i] = sigmoid(iX[i], dimension-1)
return iX
# 标准BP
while(maxIter > 0):
maxIter -= 1
sumE = 0# 累计误差
# 对于每一个样本,更新
for i in range(m):
# 1计算当前样本的输出
alpha = np.dot(X[i], v) # 隐层神经元的输入,1*d·d*q=1*q
b = sigmoid(alpha-gamma, 1) # 隐层神经元的输出b=f(alpha-gamma),1*q
beta = np.dot(b, w) # 输出层神经元的输入,1*l
predictY = sigmoid(beta-theta, 1) # 输出层神经元的预测输出,1*l,p102--5.3
E = sum((predictY-trueY[i]) * (predictY-trueY[i])) / 2 # 均方误差,p102--5.4
sumE += E # 累计误差,多个样本(xi,yi)p104--5.16
# 2计算当前样本的输出层神经元梯度项、隐层神经元梯度项
g = predictY * (1-predictY) * (trueY[i]-predictY) # 输出层神经元梯度项,1*l,p103--5.10
e = b * (1 - b) * ((np.dot(w, g.T)).T) # 隐层神经元梯度项,1*q,p104--5.15
# 3更新连接权和阈值
w += eta*np.dot(b.reshape((q, 1)), g.reshape((1, l))) # w更新,q*1·1*l=q*l,p104--5.11
theta -= eta*g # theta更新,p104--5.12
v += eta*np.dot(X[i].reshape((d, 1)), e.reshape((1, q))) # v更新,d*1·1*q=d*q,p104--5.13
gamma -= eta*e # gamma更新,p104--5.14
# print(sumE)
def predict(iX):
alpha = np.dot(iX, v) # m*q
b = sigmoid(alpha- gamma, 2) # b=f(alpha-gamma),m*q
beta = np.dot(b, w) # m*q·q*l=m*l
predictY = sigmoid(beta - theta, 2) # m*l
return predictY
result = predict(X)
compare = np.concatenate((result, true_Y),axis=1)
compare = pd.DataFrame(compare)
compare
测试结果:
2.3.3 结果分析
预测结果准确率高,若误差计算为 实际 - 预测 的话,最小误差仅有0.005,最大的仅有0.3,平均误差为0.06,充分表明该模型对个人的信用风险评估有非常好的表现。
2.4 基于B-P算法的个人风险评估总结
根据 B-P 网络的算法思想建立的个人信用风险评估模型,通过金融机构的个人信用历史数据的训练和学习,调整模型各组成神经单元之间的连接权重,确定输入输出之间的内在联系,从而使模型具备了对个人信用的预测评估能力。
但依然有缺点:
(1)网络结构确定比较困难。
(2)训练效率不高,需要足够的数据支持。
(3)具有黑箱特性,解释能力比较差。
2.5 B-P 算法应用的优化策略如下:
(1)学习因子 η 的优化:
采用变步长法根据输出误差大小自动调整学习因子,来减少迭代次数和加快收敛速度。
(2)隐层节点数的优化:
隐节点数的多少对网络性能的影响较大,当隐节点数太多时,会导致网络学习时间过长,甚至不能收敛;而当隐节点数过小时,网络的容错能力差。利用逐步回归分析法并进行参数的显著性检验来动态删除一些线性相关的隐节点。节点删除的标准:当由该 节点出发指向下一层节点的所有权值和阀值均落在死区(通常取±0.1、±0.05 等区间)之 中,则该节点可删除。最佳隐节点数 L 可参考下面公式计算:
式中:m 为输入节点数,n 为输出节点数,c 为介于 1~10 的常数。
(3)输入和输出神经元的确定:
利用多元回归分析法对神经网络的输入参数进行处理,删除相关性强的输入参数,来减少输入节点数。