主要内容

采用套袋决策树进行信用评级

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

信用风险管理中的基本任务之一是为借款人分配信用额度。等级用于根据他们的感知信誉排列客户:更好的成绩意味着较低的客户风险程度;类似的等级意味着类似的风险水平。等级分为两类:信用评级和信用评分。信用评级是少数离散类,通常用字母标记,如“AAA”,“BB-”等。信用评分是数字等级,如“640”或“720”。信用等级是监管框架中的关键要素之一,如巴塞尔II(见巴塞尔银行监管委员会[3])。

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

有评级机构跟踪公司的信誉。然而,大多数银行制定内部方法,为客户分配信用等级。根据评级机构未评估客户,在内部评级客户可能是必需品,但即使存在第三方评级,内部评级也提供对客户风险概况的补充评估。

这个例子展示了MATLAB®如何帮助信用评级过程的自动化阶段。特别是,我们利用了统计学和机器学习工具箱™中现成的统计学习工具之一,一种称为a的分类算法袋装决策树

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

现有的历史数据是起点,它用于火车将自动进行信用评级的袋装决策树。在统计学习的词汇表中,这种训练过程属于监督式学习.然后使用分类器将评级分配给新客户。在实践中,这些自动或预测评级很可能被认为是暂时的,直到一个由专家组成的信用委员会审查它们。我们在这里使用的分类器类型也可以促进这些评级的修订,因为它为预测评级提供了确定性的衡量,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是五个财务比率,以及行业标签。行业是一个分类变量,义务事实上,因为在工业部门没有秩序。反应变量,信用评级,也是绝对的,尽管这是一个序数变量,因为,根据定义,额定值意味着一个排名的良好信誉。我们可以使用这个变量“as is”来训练我们的分类器。这里我们选择将它复制到有序数组因为这种方式,输出处于评级的自然顺序中,更容易阅读。评级的排序由小区阵列建立,我们作为定义中的第三个论点Y.信用评级也可以映射为数值,这对于尝试替代方法来分析数据(例如,回归)是有用的。建议在实践中尝试不同的方法。

X = [creditDS。WC_TA creditDS。RE_TA creditDS。EBIT_TA creditDS。MVE_BVTDcreditds.s_ta creditds.industry];Y =序数(Credits.rating);

我们使用预测器X和响应Y为了适应一种叫做袋装决策树.“Bagging”在这个上下文中代表“引导聚合”。该方法包括生成若干子样本,或引导副本,从数据集。这些子样本是随机生成的,从数据集中的客户列表中进行抽样并进行替换。对于每个副本,将生成一棵决策树。每棵决策树都是经过训练的分类器,可以单独用于对新客户进行分类。不过,对于从两个不同的自举复制体中生长出的两棵树的预测可能是不同的。的合奏聚合为所有引导副本生成的所有决策树的预测。如果大多数树预测一个新客户的特定类,那么认为该预测比单独预测任何一棵树更健壮是合理的。此外,如果一个不同的类是由一组更小的树预测的,这个信息也是有用的。事实上,树木的比例预测不同的类别是基础分类的分数在分类新数据时由集合报告。

建造树袋机

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

Leaf = [1 5 10];nTrees = 25;rng (9876“旋风”);savedRng =提高;%保存当前RNG设置颜色=“bgr”2 = 1:长度(叶)%重新初始化随机数发生器,以便每个叶子尺寸的%随机样本相同rng (savedRng)%为每个叶子尺寸和绘制袋装创建一个袋装决策树%错误'ooberror'b = treebagger(ntree,x,y,“OOBPrediction”“上”“CategoricalPredictors”6“MinLeafSize”、叶(ii));情节(oobError (b)、颜色(ii))结束Xlabel(“已长成的树的数量”)ylabel('袋袋分类错误') 传奇({' 1 '“5”“十”},'地点''东北') 标题(“不同叶片尺寸的分类误差”)举行

对于三个叶大小选项,错误是可以比较的。因此,我们将使用叶子大小为10的树,因为它会使树更瘦,计算效率更高。

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

接下来,我们想了解所有功能是否对我们分类器的准确性很重要。我们通过打开来这样做功能的重要性措施 (OOBPredictorImportance),并绘制结果以直观地找到最重要的特性。我们现在还尝试了更多的树,并存储分类错误,以便下面进行进一步的比较。

