使用面板数据应力测试消费者信用默认概率

此示例显示如何使用消费者(零售)信用面板数据以可视化不同级别的观察到的默认速率。它还展示了如何适应模型以预测默认概率并执行压力测试分析。

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

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

标准logistic回归模型预测了所有分数水平、书籍使用年限和宏观经济变量情景的违约概率。当标准逻辑回归模型用于压力测试分析时,该模型预测给定基线的违约概率,以及不利和严重不利的宏观经济情景的违约概率。

有关更多信息,请参阅示例带有Cox比例风险的违约概率建模,它遵循相同的工作流,但使用Cox回归而不是逻辑回归,并且还提供了关于生命周期PD和生命周期预期信用损失(ECL)计算的额外信息。

面板数据描述

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

  • ID:贷款标识符。

  • 分数组:贷款开始时的信用评分,离散分为三组:高风险中等风险,低风险

  • 小无赖:多年的书。

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

  • :日历年。

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

  • :日历年。

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

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

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

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

此示例使用模拟数据,但相同的方法已成功应用于实际数据集。

加载面板数据

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

加载RetailCreditPanelData.matfprintf(“\ nFirst 10行:\ n”
第十行:
disp(数据(1:10)):
ID ScoreGroup小无赖违约  __ ___________ ___ _______ ____ 1低风险1 0 1998 1997 1低风险2 0 1低风险3 1999 0 1低风险4 0 2001 2000 1低风险5 0 1低风险6 0 2002 1低风险7 0 2003 1低风险8 0 2004 2中等风险1 0 1997 2中等风险2 0 1998
fprintf(“最后的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 =长度(UniqueIDs);fprintf('ID总数:%d \ n',nids)
id总数:96820
fprintf('总行数:%d\n'nRows)
总行数:646724

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

使用信用评分组作为分组变量来计算每个评分组的观察到的违约率。为此,使用groupsummary函数来计算默认变量,分组由分数组变量。在条形图上画出结果。正如预期的那样,违约率随着信贷质量的改善而下降。

defratebyscore = comononiummary(数据,'档次'“的意思是”“默认”);NumScoreGroups =身高(DefRateByScore);disp (DefRateByScore)
ScoreGroup GroupCount mean_Default ___________ __________ ____________高危2.0999e+05 0.017167中风险2.1743e+05 0.0086006低风险2.193e+05 0.0046784
图;BAR(DOUBLE(DEFRATEBYSCORE.SCOREGROUP),DEFRATEBYSCORE.MEAN_DEFAULT * 100)SET(GCA,“XTickLabel”、类别(data.ScoreGroup))标题('默认速率与分数组')包含(“分数组”) ylabel ('观察到的默认速率(%)'网格)

接下来,按年份分组计算图书的违约率(用小无赖多变的)。由此产生的速率是有条件的一年违约率。例如,书籍上的第三年的违约率是第三年贷款违约的比例,相对于第二年的投资组合中的贷款人数。换句话说,第三年的默认速率是行数小无赖=3.默认= 1,除以有小无赖=3.

绘制结果。随着书籍的数年增加,违约率下降了趋势。年三年和四个有类似的违约率。然而,从这个剧情中尚不清楚这是贷款产品的特征或宏观经济环境的效果。

DefRateByYOB = groupsummary(数据,'yob'“的意思是”“默认”);NumYOB =身高(DefRateByYOB);disp (DefRateByYOB)
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
图;plot(double(defratebyyob.yob),defratebyyob.mean_default * 100,' -  *')标题(“违约率vs.年数”)包含(“年书”) ylabel ('观察到的默认速率(%)'网格)

现在,根据分数组和在书上的年数分组,然后绘制结果。该图显示,随着时间的推移,所有得分组的表现相似,总体呈下降趋势。第三年和第四年是下降趋势的一个例外:利率持平高风险组,第三年上升低风险组。

DefRateByScoreYOB = groupsummary(数据,{'档次''yob'},“的意思是”“默认”);%显示输出表显示它的结构方式%仅显示前10行,简洁disp (DefRateByScoreYOB (1:10)):
分数yob groupcount mean_default ___________ ______________ ____________高风险1 32601 0.029692高风险3 30138 0.01844高风险5 28117 0.014794高风险7 19606 0.011168高风险8 10094 0.0027739中等风险1 32373 0.014302中等风险2 31775 0.011676
disp (“……”
...
DefRateByScoreYOB2 =重塑(DefRateByScoreYOB.mean_Default,...NumYOB NumScoreGroups);图;情节(DefRateByScoreYOB2 * 100,' -  *')标题(“违约率vs.年数”)包含(“年书”) ylabel ('观察到的默认速率(%)')传奇(类别(Data.ScoreGroup))网格

书中的年份与日历中的年份

这些数据包含三个队列或葡萄酒:贷款于1997年,1998年,1999年始于1999年。在1999年之后没有贷款。

本节将展示如何分别可视化每个队列的默认率。所有组别的违约率都被绘制出来,分别与书籍年数和日历年进行对比。书中年份的模式暗示了贷款产品的特点。历年的模式表明宏观经济环境的影响。

从第2年到第4年,曲线显示了三个群体的不同模式。然而,当与日历年对比时,这三个群体在2000年到2002年间表现出了相似的行为。这段时间曲线变平了。

1997年,1998年和1999年队列的%获得IDIDs1997 = data.ID (data.YOB &data.year = = = = 1997);IDs1998 = data.ID (data.YOB &data.year = = = = 1998);IDs1999 = data.ID (data.YOB &data.year = = = = 1999);%ids2000andup未使用,只计算它是空的,1999年以后开始没有贷款ids2000andup = data.id(data.yob == 1&data.year> 1999);%分别获得每个队列的默认率ObsDefRate1997 = groupsummary(数据(ismember (data.ID IDs1997):),...'yob'“的意思是”“默认”);ObsDefRate1998 = groupsummary(数据(ismember (data.ID IDs1998):),...'yob'“的意思是”“默认”);ObsDefRate1999 = groupsummary(数据(ismember (data.ID IDs1999):),...'yob'“的意思是”“默认”);与书本上的岁月相对照图;情节(ObsDefRate1997.YOB ObsDefRate1997.mean_Default * 100,' -  *')举行情节(ObsDefRate1998.YOB ObsDefRate1998.mean_Default * 100,' -  *')情节(ObsDefRate1999.YOB ObsDefRate1999.mean_Default * 100,' -  *')举行离开标题(“违约率vs.年数”)包含(“年书”) ylabel (的违约率(%))传说(“97”“98”“99”网格)

%策划对日历年度年=唯一(data.year);图;情节(年,obsdefrate1997.mean_default * 100,' -  *')举行情节(年(2:结束),Obsdefrate1998.mean_default * 100,' -  *')情节(年(3:结束),ObsDefRate1999.mean_Default * 100,' -  *')举行离开标题(“违约率vs.日历年”)包含(“年”) ylabel (的违约率(%))传说(“97”“98”“99”网格)

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

可视化数据后,您可以为默认速率构建预测模型。

将面板数据拆分为培训和测试集,根据ID号定义这些组。

NumTraining =地板(0.6 * nIDs);rng (“默认”);NumTraining TrainIDInd = randsample (nIDs);TrainDataInd = ismember (data.ID UniqueIDs (TrainIDInd));TestDataInd = ~ TrainDataInd;

第一个模型只使用评分组和书的年数作为违约率的预测因素P..违约的几率被定义为p / (1 - p).物流模型涉及赔率的对数,或者日志赔率,以预测如下:

日志 P. 1 - P. = 一种 H + 一种 m 1 m + 一种 L. 1 L. + B. y O. B. y O. B. + ϵ

1米是一个值的指标1为了中等风险贷款和0.否则,与之相似1 l为了低风险贷款。这是处理分类预测器的标准方法,例如分数组.每个风险级别都有一个不同的常数:为了高风险啊+ am为了中等风险,啊+基地为了低风险

为了校准模型,调用fitglm函数来自统计和机器学习工具箱™。上式表示为

默认~ 1 + ScoreGroup + YOB

1 + ScoreGroup术语解释了基线常数和风险水平的调整。设置可选参数分配二项表示需要逻辑模型(即,左侧具有日志赔率的模型)。

ModelNoMacro = fitglm(数据(TrainDataInd,:),...'Default ~ 1 + ScoreGroup + YOB'...“分布”“二”);disp (ModelNoMacro)
广义线性回归模型:Logit(默认)〜1 +分数+ yob分布=二项式估计系数:估计SE Tstat pvalue ________ __________________________________medium风险-0.023 1.1014E-80分数GROME_LOW风险-1.2893 0.045635 -28.253 1.3076E-175 YOB -0.22693 0.008437 -26.897 2.3578E-159 388018观察,388014误差自由色散:1 chi ^ 2统计与常数型号:1.83e + 03,p值=0.

对于数据中的任何行,值P.没有观察到,只有一个0.1观察默认指示灯。通过标定得到模型系数,得到的预测值P.对于单个行可以用它恢复预测功能。

拦截系数是恒定的高风险水平(术语),分数_medium风险分数_流风险系数是调整中等风险低风险水平(AL.条款)。

默认概率P.当预测变量发生变化时,对数概率(模型的左边)也会向同一个方向移动。因此,因为调整中等风险低风险为负值时,如预期的那样,风险水平越高,违约率越低。书龄系数也为负,与数据中观察到的书龄总体下降趋势一致。

要考虑面板数据效果,可以使用混合效果更高级模型使用fitglm函数来自统计和机器学习工具箱™。虽然这个模型不适合这个例子,但代码是非常相似的:

ModelNoMacro = fitglme(data(TrainDataInd,:),'Default ~ 1 + ScoreGroup + YOB + (1|ID)','Distribution','binomial');

(1 | ID)公式中的术语增加了一个随机效应到模型。这种效果是一种预测因子,其值在数据中不给出,但与模型系数一起校准。为每个ID校准随机值。这种额外的校准要求基本上增加了在这种情况下适合模型的计算时间,因为ID数量非常大。对于本例中的面板数据集,随机术语具有可忽略不计的效果。随机效果的方差非常小,并且在引入随机效果时,模型系数几乎没有变化。更简单的逻辑回归模型是优选的,因为校准并预测更快,并且使用两个模型预测的默认率基本相同。

预测默认训练和测试数据的可能性。

数据。P.D.NoMacro = zeros(height(data),1);%预测样本data.pdnomacro(traindataind)=预测(modelnomacro,数据(traindataind,:));%样本外预测data.PDNoMacro (TestDataInd) =预测(ModelNoMacro、数据(TestDataInd:));

可视化样式拟合。

PredPDTrainYOB = groupsummary(数据(TrainDataInd,:),'yob'“的意思是”...{“默认”“PDNoMacro”});图;散射(PredPDTrainYOB.YOB PredPDTrainYOB.mean_Default * 100,‘*’);抓住情节(PredPDTrainYOB.YOB PredPDTrainYOB.mean_PDNoMacro * 100);抓住离开包含(“年书”) ylabel (的违约率(%))传说(“观察”“预测”)标题(“模型拟合(训练数据)”网格)

可视化样品拟合。

PredPDTestYOB = groupsummary(数据(TestDataInd,:),'yob'“的意思是”...{“默认”“PDNoMacro”});图;散射(PredPDTestYOB.YOB PredPDTestYOB.mean_Default * 100,‘*’);抓住plot(predpdtestyob.yob,predpdtestyob.mean_pdnomacro * 100);抓住离开包含(“年书”) ylabel (的违约率(%))传说(“观察”“预测”)标题('模型适合(测试数据)'网格)

可视化所有分数组的样本适合。可以以类似的方式计算和可视化样品拟合。

PredPDTrainScoreYOB = groupsummary(数据(TrainDataInd,:),...{'档次''yob'},“的意思是”, {“默认”“PDNoMacro”});图;hs = gscatter (PredPDTrainScoreYOB。小无赖,...predpdtrainscoreyob.mean_default * 100,...PredPDTrainScoreYOB。ScoreGroup,“rbmgk”‘*’);mean_PDNoMacroMat =重塑(PredPDTrainScoreYOB.mean_PDNoMacro,...NumYOB NumScoreGroups);抓住惠普=情节(mean_PDNoMacroMat * 100);为了2 = 1: NumScoreGroups惠普(ii)。颜色= hs (2) .Color;结尾抓住离开包含(“年书”) ylabel ('观察到的默认速率(%)')传奇(类别(Data.ScoreGroup))标题('模型适合分数组(培训数据)'网格)

默认率模型,包括宏观经济变量

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

日志 P. 1 - P. = 一种 H + 一种 m 1 m + 一种 L. 1 L. + B. y O. B. y O. B. + B. G D. P. G D. P. + B. m 一种 R. K. E. T. m 一种 R. K. E. T. + ϵ

展开数据集,为其添加一列国内生产总值一个for.市场的数据dataMacro桌子。

数据。国内生产总值=dataMacro。GD.P.(数据。年-1996); data.Market = dataMacro.Market(data.Year-1996); disp(data(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 +分数+ Yob + GDP +市场'...“分布”“二”);disp(modelmacro)
广义线性回归模型:logit(Default) ~ 1 + ScoreGroup + YOB + GDP + Market Distribution =二项式估计系数:evaluate SE tStat pValue __________ _________ _______ ___________ (Intercept) -2.667 0.10146 -26.287 2.6919e-152 ScoreGroup_Medium Risk -0.70751 0.037108 -19.066 ScoreGroup_Low Risk - 0.2895 0.045639 -28.253 YOB -0.32082 0.013636 -23.528 2.0867e-122 GDP -0.12295 0.039725 -3.095 0.0019681 Market -0.0071812 0.0028298 -2.5377离散:1 Chi^2-statistic vs. constant model: 1.97e+03, p-value = 0

这两个宏观经济变量的系数都是负的,这与经济增长越快违约率越低的直觉是一致的。

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

数据。P.D.m一种cro = zeros(height(data),1);%预测样本data.PDMacro (TrainDataInd) =预测(ModelMacro、数据(TrainDataInd:));%样本外预测data.PDMacro (TestDataInd) =预测(ModelMacro、数据(TestDataInd:));

可视化样式拟合。根据需要,包括宏观经济变量或宏模型的模型偏离了以前模型预测的平滑趋势。宏模型预测的速率与观察到的默认速率更密切地匹配。

PredPDTrainYOBMacro = groupsummary(数据(TrainDataInd,:),'yob'“的意思是”...{“默认”'pdmacro'});图;散射(PredPDTrainYOBMacro.YOB PredPDTrainYOBMacro.mean_Default * 100,‘*’);抓住情节(PredPDTrainYOB.YOB PredPDTrainYOB.mean_PDNoMacro * 100);%没有宏观情节(PredPDTrainYOBMacro.YOB PredPDTrainYOBMacro.mean_PDMacro * 100);%的宏抓住离开包含(“年书”) ylabel (的违约率(%))传说(“观察”'没有宏'“宏”)标题('宏模型适合(培训数据)'网格)

可视化样品拟合。

PredPDTestYOBMacro = groupsummary(数据(TestDataInd,:),'yob'“的意思是”...{“默认”'pdmacro'});图;分散(predpdtestyobmacro.yob,predpdtestyobmacro.mean_default * 100,‘*’);抓住plot(predpdtestyob.yob,predpdtestyob.mean_pdnomacro * 100);%没有宏观情节(PredPDTestYOBMacro.YOB PredPDTestYOBMacro.mean_PDMacro * 100);%的宏抓住离开包含(“年书”) ylabel (的违约率(%))传说(“观察”'没有宏'“宏”)标题('宏模型适合(测试数据)'网格)

可视化所有分数组的样本适合。

predpdtrainscoreyobmacro = gransummary(数据(traindataind,:),...{'档次''yob'},“的意思是”, {“默认”'pdmacro'});图;hs = gscatter (PredPDTrainScoreYOBMacro。小无赖,...predpdtrainscoreyobmacro.mean_default * 100,...predpdtrainscoreyobmacro.scoregroup,“rbmgk”‘*’);mean_PDMacroMat =重塑(PredPDTrainScoreYOBMacro.mean_PDMacro,...NumYOB NumScoreGroups);抓住hp = plot(mean_pdmacromat * 100);为了2 = 1: NumScoreGroups惠普(ii)。颜色= hs (2) .Color;结尾抓住离开包含(“年书”) ylabel ('观察到的默认速率(%)')传奇(类别(Data.ScoreGroup))标题(“按评分组的宏观模型拟合(训练数据)”网格)

违约概率的压力测试

使用拟合的宏观模型对预测的违约概率进行压力测试。

假设以下是宏观经济变量(例如,由监管机构提供的)的压力场景。

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

设置一个基本数据表,以预测默认值。这是一个虚拟数据表,每个分数组的每个组合都有一行,书籍上的数年数。

databaseline =表;[分数组,YOB] = MeshGrid(1:NumScoreGroups,1:Numyob);databaseline.scoregroup =分类(分数群(:),1:numcoregroups,...类别(data.ScoreGroup),'序号',真的);databaseline.yob = yob(:);databaseline.id = = =(高度(数据迹线),1);databaseline.gdp = zeros(高度(数据迹线),1);databaseline.market = zeros(高度(数据迹线),1);

为了使预测,为所有分数组的组合和书籍中的所有组合设置相同的宏观经济条件(基线,不利或严重不利)。

预测违约概率基线dataBaseline.GDP (:) = dataMacroStress。国内生产总值('基线');dataBaseline.Market (:) = dataMacroStress。市场('基线');dataBaseline。P.D.=预测(modelMacro,dataBaseline);%预测在不利情况下违约的概率dataadod = databaseline;data.com.gdp(:) = dataMacrostress.gdp(“不良”);dataadod.market(:) = dataMacrostress.market(“不良”);dataAdverse。P.D.=预测(modelMacro,dataAdverse);%预测在严重不利情景中的默认概率dataSevere = dataBaseline;dataSevere.GDP (:) = dataMacroStress。国内生产总值(“严重”);dataSevere.Market (:) = dataMacroStress。市场(“严重”);datasevere.pd = predict(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.tatmou.com/help/stats/generalized-linear-regression.html

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

  3. 美联储,综合资本分析与评估(CCAR):https://www.federalreserve.gov/bankinforeg/ccar.htm

  4. 英格兰银行,压力测试:https://www.bankofengland.co.uk/financial-tability.

  5. 欧洲银行权限,欧盟范围压力测试:https://www.eba.europa.eu/Risk-analysis-and-data/eu-wide-tress-ting.

也可以看看

|

相关例子

更多关于