强调使用消费信贷违约概率的测试面板数据

这个示例展示了如何使用消费者(零售)信用面板数据来可视化不同水平上观察到的违约率。它还展示了如何拟合一个模型来预测违约概率并进行压力测试分析。

消费者贷款的面板数据集使您可以识别不同年龄的贷款的默认速率模式,或书籍上的年。您可以使用有关分数组的信息来区分不同分数级别的默认费率。此外,您还可以使用宏观经济信息来评估经济状况如何影响消费者贷款违约率。

采用标准logistic回归模型(一种广义线性模型)对零售信贷面板数据进行拟合。这个例子描述了如何拟合一个更高级的模型来解释面板数据效应,一个广义线性混合效应模型。然而,对于本例中的数据集,面板效应是可以忽略的,标准逻辑模型更适合于效率。

标准逻辑回归模型预测的书全部得分级别违约概率年,宏观经济变量的情况。当标准逻辑回归模型被用于压力测试分析,该模型预测的不良和严重不利的宏观经济情景默认对于给定的基线概率,以及默认概率。

有关更多信息,请参阅示例用Cox比例风险模型违约率,这遵循相同的工作流程,但使用Cox回归而不是逻辑回归,还有有关终身PD和寿命预期信用损失(ECL)计算的其他信息。

面板数据描述

主数据组(数据)包含以下变量:

  • ID:贷款标识符。

  • ScoreGroup:信用评分在贷款,离散成三组的开头:高的风险中等风险, 和低风险

  • 小无赖:年的书。

  • 默认:默认指标。这是响应变量。

  • 一年: 公历年。

还有一个小数据集(dataMacro)及相应历年的宏观经济数据:

  • 一年: 公历年。

  • 国内生产总值:国内生产总值增长(年同比)。

  • 市场:市场回报率(同比)。

变量小无赖一年国内生产总值, 和市场在相应的历年年底被观察到。该评分组是原始的信用评分的离散时贷开始。的价值1为了默认表示该贷款在相应的日历年度违约。

还有第三个数据集(dataMacroStress),以及宏观经济变量的基线、不利和严重不利情景。该表用于压力测试分析。

本示例使用模拟数据,但同样的方法已成功应用于真实数据集。

加载面板数据

加载数据并查看表的前10行和后10行。面板数据是堆叠的,在某种意义上,相同ID的观测数据存储在连续的行中,创建了一个又高又薄的表。这个小组是不平衡的,因为不是所有的id都有相同数量的观察。

