主要内容

套袋决策树的信用评级

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

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

分配信用等级涉及分析借款人的信息。如果借款人是个人,感兴趣的信息可能是个人的收入、未偿债务(抵押贷款、信用卡)、家庭规模、居住状况等。对于公司借款人,可以考虑某些财务比率(例如,销售额除以总资产)、行业等。在这里,我们将这些关于借款人的信息片段称为特性预测。不同的机构使用不同的预测指标,它们也可能有不同的评级类别或评分范围来对客户进行排名。对于提供给大量潜在借款人的相对较小的贷款(例如,信用卡),通常使用信用评分,并且对借款人进行评级的过程通常是自动化的。对于中小型公司和大型公司可以获得的较大贷款,通常使用信用评级,评级过程可能涉及自动算法和专家分析的结合。

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

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

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

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

在实践中,首先需要训练一个分类器,然后用它来给新客户分配信用评级,最后还需要配置文件评估质量或者分类器的准确性,这个过程也称为验证历史。我们还讨论了一些现成的反向测试工具。

加载现有的信用评级数据

我们从逗号分隔的文本文件中加载历史数据CreditRating_Historical.dat。这里我们选择使用文本文件,但是可以访问Database Toolbox™的用户当然可以直接从数据库加载这些信息。

该数据集包含企业客户列表的财务比率、行业部门和信用评级。这是模拟数据,不是真实数据。第一列是客户ID。然后我们有五列财务比率。这些比率与Altman的z-score相同(参见Altman b[1];参见Loeffler和Posch bbb的相关分析)。

  • 营运资金/总资产(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 =[信用]。WC_TA creditDS。RE_TA creditDS。EBIT_TA creditDS。MVE_BVTDcreditDS。S_TA creditDS.Industry];Y =序数(creditDS.Rating);

我们使用预测器X他们的反应是Y以适应称为a的特定类型的分类集成套袋决策树。在这个上下文中,“Bagging”代表“bootstrap aggregation”。该方法包括生成一些子样本,或引导副本,从数据集中。这些子样本是随机生成的,从数据集中的客户列表中进行替换采样。对于每个副本,将生成一棵决策树。每个决策树都是经过训练的分类器,可以单独用于对新客户进行分类。然而,从两个不同的引导副本中生长的两棵树的预测可能会有所不同。的合奏聚合所有的决策树的预测是为所有的自举副本生长的。如果大多数树预测了新客户的一个特定类别,那么可以合理地认为该预测比任何单个树的预测更健壮。此外,如果一个不同的类是由一个较小的树集预测的,那么这个信息也是有用的。事实上,预测不同类别的树的比例是分类的分数在对新数据进行分类时由集成报告。

造树装袋机

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

叶= [1 5 10];nTrees = 25;rng (9876“旋风”);savedRng = rng;%保存当前RNG设置颜色=“bgr”Ii = 1:长度(叶)重新初始化随机数生成器,以便%的随机样本对于每个叶片大小都是相同的rng (savedRng)为每个叶子大小创建一个袋装决策树,并绘制袋外图% error ' ooerror 'b = TreeBagger(n树,X,Y,“OOBPrediction”“上”“CategoricalPredictors”6“MinLeafSize”、叶(ii));情节(oobError (b)、颜色(ii))结束包含(“已长成树木的数量”) ylabel (“袋外分类错误”)({传奇' 1 '“5”“十”},“位置”“东北”)标题(“不同叶片大小的分类误差”)举行

三种叶子大小选项的误差是相当的。因此,我们将使用叶子大小为10的树,因为它会产生更精简的树和更高效的计算。

注意,我们不必将数据拆分为培训测试子集。这是在内部完成的,它隐含在作为方法基础的抽样过程中。在每次引导迭代中,引导副本是训练集,任何遗漏的客户(“袋外”)被用作测试点,以估计上面报告的袋外分类错误。

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

nTrees = 50;叶= 10;rng (savedRng);b = TreeBagger(n树,X,Y,“OOBPredictorImportance”“上”“CategoricalPredictors”6“MinLeafSize”、叶);酒吧(b.OOBPermutedPredictorDeltaError)包含(的数字特征) ylabel (“外袋功能重要性”)标题(“功能重要性结果”) oobErrorFullX = oobError(b);

