exponenta event banner

Стресс-тестирование вероятности дефолта потребительского кредита с использованием данных панели

В этом примере показано, как работать с данными потребительской (розничной) кредитной панели для визуализации наблюдаемых ставок дефолта на различных уровнях. В нем также показано, как подогнать модель для прогнозирования вероятностей значений PD по умолчанию (PD) и времени жизни и выполнить анализ стресс-тестирования.

Набор данных панели потребительских ссуд позволяет определить модели ставок по умолчанию для ссуд разных возрастов или лет в книгах. Можно использовать информацию о группе баллов для различения ставок по умолчанию для различных уровней баллов. Кроме того, макроэкономическую информацию можно использовать для оценки того, как состояние экономики влияет на ставки дефолта по потребительским кредитам.

Стандартная модель логистической регрессии, тип обобщенной линейной модели, подгоняется к данным панели розничных кредитов с макроэкономическими предикторами и без них, используя fitLifetimePDModel из Toolbox™ управления рисками. Хотя эта же модель может быть установлена с помощью fitglm функция от Statistics and Machine Learning Toolbox™, пожизненная вероятность дефолта (PD) версии модели разработана для кредитных приложений и поддерживает инструменты прогнозирования PD и валидации модели, включая графики дискриминации и точности, показанные в этом примере. В примере также описывается, как подогнать более совершенную модель для учета эффектов данных панели, обобщенную линейную модель смешанных эффектов. Однако эффекты панели незначительны для набора данных в этом примере, и для эффективности предпочтительна стандартная логистическая модель.

Модель логистической регрессии предсказывает вероятности дефолта для всех уровней оценки, лет в книгах и сценариев макроэкономических переменных. Существует краткое обсуждение того, как предсказать значения PD на время жизни, с указателями на дополнительные функциональные возможности. В примере показаны инструменты распознавания и точности моделей для проверки и сравнения моделей. В последнем разделе этого примера логистическая модель используется для анализа стресс-тестирования, модель предсказывает вероятности дефолта для данной базовой линии, а также вероятности дефолта для неблагоприятных и сильно неблагоприятных макроэкономических сценариев.

Дополнительные сведения см. в разделе Обзор пожизненной вероятности моделей по умолчанию. См. также пример Моделирование вероятностей дефолта с пропорциональными опасностями Кокса, который следует тому же рабочему процессу, но использует регрессию Кокса вместо логистической регрессии, а также имеет информацию о вычислении PD и ожидаемой кредитной потери (ECL).

Описание данных панели

Основной набор данных (data) содержит следующие переменные:

  • ID: Идентификатор займа.

  • ScoreGroupКредитный балл в начале кредита, дискретизированный на три группы: High Risk, Medium Risk, и Low Risk.

  • YOBГоды на книгах.

  • Default: Индикатор по умолчанию. Это переменная ответа.

  • YearКалендарный год.

Существует также небольшой набор данных (dataMacro) с макроэкономическими данными за соответствующие календарные годы:

  • YearКалендарный год.

  • GDPРост валового внутреннего продукта (год за годом).

  • MarketРыночная доходность (год за годом).

Переменные YOB, Year, GDP, и Market наблюдаются в конце соответствующего календарного года. Группа баллов представляет собой дискретизацию исходного кредитного балла при начале кредитования. Значение 1 для Default означает, что по кредиту был допущен дефолт в соответствующем календарном году.

Существует также третий набор данных (dataMacroStress) с базовыми, неблагоприятными и сильно неблагоприятными сценариями для макроэкономических переменных. Эта таблица используется для анализа стресс-тестирования.

В этом примере используются смоделированные данные, но тот же подход был успешно применен к реальным наборам данных.

Загрузка данных панели

Загрузите данные и просмотрите первые 10 и последние 10 строк таблицы. Данные панели складываются в стопку в том смысле, что наблюдения за одним и тем же идентификатором хранятся в смежных строках, создавая высокую тонкую таблицу. Панель несбалансирована, поскольку не все идентификаторы имеют одинаковое количество наблюдений.

load RetailCreditPanelData.mat