加载RetailcreditPaneldata.mat.流('\ n第一十行:\ n'
第十行:
DISP(数据(1:10,:))
ID ScoreGroup YOB默认年__ ___________ ___ _______ ____ 1低风险1 0 1997 1低风险2 0 1998 1低风险3 0 1999 1低风险4 0 2000 1低风险5 0 2001 1低风险6 0 2002 1低风险70 2003 1低风险8 0 2004 2中等风险1 0 1997 2中等风险2 0 1998
流(“最后的10行:\ n”
最后的10行:
DISP(数据(端9:端,:))
ID ScoreGroup YOB默认年_____ ___________ ___ _______ ____ 96819高风险6 0 2003 96819高风险7 0 2004 96820中等风险1 0 1997 96820中等风险2 0 1998 96820中等风险3 0 1999 96820中等风险4 0 2000 96820中等风险50 2001年96820中等风险6 0 2002 96820中等风险7 0 2003 96820中等风险8 0 2004年
nrows =高度(数据);uniqueids =唯一(data.id);nids = length(uniqueids);流(' id总数:%d\n'nIDs)
id总数:96820
流('总的行数:%d \ n'nRows)
行总行数:646724

按记分组和书籍年数计算的违约率

使用信用评分组作为分组变量,以计算每个分数组的观察到的默认速率。为此,使用groupsummary函数来计算均值的默认变量,分组ScoreGroup多变的。绘制线图上的结果。正如预期的那样,违约率下降的信用质量得到改善。

DefRateByScore = groupsummary(数据,'ScoreGroup''意思'“默认”);numcoregroups =高度(defratebyscore);disp(defratebyscore)
ScoreGroup GroupCount mean_Default ___________ __________ ____________高风险2.0999e + 05 0.017167中等风险2.1743e + 05 0.0086006低风险2.193e + 05 0.0046784
图;栏(双(DefRateByScore.ScoreGroup) DefRateByScore.mean_Default * 100)组(gca),'XTickLabel',类别(data.ScoreGroup))标题(“违约率与评分组”)xlabel(“分数组”)ylabel(“观察到的默认率(%)”网格)

接下来,按年份分组计算图书的违约率(用小无赖多变的)。所得到的利率条件一年的违约率。例如,第三年违约率的书籍是相对于那些在投资组合过去,第二年贷款的贷款数量在第三年拖欠的比例。换句话说,第三年的违约率是行与号码小无赖3.默认= 1,除以有小无赖3.

绘制的结果。有一个明显的下降趋势,违约率下降为年书的数量增加。年三,四有类似的违约率。然而,正是从这个情节尚不清楚这是否是贷款产品的特性或者宏观经济环境的影响。

DefRateByYOB = groupsummary(数据,“小无赖”'意思'“默认”);numyob =高度(defratebyyob);DISP(DEFRATEYYOB)
YOB GroupCount mean_Default ___ __________ ____________ 1 96820 0.017507 2 94535 0.012704 3 92497 0.011168 4 91068 0.010728 5 89588 0.0085949 6 88570 0.006413 7 61689 0.0033231 8 31957 0.0016272
图;图(双(DefRateByYOB.YOB),DefRateByYOB.mean_Default * 100,“- *”)标题(“违约率vs.年数”)xlabel(“书籍年”)ylabel(“观察到的默认率(%)”网格)

现在,既集成绩集团和书籍数年限,然后绘制结果。剧情表明,随着时间的推移,所有得分组都会表现出类似的趋势。三年和四年级是下行趋势的例外:速度平坦高的风险组,第三年上升低风险组。

DefRateByScoreYOB = groupsummary(数据,{'ScoreGroup'“小无赖”},'意思'“默认”);%显示输出表,以显示它的结构%为了简洁,只显示前10行DISP(DefRateByScoreYOB(1:10,:))
ScoreGroup YOB GroupCount mean_Default ___________ ___ __________ ____________高风险1 32601 0.029692高风险2 31338 0.021252高风险3 30138 0.018448高风险4 29438 0.018276高风险5 28661 0.014794高风险6 28117 0.011168高风险7 19606 0.0056615高风险8 10094 0.0027739中等风险1 32373 0.014302中等风险2 31775 0.011676
disp (“……”
......
DefRateByScoreYOB2 =重塑(DefRateByScoreYOB.mean_Default,......NumYOB NumScoreGroups);图;图(DefRateByScoreYOB2 * 100,“- *”)标题(“违约率vs.年数”)xlabel(“书籍年”)ylabel(“观察到的默认率(%)”)图例(类别(data.ScoreGroup))格

年图书对战历年

这些数据包括三个组别,即年份:1997年、1998年和1999年开始的贷款。面板数据中没有贷款是在1999年以后开始的。

本节显示如何单独可视化每个群组的默认速率。所有队列的违约率都绘制,无论是对书籍和历年的年数。图书上的模式书籍建议贷款产品特征。日历年来的模式表明了宏观经济环境的影响。

从两年到四年来看,曲线为三个队列显示了不同的模式。然而,当绘制日历年时,三个队列从2000年至2002年显示出类似的行为。该期间曲线达到平坦。

%获取ID的1997年,1998年和1999年的同伙IDs1997 = data.ID(data.YOB == 1&data.Year == 1997);IDs1998 = data.ID(data.YOB == 1&data.Year == 1998);IDs1999 = data.ID(data.YOB == 1&data.Year == 1999);% IDs2000AndUp未使用,计算它只是为了显示它是空的,1999年后%没有贷款IDs2000AndUp = data.ID(data.YOB == 1&data.Year> 1999);%分别获得每个队列的默认率obsdefrate1997 =组ummary(数据(ismember(data.id,ids1997),:),......“小无赖”'意思'“默认”);obsdefrate1998 =组ummary(数据(ismember(data.id,ids1998),:),......“小无赖”'意思'“默认”);ObsDefRate1999 = groupsummary(数据(ismember (data.ID IDs1999):),......“小无赖”'意思'“默认”);对书上的多年%剧情图;情节(ObsDefRate1997.YOB ObsDefRate1997.mean_Default * 100,“- *”) 抓住图(ObsDefRate1998.YOB,ObsDefRate1998.mean_Default * 100,“- *”)情节(ObsDefRate1999.YOB ObsDefRate1999.mean_Default * 100,“- *”) 抓住离开标题(“违约率vs.年数”)xlabel(“书籍年”)ylabel(的违约率(%)) 传奇(“组群97”“队列98”“组群99”网格)

%与历年相对照年份=唯一的(data.Year);图;图(年,ObsDefRate1997.mean_Default * 100,“- *”) 抓住图(年份(2:结束),ObsDefRate1998.mean_Default * 100,“- *”)情节(年(3:结束),obsdefrate1999.mean_default * 100,“- *”) 抓住离开标题('默认率与日历年')xlabel(“年”)ylabel(的违约率(%)) 传奇(“组群97”“队列98”“组群99”网格)

使用记分组和书籍年数的违约率模型

您可视化数据后,可以为违约率建立预测模型。

面板数据分成训练集和测试集,定义基于ID号这些集。

NumTraining =地板(0.6 * nIDs);rng (“默认”);Trainidind = Randsample(nids,numtring);TrainDataind = ISMember(data.id,uniqueids(trainidind));testdataind =〜traindataind;

第一款模型仅使用分数组和书籍数年数作为默认速率的预测器p.违约的几率被定义为P /(1-P).逻辑模型将概率的对数联系起来,或者日志赔率向预测如下:

日志 p 1 - p 一个 H + 一个 1 + 一个 l 1 l + b Y O B Y O B + ϵ

1M指示器有值吗1为了中等风险贷款0否则,同样的1L.为了低风险贷款。这是处理绝对预测器的标准方法,比如ScoreGroup.每个风险级别都有一个不同的常数:为了高的风险AH + AM为了中等风险, 和AH + AL为了低风险

要校准模型,请致电Fitglm.从统计和机器学习工具箱™功能。上面的公式表示为

默认~ 1 + ScoreGroup + YOB

1 + ScoreGroup条款占基线常数和风险水平的调整。设置可选参数分配二项以指示逻辑模型期望(即,在左侧与数比值的模型)。

modelnomacro = fitglm(数据(traindataind,:),......'默认〜1 +分数+ yob'......'分配'“二项式”);disp(modelnomacro)
广义线性回归模型:logit(Default) ~ 1 + ScoreGroup + YOB Distribution =二项估计系数:Estimate SE tStat pValue ________ ________ _______ ___________ (Intercept) -3.2453 0.033768 -96.106 0 ScoreGroup_Medium Risk -0.7058 0.037103 -19.023 1.1014e-801 Chi^2-statistic vs. constant model: 1.83e+03, p-value = 0

对于数据中的任何行,值为p是不观察,只有一个0或者1观察默认指示灯。通过标定得到模型系数,得到的预测值p可以使用预测功能。

截距系数是对于恒定高的风险水平(术语),ScoreGroup_Medium风险ScoreGroup_Low风险系数是调整的中等风险低风险水平(艾尔条款)。

违约概率p和日志赔率(该模型的左侧)移动在相同的方向时的预测变化。因此,由于调整了中等风险低风险否定,违约率较低,以便更好的风险级别,如预期的那样。书籍数年的系数也是负面的,符合在数据中观察到的书籍数年的总体下降趋势。

为了解释面板数据效应,一个更高级的混合效应模型可以使用Fitglm.从统计和机器学习工具箱™功能。虽然在此示例中未安装此模型,但代码非常相似:

ModelNoMacro = fitglme(数据(TrainDataInd,:), '默认〜1 + ScoreGroup + YOB +(1 | ID)', '分配', '二项式');

(1 | ID)公式中的项加上a随机效应到模型中。这个效应是一个预测器,它的值不是在数据中给出的,而是与模型系数一起校准的。为每个ID校准一个随机值。这种额外的校准要求大大增加了在这种情况下适合模型的计算时间,因为id的数量非常大。对于本例中的面板数据集,随机项的影响可以忽略不计。当引入随机效应时,随机效应的方差很小,模型系数几乎没有变化。更简单的逻辑回归模型是首选,因为它校准和预测更快,而且用这两种模型预测的违约率本质上是相同的。

预测训练和测试数据的默认概率。

data.pdnomacro = zeros(高度(数据),1);%样本预测的data.PDNoMacro(TrainDataInd)=预测(ModelNoMacro,数据(TrainDataInd,:));%预测外的样品data.PDNoMacro (TestDataInd) =预测(ModelNoMacro、数据(TestDataInd:));

可视化样本内匹配。

predpdtrainyob = comononummary(数据(traindataind,:),“小无赖”'意思'......“默认”“PDNoMacro”});图;散射(PredPDTrainYOB.YOB,PredPDTrainYOB.mean_Default * 100,‘*’);持有情节(PredPDTrainYOB.YOB PredPDTrainYOB.mean_PDNoMacro * 100);持有离开包含(“书籍年”)ylabel(的违约率(%)) 传奇(“观察”'预料到的')标题('型号适合(培训数据)'网格)

可视化出的样本外的配合。

predpdtestyob = comononummary(数据(testdataind,:),“小无赖”'意思'......“默认”“PDNoMacro”});图;散射(PredPDTestYOB.YOB PredPDTestYOB.mean_Default * 100,‘*’);持有情节(PredPDTestYOB.YOB,PredPDTestYOB.mean_PDNoMacro * 100);持有离开包含(“书籍年”)ylabel(的违约率(%)) 传奇(“观察”'预料到的')标题(“模型拟合(测试数据)”网格)