功能2,4和6从其余的脱颖而出。特征4、权益市值/总负债账面价值(MVE_BVTD),是该数据集最重要的预测因子。这一比率与结构模型中的信用预测指标密切相关,例如Merton的[5]模型,该模型将公司的股本价值与其未偿债务进行比较,以确定违约概率。

业界资讯,专题六(行业),在评估该数据集的公司信誉方面,相对而言也比其他变量更重要。

虽然不如。重要MVE_BVTD,特征二,留存收益/总资产(RE_TA),从中脱颖而出。留存收益和公司成立时间之间存在相关性(一般来说,公司成立时间越长,积累的收益越多),反过来,公司成立时间与其信誉相关(较老的公司往往更有可能在艰难时期生存下来)。

让我们只使用预测器拟合一个新的分类集合RE_TAMVE_BVTD,行业。我们将其分类误差与之前使用所有特征的分类器进行比较。

X =[信用]。RE_TAcreditDS。MVE_BVTDcreditDS。行业]; rng(savedRng) b = TreeBagger(nTrees,X,Y,“OOBPrediction”“上”“CategoricalPredictors”3,“MinLeafSize”、叶);oobErrorX246 = oobError(b);情节(oobErrorFullX“b”)举行情节(oobErrorX246“r”)包含(“已长成树木的数量”) ylabel (“袋外分类错误”)({传奇的所有功能“特征2、4、6”},“位置”“东北”)标题(“不同预测器集的分类误差”)举行

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

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

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

此时,可以保存分类器(例如:保存分类器。垫b),以便在以后的会话中加载(负荷分类器)对新客户进行分类。为了提高效率,建议在训练过程完成后保留一个紧凑版本的分类器。

B = compact(B);

新数据分类

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

newDS = readtable(“CreditRating_NewCompanies.dat”);

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

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

此时,我们可以创建一个报告。这里,为了说明目的,我们只在屏幕上显示前三个客户的一个小报告,但是MATLAB部署工具可以极大地改善这里的工作流程。例如,信用分析师可以使用web浏览器远程运行这种分类,并获得报告,甚至不需要在桌面上安装MATLAB。