fprintf('\nFirst ten rows:\n')
First ten rows:
disp(data(1:10,:))
    ID    ScoreGroup     YOB    Default    Year
    __    ___________    ___    _______    ____

    1     Low Risk        1        0       1997
    1     Low Risk        2        0       1998
    1     Low Risk        3        0       1999
    1     Low Risk        4        0       2000
    1     Low Risk        5        0       2001
    1     Low Risk        6        0       2002
    1     Low Risk        7        0       2003
    1     Low Risk        8        0       2004
    2     Medium Risk     1        0       1997
    2     Medium Risk     2        0       1998
fprintf('Last ten rows:\n')
Last ten rows:
disp(data(end-9:end,:))
     ID      ScoreGroup     YOB    Default    Year
    _____    ___________    ___    _______    ____

    96819    High Risk       6        0       2003
    96819    High Risk       7        0       2004
    96820    Medium Risk     1        0       1997
    96820    Medium Risk     2        0       1998
    96820    Medium Risk     3        0       1999
    96820    Medium Risk     4        0       2000
    96820    Medium Risk     5        0       2001
    96820    Medium Risk     6        0       2002
    96820    Medium Risk     7        0       2003
    96820    Medium Risk     8        0       2004
nRows = height(data);
UniqueIDs = unique(data.ID);
nIDs = length(UniqueIDs);

fprintf('Total number of IDs: %d\n',nIDs)
Total number of IDs: 96820
fprintf('Total number of rows: %d\n',nRows)
Total number of rows: 646724

Ставки по умолчанию по группам баллов и годам в книгах

Используйте группу кредитных баллов в качестве переменной группировки для вычисления наблюдаемой ставки по умолчанию для каждой группы баллов. Для этого используйте groupsummary для вычисления среднего значения Default переменная, группировка по ScoreGroup переменная. Постройте график результатов на гистограмме. Как и ожидалось, ставка по умолчанию снижается по мере улучшения кредитного качества.

DefRateByScore = groupsummary(data,'ScoreGroup','mean','Default');
NumScoreGroups = height(DefRateByScore);

disp(DefRateByScore)
    ScoreGroup     GroupCount    mean_Default
    ___________    __________    ____________

    High Risk      2.0999e+05      0.017167  
    Medium Risk    2.1743e+05     0.0086006  
    Low Risk        2.193e+05     0.0046784  
bar(DefRateByScore.ScoreGroup,DefRateByScore.mean_Default*100)
title('Default Rate vs. Score Group')
xlabel('Score Group')
ylabel('Observed Default Rate (%)')
grid on

Figure contains an axes. The axes with title Default Rate vs. Score Group contains an object of type bar.

Затем вычислите ставки по умолчанию, сгруппированные по годам в книгах (представлены YOB переменная). Результирующие ставки являются условными годичными ставками по умолчанию. Например, ставка дефолта за третий год в бухгалтерских книгах - это доля ссуд, дефолтных в третий год, относительно количества ссуд, которые находятся в портфеле за последний второй год. Другими словами, ставка по умолчанию для третьего года - это количество строк с YOB = 3 и Default = 1, разделенный на количество строк с YOB = 3.

Постройте график результатов. Существует явная тенденция к снижению, при этом ставки по умолчанию снижаются по мере увеличения количества лет в книгах. Три и четыре года имеют аналогичные ставки дефолта. Однако из этого сюжета неясно, является ли это характеристикой кредитного продукта или эффектом макроэкономической среды.

DefRateByYOB = groupsummary(data,'YOB','mean','Default');
NumYOB = height(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,'-*')
title('Default Rate vs. Years on Books')
xlabel('Years on Books')
ylabel('Observed Default Rate (%)')
grid on

Figure contains an axes. The axes with title Default Rate vs. Years on Books contains an object of type line.

Теперь сгруппируйте как по группе баллов, так и по количеству лет на книгах, а затем постройте график результатов. График показывает, что все группы баллов ведут себя аналогично по мере продвижения времени, с общей тенденцией к снижению. Третий и четвертый годы являются исключением из тенденции к снижению: ставки распрямляются для High Risk группа, и пойти вверх в третьем году для Low Risk группа.