ntree = 50;叶= 10;RNG(Savedrng);b = treebagger(ntree,x,y,'Oobpredictorimportance'“上”“CategoricalPredictors”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_ta creditds.mve_bvtd creditds.industry];rng(savedrng)b = treebagger(ntrees,x,y,“OOBPrediction”“上”“CategoricalPredictors”,3,“MinLeafSize”、叶);Ooberrorx246 = Ooberror(b);情节(Ooberrorfullx,“b”)举行情节(oobErrorX246“r”)xlabel(“已长成的树的数量”)ylabel('袋袋分类错误') 传奇({的所有功能“功能2、4、6”},'地点''东北') 标题(“不同预测器组的分类错误”)举行

当我们删除重要性相对较低的特征(1、3和5)时,分类的准确性不会显著下降,因此我们将使用更精简的分类集成来进行预测。

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

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

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

b =紧凑(b);

分类新数据

这里,我们使用前面构建的分类集成来为新客户分配信用评级。由于对现有客户的评级也需要定期进行审查,特别是当他们的财务信息发生重大变化时,数据集还可以包含审查中的现有客户的列表。我们从加载新数据开始。

newDS = readtable ('信用_newcompanies.dat');

为了预测这种新数据的信用评级,我们称之为预测方法。该方法返回两个参数,预测的类和分类分数。我们当然希望得到两个输出参数,因为分类分数包含了预测评级的确定性。我们可以复制变量re_ta.MVE_BVTD行业成一个矩阵X,但由于我们将只打一次电话给预测,我们可以跳过这一步,使用newDS直接。

[predClass, classifScore] =预测(b, [newDS。RE_TA newDS。MVE_BVTDnewDS.行业]);

此时,我们可以创建一个报告。在这里,我们只显示在屏幕上为前三名客户的一份小报告,出于插图目的,但Matlab部署工具可以大大改善这里的工作流程。例如,信用分析师可以使用Web浏览器远程运行此分类,并获取报告,而无需在其桌面上具有MATLAB。

I = 1:3 fprintf('客户%d:\ n'newDS.ID(我));流('重新/ ta =%5.2f \ n',newds.re_ta(i));流('mve / bvtd =%5.2f \ n',newds.mve_bvtd(i));流('行业=%2d \ n'newDS.Industry(我));流('预测等级:%s\n'我,predClass {});流('分类得分:\ n');j = 1:长度(b.ClassNames)如果(classifScore (i, j) > 0)流(' %s: %5.4f \n', b.ClassNames {j}, classifScore (i, j));结束结束结束
客户60644:RE / TA = 0.22 MVE / BVTD = 2.40行业= 6预测评级:AA分类评分:A:0.2874 AA:0.0156 BBB:0.0156 BBB:0.0051客户33083:RE / TA = 0.24 MVE / BVTD = 1.51行业=4预测评级:BBB分类评分:A:0.0751 BB:0.0017 BBB:0.9232客户63830:Re / Ta = 0.18 MVE / BVTD = 1.69行业= 7预测评级:分类评分:A:0.0629 AA:0.0067 B:0.0067 B:0.0008 BB:0.0005 BBB:0.3291

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

一会= b.ClassNames;predDS =[表(newDS.ID predClass) array2table (classifScore)];predDS.Properties.VariableNames = {“ID”'预测',classnames {:}};

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

可编程(Predds,'predightratings.dat');

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

反向测试:分类过程分析

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

  • 与实际评级相比,预测评级有多准确?这里“预测评级”是指从自动分类过程中获得的那些,并将“实际额定值”与信贷委员会分配的“实际评级”,以汇总预测的评级及其分类分数以及其他信息,例如新闻和国家经济确定最终评级。

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

该文件CreditRating_ExPost.dat包含上一节中考虑的同一公司的“跟进”数据。它包含委员会分配给这些公司的实际评级,以及指示相应公司是否违约的“默认标志”(如果是1)或不违约(如果为0)。

exPostDS = readtable (“CreditRating_ExPost.dat”);

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

我们可以用来比较预测的与实际评级的第一个工具是一个混淆矩阵,现成的统计和机器学习工具箱:

c = confusionchart(expostds.rating.rating,predds.predrating);SortClasses(C,{“AAA”“AA”“一个”'BBB'“BB”“B”'CCC'})

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

