主要内容

基于Bagging决策树的信用评级

这个例子展示了如何构建一个自动化的信用评级工具。

信用风险管理的基本任务之一是为借款人设定信用等级。评级被用来根据客户感知到的信用度对其进行排名:评级越高,客户风险越低;相似的等级意味着相似的风险水平。信用等级分为两类:信用等级和信用分数。信用评级是为数不多的几个不连续的等级,通常用字母标记,如“AAA”、“BB-”等。信用分数是数字等级,如“640”或“720”。信用等级是监管框架的关键要素之一,如巴塞尔协议II(见巴塞尔银行监管委员会[3.])。

分配信用等级涉及分析借款人的信息。如果借款人是个人,则利息信息可以是个人的收入、未偿债务(抵押贷款、信用卡)、家庭规模、居住状况等。对于企业借款人,可以考虑一定的财务比率。(例如,销售额除以总资产)、行业等。这些关于借款人的信息称为特性或者预测.不同的机构使用不同的预测器,它们也可能有不同的评级等级或评分范围来对其客户进行评级。对于向潜在借款人的大市场提供的相对较小的贷款(例如信用卡),通常使用信用评分,并且对借款人进行评级的过程通常是自动化的。对于中小企业和大企业可获得的大额贷款,通常使用信用评级,而评级过程可能涉及自动算法和专家分析的组合。

有些评级机构会跟踪公司的信誉。然而,大多数银行开发了一种内部方法来为客户分配信用等级。如果客户没有得到评级机构的评级,内部评级可能是必要的,但即使存在第三方评级,内部评级也可以提供对客户风险状况的补充评估。

这个例子展示了MATLAB®如何帮助信用评级过程的自动化阶段。特别地,这个示例利用了Statistics and Machine learning Toolbox™中现成的统计学习工具之一,这是一种称为a袋装决策树

本例假设历史信息以数据集的形式提供,其中每条记录包含借款人的特征和分配给它的信用评级。这些评级可能是内部评级,由一个遵循既定政策和程序的委员会指派。或者,评级可能来自一家评级机构,后者的评级被用来“启动”一个新的内部信用评级系统。

现有的历史数据是起点,它用于火车自动进行信用评级的袋装决策树。在统计学习词汇表中,此培训过程属于监督式学习.然后使用分类器将评级分配给新客户。在实践中,这些自动或预测评级很可能被认为是暂时的,直到一个由专家组成的信用委员会审查它们。本例中使用的分类器类型也可以促进这些评级的修订,因为它提供了预测评级的确定性度量分类分

在实践中,您需要先培训分类器,然后使用它来为新客户分配信用评级,最后您也需要轮廓或者评估质量或分类器的准确性,这一过程也称为验证或者回测.本示例还讨论了一些现成的反向测试工具。

加载现有信用评级数据

从逗号分隔的文本文件加载历史数据Creditrating_Historical.dat..本示例使用文本文件,但如果您可以访问Database Toolbox™,则可以直接从数据库加载此信息。

数据集包含资金比率,行业部门和信用评级,以获取企业客户名单。这是模拟的,而不是真实数据。第一列是客户ID。然后有五列金融比率。这些是Altman Z-Score中使用的比率(参见Altman [1.];参见Loeffler和Posch [4.]进行相关分析)。

  • 营运资本/总资产(WC_TA)

  • 留存收益/总资产(RE_TA)

  • 息税前收益/总资产(EBIT_TA)

  • 股权/账面价值总债务(MVE_BVTD)

  • 销售/总资产(S_TA)

接下来,有一个行业扇区标签,一个整数值范围1.12.最后一列是分配给客户的信用评级。

将数据加载到表格数组中。

Creditds = Readtable(“CreditRating_Historical.dat”);

将特征复制到矩阵中X,以及相应的类,即评级,转换成一个向量Y.这不是必需的步骤,因为您可以直接从数据集或者表格数组,但这里的示例这样做是为了简化下面的一些重复函数调用。