I = 1:3 fprintf()“客户% d: \ n”newDS.ID(我));流(' RE/TA = %5.2f\n'newDS.RE_TA(我));流(' MVE/BVTD = %5.2f\n'newDS.MVE_BVTD(我));流('行业= %2d\n'newDS.Industry(我));流(“预测评分:%s\n”我,predClass {});流(分类分数:\n);j = 1:length(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分类得分:答:0.2874 AA: 0.6919 AAA级:0.0156 BBB: 33083年0.0051客户:RE / TA = 0.24 MVE BVTD = 4 = 1.51行业预测评级:BBB分类得分:答:0.0751 BB: 0.0017 BBB: 63830年0.9232客户:RE / TA = 0.18 MVE BVTD = 1.69 = 7预测评级:分类得分:答:0.6629 AA: 0.0067 B: 0.0008 BB: 0.0005 BBB: 0.3291

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

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

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

writetable (predDS PredictedRatings.dat);

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

反向测试:分析分类过程

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

  • 与实际收视率相比,预测的收视率有多准确?这里的“预测评级”是指从自动分类过程中获得的评级,而“实际评级”是指由信用委员会分配的评级,该委员会将预测评级及其分类得分,以及新闻和经济状况等其他信息结合在一起,以确定最终评级。

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

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

exPostDS = readtable(“CreditRating_ExPost.dat”);

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

我们可以用来比较预测和实际评级的第一个工具是混淆矩阵,随时可以在统计学和机器学习工具箱中获得:

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

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

C.Normalization =“row-normalized”

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

混淆矩阵还可用于比较机构分配的内部评级与第三方评级;这在实践中经常是这样做的。

对于每个特定的评级,我们可以计算预测和实际评级之间的一致性的另一个度量。我们可以建立一个受试者工作特性(ROC)曲线使用perfcurve函数,并检查曲线下面积。的perfcurve函数将实际评级作为参数,即我们的基准,我们正在比较的标准,以及由自动化过程确定的“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曲线BBB,预测与实际评级

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

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

比较下一年的实际评级和违约率。用于评估信用评级中隐含的客户排名的常用工具是累积精度曲线(CAP),以及相关的精度比衡量。其理念是衡量所分配的信用评级与次年观察到的违约数量之间的关系。人们会认为,对于评级更好的类别,违约率会更低。如果所有评级的违约率都是相同的,那么评级系统将与一个天真的(而且无用的)分类系统没有什么不同,在这个分类系统中,客户被随机分配一个评级,独立于他们的信誉。

不难看出,perfcurve函数也可用于构造CAP。与前面一样,我们比较的标准不是评级,而是从CreditRating_ExPost.dat文件。我们使用的分数是一个“虚拟分数”,它表示评级列表中隐含的信誉排名。虚拟分数只需要满足较好的评分得到较低的虚拟分数(它们“不太可能有默认标志为1”),并且具有相同评分的任何两个客户得到相同的虚拟分数。当然,违约概率可以作为分数通过,但我们这里没有违约概率,事实上我们不需要估计违约概率来构建CAP,因为我们没有验证违约概率。我们用这个工具评估的是评分的好坏排名客户根据他们的信誉。

通常,所考虑的评级体系的CAP与“完美评级体系”的CAP一起绘制。后者是一种假设的信用评级系统,其最低评级包括所有违约者,而不包括其他客户。这条完美曲线下的面积是评级系统可能达到的最大AUC。按照惯例,AUC调整为CAPs以减去底部的面积天真的系统的CAP,即随机给客户分配评级的系统的CAP。朴素系统的CAP只是从原点到(1,1)的一条直线,AUC为0.5。的精度比然后定义为调整后的AUC(考虑系统的AUC减去朴素系统的AUC)与最大精度(完美系统的AUC减去朴素系统的AUC)之比。

ratingsList = {“AAA”“AA”“一个”“BBB”“BB”“B”“CCC”};Nratings = length(ratingsList);dummyDelta = 1/(Nratings+1);dummyRank = linspace(dummyDelta,1-dummyDelta,Nratings)';D = exPostDS.Def_tplus1;fracTotDef = sum(D)/length(D);maxAcc = 0.5 - 0.5 * fracTotDef;R = double(ordinal(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) = 0yPerfect(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,“同意”)包含(“占所有公司的一小部分”) ylabel (“违约公司比例”)标题(“累积准确度概览”)({传奇“完美的”“实际”“天真的”},“位置”“东南”)文本(xVal (2) + 0.01, yVal -0.01 (2),“CCC”)文本(xVal (3) + 0.01, yVal -0.02 (3),“B”)文本(xVal (4) + 0.01, yVal -0.03 (4),“BB”
实际评级的准确率:0.850

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

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

Rpred = double(ordinal(predd . predrating,[],ratingsList));Spred = dummyRank(Rpred);[xValPred,yValPred,~,aucPred] = perfcurve(D,Spred,1);accRatioPred = (aucPred-0.5)/maxAcc;流(预测评级的准确率:%5.3f\n, accRatioPred);情节(xPerfect yPerfect,“——k”xVal yVal,“b”xNaive yNaive,“同意”xValPred yValPred,“:r”)包含(“占所有公司的一小部分”) ylabel (“违约公司比例”)标题(“累积准确度概览”)({传奇“完美的”“实际”“天真的”“预测”},“位置”“东南”
预测评分准确率:0.830

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

最后的评论

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

这里没有计算违约的概率。对于信用评级,违约概率通常是基于信用评级迁移历史计算的。看到transprob有关更多信息,请参阅Financial Toolbox™中的参考页面。

参考书目

[10]刘建军,“财务比率、判别分析与企业破产预测”,《金融科学》,第4期。金融杂志《马克思主义》第二十三卷第四号(一九六八年九月),第一五八九—六零九页。

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

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

bbb10吕弗勒,G.和P. N.波施,运用Excel和VBA进行信用风险建模,英国西苏塞克斯:Wiley Finance, 2007。

“公司债务的定价:利率的风险结构”,《金融时报》。金融杂志《马克思主义》第二十九卷第二期(一九七四年五月),第一四九至第一七九页。