C.Normalization ='行标准化'

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

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

对于每个特定评级,我们可以计算预测和实际评级之间的另一项协议衡量标准。我们可以建立一个受试者工作特征(ROC)曲线使用灌注函数,并检查曲线下面积(AUC).的灌注函数以实际的评分作为参数,这是我们的基准,我们比较的标准,以及由自动化过程确定的“BBB”分类分数。在我们的例子中,让我们构建一个ROC并计算评级“BBB”的AUC。

[xVal yVal, ~, auc] = perfcurve (exPostDS.Rating predDS.BBB,'BBB');情节(xVal yVal)包含(的假阳性率)ylabel(“真阳性率”)文本(0.5,0.25,strcat (“AUC =”num2str (auc)),“EdgeColor”'K') 标题('ROC Curve BBB,预测与实际评级'

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

AUC,顾名思义,就是ROC曲线下的面积。AUC是越接近1,更准确的分类器(1)的一个完美的分类器会有AUC。在这个例子中,AUC似乎足够高,但是它将由委员会决定的AUC级别评级应该触发一个建议来提高自动分类器。

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

不难看出灌注功能也可用于构造帽。我们反对的标准不是一个评级,如前所述,但我们从中加载的默认标志CreditRating_ExPost.dat文件。我们使用的分数是一个“虚拟分数”,它表明了评级列表中隐含的信用等级。虚拟评分只需要满足以下条件:评分越高的客户得到的虚拟评分越低(他们“不太可能有默认值为1的标志”),以及任何两个评分相同的客户得到的虚拟评分相同。当然,违约概率可以作为分数传递,但我们这里没有违约概率我们不需要估算违约概率来构建CAP,因为我们没有验证默认概率。我们与此工具评估的所有都是评级的程度排名顾客根据他们的信誉。

通常,所考虑的评级系统的盖子与“完美评级系统”的盖子一起绘制在一起。后者是一个假设的信用评级系统,最低评级包括所有违规者,也没有其他客户。这种完美曲线下的区域是评级系统可实现的最大可能的AUC。按照惯例,调整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', accRatio);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(2)-0.01,'CCC')文本(xVal (3) + 0.01, yVal -0.02 (3),“B”)文本(XVAL(4)+ 0.01,YVAL(4)-0.03,“BB”
实际评级的精度比:0.850

解读CAP信息的关键是“纠结”,在图中标记为“CCC”、“B”和“BB”。例如,第二个扭结与第二个最低等级‘B’相关联,它位于(0.097,0.714)。这意味着9.7%的客户排名“B”或更低在观察到的违约中,他们占了71.4%。

通常,精度比应作为相对,而不是绝对措施。例如,我们可以在相同的曲线中添加预测的额定值的帽,并计算其精度比以将其与实际额定值的精度比进行比较。

弹性分组环=双(序数(predDS.PredRating, [], ratingsList));传播= dummyRank (rpr);[xValPred yValPred, ~, aucPred] = perfcurve (D,传播,1);accRatioPred = (aucpred - 0.5) / maxAcc;流(“预测评级的准确率:%5.3f\n”, accRatioPred);情节(xPerfect yPerfect,“——k”xVal yVal,“b”xNaive yNaive,“同意”xValPred yValPred,':R')xlabel('所有公司的一小部分')ylabel('违约公司的一小部分') 标题(“累积准确性概要”) 传奇({“完美的”'实际的'“天真的”“预测”},'地点'“东南”
预测评级的准确率:0.830

预测额定值的精度比较小,其帽大部分低于实际额定值的盖子。这是合理的,因为实际的评级由参考资料分配,以考虑预测的评级额外的信息,可以微调评级。

最终言论

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

这里没有计算违约概率。对于信用评级,违约概率通常是根据信用评级迁移历史计算的。看到Transprob.Financial Toolbox™中的参考页面,以获取更多信息。

参考书目

[1] Altman,E.,“财务比率,判别分析和企业破产预测”金融杂志,第23卷第4期(1968年9月),第589-609页。

[2]银行业监督委员会,“关于内部评级系统验证的研究,国际住区银行(BIS),工作文件第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.,《企业债务定价:利率的风险结构》,金融杂志, Vol. 29, No. 2, (May, 1974), pp. 449-70。