可视化所有得分组的样本内适合度。样本外拟合可以用类似的方法计算和可视化。

PredPDTrainScoreYOB = groupsummary(数据(TrainDataInd,:),......'ScoreGroup'“小无赖”},'意思'{“默认”“PDNoMacro”});图;hs = gscatter (PredPDTrainScoreYOB。小无赖,......PredPDTrainScoreYOB.mean_Default * 100,......PredPDTrainScoreYOB.ScoreGroup,'rbmgk'‘*’);mean_PDNoMacroMat =重塑(PredPDTrainScoreYOB.mean_PDNoMacro,......NumYOB NumScoreGroups);持有马力=情节(mean_PDNoMacroMat * 100);为了II = 1:NumScoreGroups马力(ⅱ)。颜色= HS(ⅱ)。颜色;结尾持有离开包含(“书籍年”)ylabel(“观察到的默认率(%)”)图例(类别(data.ScoreGroup))标题(“按评分组的模型拟合(训练数据)”网格)

包含宏观经济变量的违约率模型

用以前的模型预测的趋势,作为书籍年的函数,有一个非常有规律的减少模式。然而,数据显示出一些偏离这一趋势的情况。为了解释这些偏差,将国内生产总值(gdp)的年增长率(以国内生产总值变量)和股票市场年收益(用市场变量)到模型。