DefRateByScoreYOB = groupsummary(data,{'ScoreGroup','YOB'},'mean','Default');

% Display output table to show the way it is structured
% Display only the first 10 rows, for brevity
disp(DefRateByScoreYOB(1:10,:))
    ScoreGroup     YOB    GroupCount    mean_Default
    ___________    ___    __________    ____________

    High Risk       1       32601         0.029692  
    High Risk       2       31338         0.021252  
    High Risk       3       30138         0.018448  
    High Risk       4       29438         0.018276  
    High Risk       5       28661         0.014794  
    High Risk       6       28117         0.011168  
    High Risk       7       19606        0.0056615  
    High Risk       8       10094        0.0027739  
    Medium Risk     1       32373         0.014302  
    Medium Risk     2       31775         0.011676  
DefRateByScoreYOB2 = reshape(DefRateByScoreYOB.mean_Default,...
   NumYOB,NumScoreGroups);

plot(DefRateByScoreYOB2*100,'-*')
title('Default Rate vs. Years on Books')
xlabel('Years on Books')
ylabel('Observed Default Rate (%)')
legend(categories(data.ScoreGroup))
grid on

Figure contains an axes. The axes with title Default Rate vs. Years on Books contains 3 objects of type line. These objects represent High Risk, Medium Risk, Low Risk.

Годы в книгах против календарных лет

Данные содержат три когорты, или винтаги: ссуды, начатые в 1997, 1998 и 1999 годах. Никакие ссуды в данных группы не начинались после 1999 года.

В этом разделе показано, как визуализировать частоту по умолчанию для каждой когорты отдельно. Ставки по умолчанию для всех когорт строятся как по количеству лет в книгах, так и по календарному году. Закономерности в годах в книгах предполагают характеристики кредитного продукта. Закономерности календарных лет говорят о влиянии макроэкономической среды.

От двух до четырех лет в книгах кривые показывают разные закономерности для трех когорт. Однако при построении графика по отношению к календарному году три когорты демонстрируют аналогичное поведение с 2000 по 2002 год. Кривые распрямляются в течение этого периода.

% Get IDs of 1997, 1998, and 1999 cohorts
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 is unused, it is only computed to show that this is empty,
% no loans started after 1999
IDs2000AndUp = data.ID(data.YOB==1&data.Year>1999);

% Get default rates for each cohort separately
ObsDefRate1997 = groupsummary(data(ismember(data.ID,IDs1997),:),...
    'YOB','mean','Default');

ObsDefRate1998 = groupsummary(data(ismember(data.ID,IDs1998),:),...
    'YOB','mean','Default');

ObsDefRate1999 = groupsummary(data(ismember(data.ID,IDs1999),:),...
    'YOB','mean','Default');

% Plot against the years on books
plot(ObsDefRate1997.YOB,ObsDefRate1997.mean_Default*100,'-*')
hold on
plot(ObsDefRate1998.YOB,ObsDefRate1998.mean_Default*100,'-*')
plot(ObsDefRate1999.YOB,ObsDefRate1999.mean_Default*100,'-*')
hold off
title('Default Rate vs. Years on Books')
xlabel('Years on Books')
ylabel('Default Rate (%)')
legend('Cohort 97','Cohort 98','Cohort 99')
grid on

Figure contains an axes. The axes with title Default Rate vs. Years on Books contains 3 objects of type line. These objects represent Cohort 97, Cohort 98, Cohort 99.

% Plot against the calendar year
Year = unique(data.Year);

plot(Year,ObsDefRate1997.mean_Default*100,'-*')
hold on
plot(Year(2:end),ObsDefRate1998.mean_Default*100,'-*')
plot(Year(3:end),ObsDefRate1999.mean_Default*100,'-*')
hold off
title('Default Rate vs. Calendar Year')
xlabel('Calendar Year')
ylabel('Default Rate (%)')
legend('Cohort 97','Cohort 98','Cohort 99')
grid on

Figure contains an axes. The axes with title Default Rate vs. Calendar Year contains 3 objects of type line. These objects represent Cohort 97, Cohort 98, Cohort 99.