要存储在矩阵中的功能X是五个财务比率,以及行业标签。行业是一个分类变量,名义上的事实上,因为在行业部门中没有秩序。响应变量,信用评级,也是分类的,尽管这是一个序数变量,因为根据定义,评级意味着a排名的良好信誉。这个例子使用这个变量“as is”来训练分类器。将该变量复制到序数阵列因为这样输出就会按照评级的自然顺序输出,而且更容易阅读。的定义中作为第三个参数传递的单元格数组建立了评级的顺序Y.信用评级也可以映射到数字值,这对于尝试替代方法来分析数据(例如,回归)是有用的。始终建议在实践中尝试不同的方法。

X = [creditDS。WC_TA creditDS。RE_TA creditDS。EBIT_TA creditDS。MVE_BVTD...creditDS。S_TA creditDS.Industry];Y =序数(creditDS.Rating);

使用预测X以及回应Y为了适应一种叫做袋装决策树.“Bagging”在这个上下文中代表“引导聚合”。该方法包括生成若干子样本,或引导副本,来自数据集。这些子样本是随机生成的,从数据集中的客户列表中进行替换采样。对于每个副本,都会生成一棵决策树。每个决策树都是一个经过训练的分类器,可以单独用于对新客户进行分类。两棵树的预测是从两个不同的靴子中生成的不过,陷阱副本可能会有所不同聚合为所有Bootstrap副本生长的所有决策树的预测。如果大多数树木预测新客户的一个特定类,则需要考虑比单独树的预测更强大的预测是合理的。此外,如果通过较小的树木预测不同的类,则该信息也很有用。事实上,预测不同类别的树木的比例是基础分级分数在分类新数据时由集合报告。

建造树袋机

构建分类集成的第一步将是为单个树木找到一个好的叶子大小;这里的例子尝试大小1.,5., 和10.(更多信息,请参阅统计学和机器学习工具箱文档TreeBagger.)从少量的树开始,25只有,因为你最想比较的是不同叶子大小的分类误差的初始趋势。为了再现性和公平比较,每次构建分类器时,都要重新初始化随机数生成器,该生成器用于从数据中进行替换取样。

Leaf = [1 5 10];nTrees = 25;rng (9876“龙卷风”);savedRng=rng;%保存当前RNG设置颜色=“bgr”;2 = 1:长度(叶)重新初始化随机数生成器,以便每个叶子尺寸的%随机样本相同rng(储蓄存款)%为每个叶子大小创建一个袋装决策树,并在袋子外绘图%的错误“oobError”b = TreeBagger (nTrees, X, Y,“OOBPrediction”,“上”,...“分类预测因素”6...“MinLeafSize”、叶(ii));情节(oobError (b)、颜色(ii))结束包含(“已生长树木的数量”)ylabel(“Out-of-bag分类错误”)({传奇'1',“5”,'10'},'地点',“东北”)标题(“不同叶大小的分类错误”) 抓住离开

对于三个叶大小选项,错误是可以比较的。因此工作叶的大小为10,因为它导致更精简的树木和更有效的计算。

请注意,您不必将数据分割为培训测试子集。这是在内部完成的,它隐含在该方法的抽样过程中。在每次bootstrap迭代中,bootstrap副本是训练集,任何被遗漏的客户(“out-of-bag”)都被用作测试点,以估计上面报告的out-of-bag分类错误。

接下来,找出是否所有的特征对分类器的准确性都是重要的。通过打开特征重要性测量(OOBPredictorImportance),并绘制结果以直观地找到最重要的特性。现在尝试使用更多的树并存储分类错误,以便下面进行进一步的比较。

nTrees = 50;叶= 10;rng (savedRng);b = TreeBagger (nTrees, X, Y,“OOBPredictorImportance”,“上”,...“分类预测因素”6...“MinLeafSize”、叶);酒吧(b.OOBPermutedPredictorDeltaError)包含(的数字特征)ylabel('禁止特征重要性')标题(“功能重要性的结果”)

oobErrorFullX = oobError (b);