日志 p 1 - p 一个 H + 一个 1 + 一个 l 1 l + b Y O B Y O B + b G D P G D P + b 一个 r k e t 一个 r k e t + ϵ

展开数据集,为其添加一列国内生产总值和一个用于市场,使用来自的数据dataMacro桌子。

data.gdp = dataMacro.gdp(data.year-1996);data.market = dataMacro.market(data.year-1996);DISP(数据(1:10,:))
ID ScoreGroup小无赖违约PDNoMacro GDP市场  __ ___________ ___ _______ ____ _________ _____ ______ 1低风险1 0 1997 0.0084797 2.72 7.61 1低风险2 0 1998 0.0067697 3.57 26.24 1低风险3 0 1999 0.0054027 2.86 18.1 1低风险4 0 2001 2000 0.0043105 2.43 3.19 1低风险5 0 0.0034384 1.26 -10.51 2002 0.0027422 -0.59 1低风险6 0-22.95 1低风险7 0 2003 0.0021867 0.63 2.78 1低风险8 0 2004 0.0017435 1.85 9.48 2中等风险1 0 1997 0.015097 2.72 7.61 2中等风险20 1998 0.012069 3.57 26.24

通过扩展模型公式,包括飞度与宏观经济变量模型国内生产总值市场变量。