Модель ставок по умолчанию с использованием группы баллов и годов по книгам

После визуализации данных можно построить прогнозные модели для ставок по умолчанию.

Разбейте данные панели на обучающие и тестовые наборы, определяя эти наборы на основе идентификационных номеров.

NumTraining = floor(0.6*nIDs);

rng('default'); % for reproducibility
TrainIDInd = randsample(nIDs,NumTraining);
TrainDataInd = ismember(data.ID,UniqueIDs(TrainIDInd));
TestDataInd = ~TrainDataInd;

Первая модель использует только группу баллов и количество лет в книгах в качестве предикторов ставки по умолчанию. Шансы на дефолт определены как p/( 1-p). Логистическая модель связывает логарифм шансов, или логарифмических шансов, с предикторами следующим образом:

log (p1-p) =aH+aM1M+aL1L+bYOBYOB+ϵ

1M - индикатор со значением 1 для Medium Risk займы и 0 в противном случае и аналогично для 1L для Low Risk кредиты. Это стандартный способ обработки категориального предиктора, такого как ScoreGroup. Фактически существует различная константа для каждого уровня риска: aH для High Risk, aH + aM дляMedium Riskи aH + aL дляLow Risk.

ModelNoMacro = fitLifetimePDModel(data(TrainDataInd,:),'logistic',...
   'ModelID','No Macro','Description','Logistic model with YOB and score group, but no macro variables',...
   'IDVar','ID','LoanVars','ScoreGroup','AgeVar','YOB','ResponseVar','Default');
disp(ModelNoMacro.Model)
Compact generalized linear regression model:
    logit(Default) ~ 1 + ScoreGroup + YOB
    Distribution = Binomial

Estimated Coefficients:
                              Estimate       SE        tStat       pValue   
                              ________    ________    _______    ___________

    (Intercept)                -3.2453    0.033768    -96.106              0
    ScoreGroup_Medium Risk     -0.7058    0.037103    -19.023     1.1014e-80
    ScoreGroup_Low Risk        -1.2893    0.045635    -28.253    1.3076e-175
    YOB                       -0.22693    0.008437    -26.897    2.3578e-159


388018 observations, 388014 error degrees of freedom
Dispersion: 1
Chi^2-statistic vs. constant model: 1.83e+03, p-value = 0

Для любой строки в данных значение p не наблюдается, только a 0 или 1 используется индикатор по умолчанию. Калибровка находит коэффициенты модели, и прогнозируемые значения p для отдельных строк могут быть восстановлены с помощью predict функция.

Intercept коэффициент является константой для High Risk уровень (термин aH) и ScoreGroup_Medium Risk и ScoreGroup_Low Risk коэффициенты - это корректировки для Medium Risk и Low Risk уровни (термины aM и aL).

Вероятность по умолчанию p и логарифмические коэффициенты (левая сторона модели) движутся в одном направлении при изменении предикторов. Поэтому, потому что корректировки для Medium Risk и Low Risk отрицательные, ставки по умолчанию ниже для более высокого уровня риска, как и ожидалось. Коэффициент количества лет в книгах также является отрицательным, что согласуется с общей тенденцией к снижению количества лет в книгах, наблюдаемой в данных.

Альтернативным способом подгонки модели является использование fitglm функция из Toolbox™ статистики и машинного обучения. Приведенная выше формула выражается как

Default ~ 1 + ScoreGroup + YOB

1 + ScoreGroup термины учитывают базовую константу и корректировки для уровня риска. Задать необязательный аргумент Distribution кому binomial указать, что требуется логистическая модель (то есть модель с логарифмическими коэффициентами в левой части), следующим образом:

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

Как упоминалось во введении, преимущество пожизненной версии модели с PD, оснащенной fitLifetimePDModel это то, что он предназначен для кредитных приложений, и он может прогнозировать PD в течение всего срока службы и поддерживает инструменты проверки модели, включая графики дискриминации и точности. Дополнительные сведения см. в разделе Обзор пожизненной вероятности моделей по умолчанию.