特性2.,4.6.从其他人中脱颖而出。功能4.,股本市值/总债务帐面价值(MVE_BVTD)是该数据集最重要的预测因子。这一比率与结构模型(如默顿模型)中信用可靠性的预测因子密切相关[5.,将公司的权益价值与未偿债务进行比较,以确定违约概率。

有关行业部门的信息,功能6.(行业),也比其他变量更重要,以评估该数据集的公司信誉。

虽然没有MVE_BVTD、特性2.,保留收入/总资产(RE_TA),从其他人中脱颖而出。保留收益与公司年龄之间存在相关性(一家公司所存在的时间越长,通常会累积的收入越多),而且公司的年龄又与其信誉相关(老年人倾向于更有可能在艰难时期生存)。

仅使用预测器拟合一个新的分类集成RE_TA,MVE_BVTD, 和行业.将其分类误差与使用所有特征的前一分类器进行比较。

X = [creditDS。RE_TAcreditDS。MVE_BVTDcreditDS。行业];rng(savedRng) b = TreeBagger(nTrees,X,Y,)“OOBPrediction”,“上”,...“分类预测因素”3,...“MinLeafSize”、叶);oobErrorX246 = oobError (b);情节(oobErrorFullX“b”) 抓住情节(oobErrorX246“r”)xlabel(“已生长树木的数量”)ylabel(“Out-of-bag分类错误”)({传奇'所有功能',“功能2、4、6”},'地点',“东北”)标题(“不同预测器组的分类错误”) 抓住离开

当您删除具有相对较低的特征时,分类的准确性不会显着恶化(1.,3., 和5.),因此您将使用更简洁的分类集成进行预测。

本例从一组只有6个特征开始,并使用分类器的特征重要性度量和包外分类误差作为标准来筛选3个变量。当初始的一组潜在预测器包含数十个变量时,特征选择可能是一个耗时的过程。除了这里使用的工具(变量重要性和外带错误的“视觉”比较),统计学和机器学习工具箱中的其他变量选择工具也可以帮助这些类型的分析。然而,最终,一个成功的特征选择过程需要定量工具和分析师的判断相结合。

例如,这里使用的变量重要性度量是一种排名机制,它通过测量当该特征的值被随机排列时,分类器的预测准确性下降的程度来估计特征的相对影响。其思想是,当有问题的特性对分类器的预测能力增加很少时,使用改变的(在本例中是排列的)值不应影响分类结果。另一方面,相关信息无法在不降低预测的情况下随机交换。现在,如果两个高度相关的特征是重要的,它们将在分析中排名很高。在这种情况下,保留这些特性中的一个就足以实现准确的分类,但仅从排名结果中是无法知道这一点的。你必须单独检查相关性,或者使用专家的判断。也就是说,像变量重要性之类的工具sequentialfs可以极大地帮助特征选择,但分析师的判断是这一过程中的关键部分。

此时,可以保存分类器(例如,保存分类器。垫b),在以后的会话中加载(负荷分类器)分类新客户。为效率,建议在培训过程完成后保持Complace的分类器版本。

b =紧凑(b);

分类新数据

使用以前构造的分类集合以为新客户分配信用评级。由于需要经常审查现有客户的评级,特别是当他们的财务信息大幅改变时,数据集还可以包含正在审查的现有客户清单。首先加载新数据。

newDS=可读(“CreditRating_NewCompanies.dat”);

要预测这些新数据的信用评级,请调用预测方法。该方法返回两个参数,预测的类和分类分数。您当然希望同时获得两个输出参数,因为分类分数包含关于预测评级的确定程度的信息。你可以复制变量RE_TA,MVE_BVTD行业成一个矩阵X,与以前一样,但由于您将只向预测,则可以跳过此步骤使用纽兹直接。

[predClass,classifScore]=predict(b[newDS.RE_TA newDS.MVE_BVTD newDS.Industry]);

此时,您可以创建一份报告。本例仅在屏幕上显示前三位客户的小报告,以供说明,但MATLAB部署工具可以极大地改进此处的工作流程。例如,信贷分析师可以使用web浏览器远程运行此分类,并获得一份报告,而无需进行任何修改在他们的桌面上有MATLAB。