ModelMacro = fitglm(数据(TrainDataInd,:),......'默认〜1 + ScoreGroup + YOB + GDP +市场'......'分配'“二项式”);DISP(ModelMacro)
广义线性回归模型:分对数(默认)〜1 + ScoreGroup + YOB + GDP +市场分销=二项式估计系数:估计SE TSTAT p值__________ _________ _______ ___________(截距)-2.667 0.10146 -26.287 2.6919e-152 ScoreGroup_Medium风险-0.70751 0.037108-19.066 4.8223e-81 ScoreGroup_Low风险-1.2895 0.045639 -28.253 1.2892e-175 YOB -0.32082 0.013636 -23.528 2.0867e-122 GDP -0.12295 0.039725 -3.095 0.0019681市场-0.0071812 0.0028298 -2.5377 0.011159 388018观察,388012个误差自由度分散体的:1驰^ 2统计量与常数模型:1.97E + 03,p值= 0

这两个宏观经济变量呈现负系数,与较高的经济增长降低违约率的直觉是一致的。

预测默认的训练和测试数据的概率。

data.pdmacro = zeros(高度(数据),1);%样本预测的data.PDMacro (TrainDataInd) =预测(ModelMacro、数据(TrainDataInd:));%预测外的样品data.PDMacro(TestDataInd)=预测(ModelMacro,数据(TestDataInd,:));

可视化样本内匹配。如所希望的,该模型包括宏观经济变量,或宏模型,从通过以前的模型所预测的平滑趋势偏离。与宏模型所预测的速度与所观察到的违约率更紧密地匹配。

PredPDTrainYOBMacro = groupsummary(数据(TrainDataInd,:),“小无赖”'意思'......“默认”'PDMacro'});图;散射(PredPDTrainYOBMacro.YOB PredPDTrainYOBMacro.mean_Default * 100,‘*’);持有情节(PredPDTrainYOB.YOB PredPDTrainYOB.mean_PDNoMacro * 100);%没有宏观情节(PredPDTrainYOBMacro.YOB PredPDTrainYOBMacro.mean_PDMacro * 100);%的宏持有离开包含(“书籍年”)ylabel(的违约率(%)) 传奇(“观察”“没有宏”“宏”)标题(“宏模型拟合(训练数据)”网格)

可视化出的样本外的配合。

predpdtestyobmacro =组ummary(数据(testdataind,:),“小无赖”'意思'......“默认”'PDMacro'});图;散射(PredPDTestYOBMacro.YOB,PredPDTestYOBMacro.mean_Default * 100,‘*’);持有情节(PredPDTestYOB.YOB,PredPDTestYOB.mean_PDNoMacro * 100);%没有宏观plot(predpdtestyobmacro.yob,predpdtestyobmacro.mean_pdmacro * 100);%的宏持有离开包含(“书籍年”)ylabel(的违约率(%)) 传奇(“观察”“没有宏”“宏”)标题(“宏模型拟合(测试数据)”网格)

可视化所有得分组的样本内适合度。