Для учета эффектов данных панели можно установить более совершенную модель, использующую смешанные эффекты, используя fitglm функция из Toolbox™ статистики и машинного обучения. Хотя в данном примере эта модель не подходит, код очень похож:

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

(1|ID) член в формуле добавляет случайный эффект к модели. Этот эффект является предиктором, значения которого не приведены в данных, но откалиброваны вместе с коэффициентами модели. Случайное значение калибруется для каждого идентификатора. Это дополнительное требование к калибровке существенно увеличивает вычислительное время для соответствия модели в этом случае из-за очень большого количества идентификаторов. Для набора данных панели в этом примере случайный член имеет незначительный эффект. Дисперсия случайных эффектов очень мала, и коэффициенты модели едва изменяются при введении случайного эффекта. Более простая модель логистической регрессии является предпочтительной, поскольку она быстрее поддается калибровке и прогнозированию, а скорости по умолчанию, прогнозируемые для обеих моделей, по существу одинаковы.

Прогнозирование вероятности дефолта для данных обучения и тестирования. predict функция предсказывает условные значения PD, строка за строкой. Мы сохраняем данные для сравнения прогнозов с макромоделью в следующем разделе.

data.PDNoMacro = zeros(height(data),1);

% Predict in-sample
data.PDNoMacro(TrainDataInd) = predict(ModelNoMacro,data(TrainDataInd,:));
% Predict out-of-sample
data.PDNoMacro(TestDataInd) = predict(ModelNoMacro,data(TestDataInd,:));

Чтобы сделать предсказания PD на всю жизнь, используйте predictLifetime функция. Для предсказаний на всю жизнь прогнозируемые значения предикторов требуются для каждого значения ID в наборе данных предсказания. Например, предсказать вероятность выживания для первых двух идентификаторов в наборе данных. См. описание условного ПД (PDNoMacro столбец) и срок службы ПД (LifetimePD столбец) совпадает для первого года каждого идентификатора. После этого года время жизни PD увеличивается, потому что это кумулятивная вероятность. Дополнительные сведения см. в разделе predictLifetime. См. также пример расчета ожидаемых кредитных убытков (ECL).

data1 = data(1:16,:);
data1.LifetimePD = predictLifetime(ModelNoMacro,data1);
disp(data1)
    ID    ScoreGroup     YOB    Default    Year    PDNoMacro    LifetimePD
    __    ___________    ___    _______    ____    _________    __________

    1     Low Risk        1        0       1997    0.0084797    0.0084797 
    1     Low Risk        2        0       1998    0.0067697     0.015192 
    1     Low Risk        3        0       1999    0.0054027     0.020513 
    1     Low Risk        4        0       2000    0.0043105     0.024735 
    1     Low Risk        5        0       2001    0.0034384     0.028088 
    1     Low Risk        6        0       2002    0.0027422     0.030753 
    1     Low Risk        7        0       2003    0.0021867     0.032873 
    1     Low Risk        8        0       2004    0.0017435     0.034559 
    2     Medium Risk     1        0       1997     0.015097     0.015097 
    2     Medium Risk     2        0       1998     0.012069     0.026984 
    2     Medium Risk     3        0       1999    0.0096422     0.036366 
    2     Medium Risk     4        0       2000    0.0076996     0.043785 
    2     Medium Risk     5        0       2001     0.006146     0.049662 
    2     Medium Risk     6        0       2002    0.0049043     0.054323 
    2     Medium Risk     7        0       2003    0.0039125     0.058023 
    2     Medium Risk     8        0       2004    0.0031207     0.060962 

Визуализация посадки в пробе (учебная) или вне пробы (тестовая) с помощью modelAccuracyPlot. Для расчета ставок по умолчанию и средних прогнозируемых значений PD для каждой группы требуется переменная группировки. Используйте годы в книгах в качестве переменной группировки.

DataSetChoice = "Test";
if DataSetChoice=="Training"
   Ind = TrainDataInd;
else
   Ind = TestDataInd;
end
modelAccuracyPlot(ModelNoMacro,data(Ind,:),'YOB','DataID',DataSetChoice)