I = 1:3 fprintf(“客户% d: \ n”,newds.id(i));流(' RE/TA = % 4.2 f\n'newDS.RE_TA(我));流(' MVE/BVTD = %5.2f\n'newDS.MVE_BVTD(我));流('行业=%2d \ n'newDS.Industry(我));流('预测等级:%s\n'我,predClass {});流('分类得分:\ n');J = 1:长度(B.Classnames)如果(classifScore(i,j)>0)fprintf(' %s: %5.4f \n', b.ClassNames {j}, classifScore (i, j));结束结束结束
60644年客户:
Re / Ta = 0.22
MVE / BVTD = 2.40
行业=6
预测评级:AA
分类得分:
A: 0.2349 aa: 0.7519 aaa: 0.0011 BBB: 0.0121
客户33083:
Re / Ta = 0.24
MVE/BVTD=1.51
行业=4
预测评级:BBB
分类得分:
A:0.1060 BBB:0.8940
63830年客户:
Re / Ta = 0.18
MVE / BVTD = 1.69
行业=7
预测评级:A
分类得分:
答:0.6305 AA:0.0172 AAA:0.0010 BBB:0.3513

保留预测评分和相应分数的记录对于定期评估分类器的质量是有用的。您可以将这些信息存储在表格数组predDS

classnames=b.classnames;predDS=[table(newDS.ID,predClass),array2table(classfscore)];predDS.Properties.VariableNames={“ID”,“PredRating”,一会{:}};

例如,可以将该信息保存到以逗号分隔的文本文件中PredictedRatings.dat使用命令

writetable (predDS PredictedRatings.dat);

或使用“数据库工具箱”直接写入数据库。

反向测试:分类过程分析

验证或者回测是分析或评估信用评级质量的过程。与此任务有许多不同的措施和测试(例如,参见巴塞尔银行监管委员会[2.])。在这里,这个例子集中于以下两个问题:

  • 与实际评级相比,预测评级的准确性如何?这里“预测评级”是指那些从自动分类过程,获得和实际评级分配信贷委员会将在一起预测评级及其分类分数,和其他的信息,比如新闻和经济状况来决定最终的评级。

  • 根据客户的信誉度,实际评级对他们的评级有多高?这是在事后例如,在一年后,当知道哪些公司在一年内违约时进行分析。

该文件CreditRating_ExPost.dat包含上一节中考虑的同一公司的“后续”数据。它包含委员会分配给这些公司的实际评级,以及一个“违约标志”,表明相应的公司是否在评级过程的一年内违约(如果1.)或不(如果)0).

exPostDS = readtable (“CreditRating_ExPost.dat”);

比较预测收视率和实际收视率。培训自动分类器的基本原理是加快信贷委员会的工作。预测评级越准确,委员会审查预测评级的时间就越少。因此,可以想象,委员会希望定期检查预测评级与最终评级的匹配程度分配并建议重新培训自动分类器(例如,可能包括新功能),如果不匹配似乎是相关的。

第一个可以用来比较预测评级和实际评级的工具是混乱矩阵,随时可用于统计和机器学习工具箱:

C = confusionchart (exPostDS.Rating predDS.PredRating);sortClasses (C, {“AAA”“AA”“一个”“BBB”“BB”“B”“CCC”})

行对应实际评级,列对应预测评级。头寸的数量(i, j)在混乱矩阵中表示有多少客户收到了实际的评级并被预测为评级J.例如,位置(3,2)告诉我们有多少客户被信用委员会评为“a”,但被自动分类器预测为“AA”。你也可以用百分比表示这个矩阵。通过具有相同真实评级的观察值的数量对每个值进行归一化。

C.normalization =.“row-normalized”;

预测和实际评级之间的良好一致性将导致主对角线上的值主导一行中的其他值,理想的值接近1..在这种情况下,你实际上可以看到一个关于“B”的重要分歧,因为大约一半被信用委员会评为“B”的客户被自动分类器预测为“BB”。另一方面,令人欣慰的是,除了“BBB”之外,大多数情况下评级相差最多一个等级。

混淆矩阵也可以用来比较机构分配的内部评级和第三方评级;在实践中经常这样做。

对于每个特定的评级,您可以计算预测和实际评级之间的一致性的另一个度量。你可以建立一个受试者工作特征(ROC)曲线使用perfcurve函数,并检查曲线下面积(AUC).的perfcurve函数将实际评分作为参数,实际评分是基准、您要比较的标准以及由自动化过程确定的“BBB”分类分数。构建ROC并计算本例中评级为“BBB”的AUC。

