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

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

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

Стандартная логистическая регрессионая модель, тип обобщенной линейной модели, подгоняется к данным розничной кредитной панели с макроэкономическими предикторами и без них, используя fitLifetimePDModel из Risk Management 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. Шансы на дефолт определены как 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 не наблюдается, только 0 или 1 наблюдается индикатор по умолчанию. Калибровка находит коэффициенты модели, и предсказанные значения p для отдельных строк могут быть восстановлены с помощью predict функция.

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

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

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

Default ~ 1 + ScoreGroup + YOB

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

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

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

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

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

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

Предсказать вероятность дефолта для данных обучения и проверки. The 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 в наборе данных предсказания. Для примера спрогнозируйте вероятность выживания для первых двух идентификаторов в наборе данных. Посмотрите, как условный PD (PDNoMacro столбец) и срок службы PD (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, данные (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, данные (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

См. также

| | | | | | | | | |

Похожие примеры

Подробнее о