Figure contains an axes. The axes with title Scatter Grouped by YOB Test No Macro, RMSE = 0.001349 contains 2 objects of type line. These objects represent Observed, No Macro.

Группа баллов может быть введена в качестве второй переменной группировки для визуализации соответствия группам баллов.

modelAccuracyPlot(ModelNoMacro,data(Ind,:),{'YOB' 'ScoreGroup'},'DataID',DataSetChoice)

Figure contains an axes. The axes with title Scatter Grouped by YOB and ScoreGroup Test No Macro, RMSE = 0.0016366 contains 6 objects of type line. These objects represent High Risk, Observed, Medium Risk, Observed, Low Risk, Observed, High Risk, No Macro, Medium Risk, No Macro, Low Risk, No Macro.

Модели пожизненного PD также поддерживают инструменты проверки для распознавания моделей. В частности, modelDiscriminationPlot функция создает график кривой рабочей характеристики приемника (ROC). Здесь для каждой группы баллов запрашивается отдельная кривая ROC. Дополнительные сведения см. в разделе modelDiscriminationPlot.

modelDiscriminationPlot(ModelNoMacro,data(Ind,:),'SegmentBy','ScoreGroup','DataID',DataSetChoice)

Figure contains an axes. The axes with title ROC Test Segmented by ScoreGroup contains 3 objects of type line. These objects represent No Macro, High Risk, AUROC = 0.60996, No Macro, Medium Risk, AUROC = 0.62274, No Macro, Low Risk, AUROC = 0.61918.

Модель ставок по умолчанию, включая макроэкономические переменные

Тенденция, предсказанная с предыдущей моделью, как функция лет на книгах, имеет очень регулярную тенденцию к снижению. Однако данные свидетельствуют о некоторых отклонениях от этой тенденции. Чтобы попытаться учесть эти отклонения, добавьте ежегодный рост валового внутреннего продукта (представленный GDP переменная) и годовая доходность фондового рынка (представленная Market переменная) к модели.

log (p1-p) =aH+aM1M+aL1L+bYOBYOB+bGDPGDP+bMarketMarket+ϵ

Разверните набор данных, чтобы добавить один столбец для GDP и один для Market, используя данные из dataMacro таблица.

data = join(data,dataMacro);
disp(data(1:10,:))
    ID    ScoreGroup     YOB    Default    Year    PDNoMacro     GDP     Market
    __    ___________    ___    _______    ____    _________    _____    ______

    1     Low Risk        1        0       1997    0.0084797     2.72      7.61
    1     Low Risk        2        0       1998    0.0067697     3.57     26.24
    1     Low Risk        3        0       1999    0.0054027     2.86      18.1
    1     Low Risk        4        0       2000    0.0043105     2.43      3.19
    1     Low Risk        5        0       2001    0.0034384     1.26    -10.51
    1     Low Risk        6        0       2002    0.0027422    -0.59    -22.95
    1     Low Risk        7        0       2003    0.0021867     0.63      2.78
    1     Low Risk        8        0       2004    0.0017435     1.85      9.48
    2     Medium Risk     1        0       1997     0.015097     2.72      7.61
    2     Medium Risk     2        0       1998     0.012069     3.57     26.24

Поместите модель с макроэкономическими переменными или макромоделью, расширив формулу модели, чтобы включить GDP и Market переменные.

ModelMacro = fitLifetimePDModel(data(TrainDataInd,:),'logistic',...
   'ModelID','Macro','Description','Logistic model with YOB, score group and macro variables',...
   'IDVar','ID','LoanVars','ScoreGroup','AgeVar','YOB',...
   'MacroVars',{'GDP','Market'},'ResponseVar','Default');
disp(ModelMacro.Model)
Compact generalized linear regression model:
    logit(Default) ~ 1 + ScoreGroup + YOB + GDP + Market
    Distribution = Binomial

Estimated Coefficients:
                               Estimate        SE         tStat       pValue   
                              __________    _________    _______    ___________

    (Intercept)                   -2.667      0.10146    -26.287    2.6919e-152
    ScoreGroup_Medium Risk      -0.70751     0.037108    -19.066     4.8223e-81
    ScoreGroup_Low Risk          -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
    Market                    -0.0071812    0.0028298    -2.5377       0.011159