[xVal,yVal,~,auc]=性能曲线(暴露等级,预测值BBB,“BBB”); 绘图(xVal,yVal)xlabel('虚假阳性率')ylabel(“真阳性率”)文本(0.5,0.25,strcat (“AUC =”num2str (auc)),“EdgeColor”,“k”)标题(ROC曲线BBB,预测与实际评分)

这里是如何建立中华民国的解释。回想一下,对于每个客户,自动分类器将返回每个信用评级的分类评分,特别是对于“BBB”,这可以解释为该客户应该被评级为“BBB”的可能性有多大。为了构建ROC曲线,你需要改变分类阈值.也就是说,将客户分类为“BBB”的最低分数。换句话说,如果阈值是T,如果他们的“BBB”得分大于或等于,则只将客户归类为“BBB”T.例如,假设该公司XYZ.'BBB'得分为0.87。如果实际等级XYZ.(信息exPostDS。评级)则为BBBXYZ.将被正确地分类为“BBB”的任何阈值不超过0.87。这是一个真阳性,它会增加所谓的灵敏度的分类器。对于任何高于0.87的阈值,该公司将不会得到“BBB”评级,而你将得到一个假阴性为了完成描述,现在假设XYZ.的实际评级为“BB”。如果阈值超过0.87,则该评级将被正确地拒绝为“BBB”,成为“BBB”真正的负,从而增加了所谓的特异性的分类器。然而,当阈值达到0.87时,它将成为一个假阳性(它会被归类为“BBB”,而实际上是“BB”)。ROC曲线是通过绘制真阳性(敏感性)与假阳性(1-特异性)的比例来构建的,因为阈值不同01.

AUC,顾名思义,就是ROC曲线下的面积。离AUC越近1.,则分类器越精确(一个完美的分类器的AUC为1.).在本例中,AUC似乎已经足够高了,但是应该由委员会来决定评级的哪个AUC级别应该触发建议以改进自动分类器。

比较下一年的实际评级和违约情况。信用评级中隐含的一个常用的评估客户等级的工具是累积精度剖面(CAP),以及相关的精度比衡量。这样做的目的是衡量评级与次年观察到的违约数量之间的关系。人们可能会认为,评级越高,违约越少。如果所有评级的违约率都是一样的,那么评级系统将与一个幼稚(且无用)的分类系统没有什么不同。在这个分类系统中,客户被随机分配了一个评级,而不考虑他们的信用度。

不难看出perfcurve函数也可以用来构造CAP。与之相比的标准不是一个评级,而是从CreditRating_ExPost.dat文件。您使用的分数是一个“虚拟分数”,它表明在评级列表中隐含的信用等级。虚拟分数只需要满足较高的分数得到较低的虚拟分数(它们“不太可能有默认的标志1.“),并且任何两个具有相同评级的客户获得了相同的虚拟分数。当然,默认概率可以作为分数传递,但在此处没有默认概率,实际上是您无需对违约概率进行估计即可构建CAP,因为您没有验证默认概率。这个例子使用这个工具评估的是评级的好坏等级顾客根据他们的信誉。

通常,所考虑的评级体系的CAP是与“完善评级体系”的CAP一起绘制的。后者是一种假设的信用评级系统,最低评级包括所有违约者,而不包括其他客户。这条完美曲线下的面积是额定值系统所能达到的最大AUC。按照惯例,CAPs会调整AUC以减去下的面积天真的系统也就是随机给客户评级的系统的CAP。原始系统的CAP只是从原点到(1.,1.), AUC为0.5.的精度比对于评级系统,则定义为调整后的AUC(考虑中系统的AUC减去原始系统的AUC)与最大准确度(完美系统的AUC减去原始系统的AUC)的比率。