PredPDTrainScoreYOBMacro = groupsummary(数据(TrainDataInd,:),......'ScoreGroup'“小无赖”},'意思'{“默认”'PDMacro'});图;hs = g箭头(predpdtrainscoreyobmacro.yob,......PredPDTrainScoreYOBMacro.mean_Default * 100,......PredPDTrainScoreYOBMacro.ScoreGroup,'rbmgk'‘*’);mean_PDMacroMat =重塑(PredPDTrainScoreYOBMacro.mean_PDMacro,......NumYOB NumScoreGroups);持有惠普=情节(mean_PDMacroMat * 100);为了II = 1:NumScoreGroups马力(ⅱ)。颜色= HS(ⅱ)。颜色;结尾持有离开包含(“书籍年”)ylabel(“观察到的默认率(%)”)图例(类别(data.ScoreGroup))标题(“按评分组的宏观模型拟合(训练数据)”网格)

强调违约概率的测试

使用拟合的宏模型来压力 - 测试默认的预测概率。

假设以下是用于提供,例如,通过调节器的宏观经济变量压力情景。

DISP(dataMacroStress)
GDP市场_____ ______基线2.27 15.02不利1.31 4.56严重-0.22 -5.64

建立一个基本的数据表预测违约概率。这是一个虚拟的数据表,其中一行的年图书评分组和编号的每个组合。

dataBaseline =表;[ScoreGroup,小无赖]= meshgrid (1: NumScoreGroups, 1: NumYOB);dataBaseline。ScoreGroup=categorical(ScoreGroup(:),1:NumScoreGroups,......类别(data.ScoreGroup),“序”,真正的);dataBaseline。小无赖=小无赖(:); dataBaseline.ID = ones(height(dataBaseline),1); dataBaseline.GDP = zeros(height(dataBaseline),1); dataBaseline.Market = zeros(height(dataBaseline),1);

为了做出预测,对于评分组的年书的所有组合和数量设置相同的宏观经济条件(基线,不良或严重不良反应)。

%预测基线默认的概率dataBaseline.GDP (:) = dataMacroStress。国内生产总值(“基线”);dataBaseline.Market(:) = dataMacroStress.Market(“基线”);dataBaseline.PD =预测(ModelMacro,dataBaseline);%预测违约概率在悲观情形dataAdverse = dataBaseline;dataAdverse.GDP (:) = dataMacroStress。国内生产总值(“不良”);dataAdverse.Market(:) = dataMacroStress.Market(“不良”);dataAdverse。PD=预测(米odelMacro,dataAdverse);%预测违约概率的严重不良反应情况dataSevere = dataBaseline;dataSevere.GDP (:) = dataMacroStress。国内生产总值(“严重”);datasevere.market(:) = dataMacrostress.market(“严重”);dataSevere.PD =预测(ModelMacro,dataSevere);

可视化的三种替代监管的情况下,整个评分组默认的平均预测概率。在这里,所有的分数组是以隐权重相等。然而,预测也可以在贷款层面做出任何给定的组合,使预测违约率与贷款组合中的实际分布一致。相同的可视化可以被单独地制造为每个评分组。

PredPDYOB = 0 (NumYOB, 3);PredPDYOB(: 1) =意味着(重塑(dataBaseline.PD, NumYOB NumScoreGroups), 2);PredPDYOB(:, 2) =意味着(重塑(dataAdverse.PD, NumYOB NumScoreGroups), 2);PredPDYOB(:, 3) =意味着(重塑(dataSevere.PD, NumYOB NumScoreGroups), 2);图;酒吧(PredPDYOB * 100);包含(“书籍年”)ylabel(“预测默认率(%)”) 传奇(“基线”“不良”“严重”)标题(“压力测试,违约概率”网格)

参考文献

  1. 广义线性模型文档://www.tianjin-qmedu.com/help/stats/generalized-linear-regression.html

  2. 广义线性混合效应模型文件://www.tianjin-qmedu.com/help/stats/generalized-linear-mixed-effects-models.html

  3. 美联储,全面的资本分析和审查(CCAR):https://www.federal reserve.gov/bankinforeg/ccar.htm

  4. 英国央行,压力测试:https://www.bankofengland.co.uk/financial-stability

  5. 欧洲银行管理局,欧盟范围内的压力测试:https://www.eba.europa.eu/risk-analysis-and-data/eu-wide-stress-testing

另请参阅

|

相关的例子

更多关于