388018 observations, 388012 error degrees of freedom
Dispersion: 1
Chi^2-statistic vs. constant model: 1.97e+03, p-value = 0

Обе макроэкономические переменные показывают отрицательный коэффициент, что согласуется с интуицией, что более высокий экономический рост снижает ставки дефолта.

Используйте predict функция для прогнозирования условного PD. Для иллюстрации, вот как предсказать условный PD на данных обучения и тестирования с помощью макромодели. Результаты сохраняются как новый столбец в data таблица. Прогнозирование PD на время жизни также поддерживается с помощью predictLifetime , как показано в разделе Модель ставок по умолчанию с использованием группы баллов и годов в книгах.

data.PDMacro = zeros(height(data),1);

% Predict in-sample
data.PDMacro(TrainDataInd) = predict(ModelMacro,data(TrainDataInd,:));
% Predict out-of-sample
data.PDMacro(TestDataInd) = predict(ModelMacro,data(TestDataInd,:));

Графики точности и дискриминации модели предлагают доступные инструменты сравнения для моделей.

Визуализация подгонки в образце или вне образца с помощью modelAccuracyPlot. Передача прогнозов из модели без макроэкономических переменных в качестве эталонной модели. Постройте график с использованием лет в книгах в качестве единственной переменной группировки, а затем с использованием группы баллов в качестве второй переменной группировки.

DataSetChoice = "Test";
if DataSetChoice=="Training"
   Ind = TrainDataInd;
else
   Ind = TestDataInd;
end
modelAccuracyPlot(ModelMacro,data(Ind,:),'YOB','ReferencePD',data.PDNoMacro(Ind),'ReferenceID',ModelNoMacro.ModelID,'DataID',DataSetChoice)

Figure contains an axes. The axes with title Scatter Grouped by YOB Test Macro, RMSE = 0.00060724 No Macro, RMSE = 0.001349 contains 3 objects of type line. These objects represent Observed, Macro, No Macro.

modelAccuracyPlot(ModelMacro,data(Ind,:),{'YOB','ScoreGroup'},'ReferencePD',data.PDNoMacro(Ind),'ReferenceID',ModelNoMacro.ModelID,'DataID',DataSetChoice)

Figure contains an axes. The axes with title Scatter Grouped by YOB and ScoreGroup Test Macro, RMSE = 0.00088425 No Macro, RMSE = 0.0016366 contains 9 objects of type line. These objects represent High Risk, Observed, Medium Risk, Observed, Low Risk, Observed, High Risk, Macro, High Risk, No Macro, Medium Risk, Macro, Medium Risk, No Macro, Low Risk, Macro, Low Risk, No Macro.

Точность прогнозов значительно улучшается по сравнению с моделью без макроэкономических переменных. Прогнозируемые условные значения PD более точно соответствуют структуре наблюдаемых ставок по умолчанию, и сообщаемая среднеквадратическая ошибка (RMSE) значительно меньше, когда макроэкономические переменные включены в модель.

Постройте график ROC-кривой макромодели и модели без макроэкономических переменных для сравнения их эффективности в отношении дискриминации моделей.

modelDiscriminationPlot(ModelMacro,data(Ind,:),'ReferencePD',data.PDNoMacro(Ind),'ReferenceID',ModelNoMacro.ModelID,'DataID',DataSetChoice)

Figure contains an axes. The axes with title ROC Test Macro, AUROC = 0.69341 No Macro, AUROC = 0.68662 contains 2 objects of type line. These objects represent Macro, No Macro.

Дискриминация измеряет ранжирование клиентов по риску. Обе модели работают одинаково с незначительным улучшением, когда к модели добавляются макроэкономические переменные. Это означает, что обе модели выполняют аналогичную работу, разделяя клиентов с низким, средним и высоким риском, присваивая более высокие значения PD клиентам с более высоким риском.