RatingsList = {“AAA”“AA”“一个”“BBB”“BB”“B”“CCC”};Nratings =长度(ratingsList);dummyDelta = 1 / (Nratings + 1);dummyRank = linspace (dummyDelta 1-dummyDelta Nratings) ';D = exPostDS.Def_tplus1;fracTotDef =和(D) /长度(D);maxAcc = 0.5 - 0.5 * fracTotDef;R =双(序数([],exPostDS.Rating ratingsList));S = dummyRank (R);[xVal yVal, ~, auc] = perfcurve (D S 1); accRatio = (auc-0.5)/maxAcc; fprintf('实际评级的精度比:%5.3f\n',比率);
实际评级的精度比:0.850
xPerfect (1) = 0;xPerfect (2) = fracTotDef;xPerfect (3) = 1;yPerfect (1) = 0;yPerfect (2) = 1;yPerfect (3) = 1;xNaive (1) = 0;xNaive (2) = 1;yNaive (1) = 0;yNaive (2) = 1; plot(xPerfect,yPerfect,“——k”xVal yVal,“b”xNaive yNaive,“同意”)xlabel(“占所有公司的比例”)ylabel(“违约公司的比例”)标题(“累积精度剖面图”)({传奇“完美的”,“实际”,“天真”},'地点','东南')文本(xVal (2) + 0.01, yVal -0.01 (2),“CCC”)文本(xVal(3)+0.01,yVal(3)-0.02,“B”)文本(xVal (4) + 0.01, yVal -0.03 (4),“BB”)

读取帽子信息的关键是在“扭结”中,标记为评级'CCC,''B,'和'BB的曲线。例如,第二个扭结与第二级最低评级'B,'相关联,它位于(0.097,0.714).这意味着9.7%的客户排名“B”或更低在观察到的违约中,他们占了71.4%。

一般来说,精度比应作为一个相对的度量,而不是一个绝对的度量。例如,您可以在同一图中添加预测评级的CAP,并计算其准确率,以与实际评级的准确率进行比较。

弹性分组环=双(序数(predDS.PredRating, [], ratingsList));传播= dummyRank (rpr);[xValPred yValPred, ~, aucPred] = perfcurve (D,传播,1);accRatioPred = (aucpred - 0.5) / maxAcc;流(“预测评级的准确率:%5.3f\n”,accratiopred);
预测评分准确率:0.811
绘图(xPerfect、yPerfect、,“——k”xVal yVal,“b”xNaive yNaive,“同意”,...xValPred yValPred,“:r”)xlabel(“占所有公司的比例”)ylabel(“违约公司的比例”)标题(“累积精度剖面图”)({传奇“完美的”,“实际”,“天真”,'预料到的'},'地点','东南')

预测评级的正确率较小,其CAP大多低于实际评级的CAP。这是合理的,因为实际评级是由考虑到预测评级的信用委员会分配的额外的信息可能对调整评级很重要。

最后的评论

MATLAB提供了广泛的机器学习工具,除了袋装决策树,可以在信用评级的背景下使用。在统计学和机器学习工具箱中,你可以找到分类工具,如判别分析和朴素贝叶斯分类器。MATLAB还提供了深度学习工具箱™。此外,数据库工具箱和MATLAB部署工具可以为您提供更灵活的工作流程,以适应您自己的偏好和需求。

这里没有计算默认概率。对于信用评级,通常根据信用评级迁移历史计算默认概率。看看transprob(金融工具箱)有关更多信息,请参考Financial Toolbox™中的参考页面。

参考文献

[1]奥特曼,E。《财务比率、判别分析与企业破产预测》。金融杂志.第23卷第4期(1968年9月),第589-609页。

[2]巴塞尔银行监管委员会。《内部评级系统的验证研究》国际清算银行,工作文件第14号,修订版,2005年5月。可以在:https://www.bis.org/publ/bcbs_wp14.htm

[3]巴塞尔银行监管委员会。资本计量和资本标准的国际趋同:修订框架国际清算银行(BIS),综合版,2006年6月。可以在:https://www.bis.org/publ/bcbsca.htm

G.吕弗勒和P. N.波许。基于Excel和VBA的信用风险建模.英格兰西苏塞克斯:威利金融,2007。

[5] Merton,R。“关于公司债务的定价:利率风险结构。”金融杂志.卷。29,2,(5月,1974),第449-70页。