Хотя характеристики распознавания обеих моделей одинаковы, прогнозируемые значения PD более точны для макромодели. Использование инструментов дискриминации и точности важно для проверки модели и сравнения моделей.

Стресс-тестирование вероятности дефолта

Используйте подобранную макромодель для стресс-тестирования прогнозируемых вероятностей по умолчанию.

Предположим, что ниже приведены сценарии стресса для макроэкономических переменных, предоставляемых, например, регулятором.

disp(dataMacroStress)
                 GDP     Market
                _____    ______

    Baseline     2.27    15.02 
    Adverse      1.31     4.56 
    Severe      -0.22    -5.64 

Настройте таблицу основных данных для прогнозирования вероятностей по умолчанию. Это фиктивная таблица данных с одной строкой для каждой комбинации группы баллов и количеством лет в книгах.

dataBaseline = table;
[ScoreGroup,YOB]=meshgrid(1:NumScoreGroups,1:NumYOB);
dataBaseline.ScoreGroup = categorical(ScoreGroup(:),1:NumScoreGroups,...
   categories(data.ScoreGroup),'Ordinal',true);
dataBaseline.YOB = YOB(:);
dataBaseline.ID = ones(height(dataBaseline),1);
dataBaseline.GDP = zeros(height(dataBaseline),1);
dataBaseline.Market = zeros(height(dataBaseline),1);

Чтобы сделать прогнозы, установите одинаковые макроэкономические условия (исходные, неблагоприятные или сильно неблагоприятные) для всех комбинаций групп баллов и количества лет в книгах.

% Predict baseline the probabilities of default
dataBaseline.GDP(:) = dataMacroStress.GDP('Baseline');
dataBaseline.Market(:) = dataMacroStress.Market('Baseline');
dataBaseline.PD = predict(ModelMacro,dataBaseline);

% Predict the probabilities of default in the adverse scenario
dataAdverse = dataBaseline;
dataAdverse.GDP(:) = dataMacroStress.GDP('Adverse');
dataAdverse.Market(:) = dataMacroStress.Market('Adverse');
dataAdverse.PD = predict(ModelMacro,dataAdverse);

% Predict the probabilities of default in the severely adverse scenario
dataSevere = dataBaseline;
dataSevere.GDP(:) = dataMacroStress.GDP('Severe');
dataSevere.Market(:) = dataMacroStress.Market('Severe');
dataSevere.PD = predict(ModelMacro,dataSevere);

Визуализация средней прогнозируемой вероятности дефолта по группам баллов в трех альтернативных сценариях регулирования. Здесь все группы баллов неявно взвешиваются одинаково. Тем не менее, прогнозы также могут быть сделаны на уровне ссуды для любого конкретного портфеля, чтобы сделать прогнозируемые ставки дефолта совместимыми с фактическим распределением ссуд в портфеле. Одна и та же визуализация может быть выполнена для каждой группы баллов отдельно.

PredPDYOB = zeros(NumYOB,3);
PredPDYOB(:,1) = mean(reshape(dataBaseline.PD,NumYOB,NumScoreGroups),2);
PredPDYOB(:,2) = mean(reshape(dataAdverse.PD,NumYOB,NumScoreGroups),2);
PredPDYOB(:,3) = mean(reshape(dataSevere.PD,NumYOB,NumScoreGroups),2);

figure;
bar(PredPDYOB*100);
xlabel('Years on Books')
ylabel('Predicted Default Rate (%)')
legend('Baseline','Adverse','Severe')
title('Stress Test, Probability of Default')
grid on

Figure contains an axes. The axes with title Stress Test, Probability of Default contains 3 objects of type bar. These objects represent Baseline, Adverse, Severe.

Ссылки

  1. Документация по обобщенным линейным моделям: https://www.mathworks.com/help/stats/generalized-linear-regression.html

  2. Документация по обобщенным линейным смешанным эффектам: https://www.mathworks.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-stability

  5. Европейское банковское управление, общеевропейское стресс-тестирование: https://www.eba.europa.eu/risk-analysis-and-data/eu-wide-stress-testing

См. также

| | | | | | | | | |

Связанные примеры

Подробнее