Сравнение вероятности дефолта с использованием сквозных циклических и точечных моделей

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

ПД должника является основным параметром риска при анализе кредитного риска. ПД должника зависит от специфических для клиента факторов риска, а также от макроэкономических факторов риска. Поскольку они по-разному включают макроэкономические условия, модели TTC и PIT дают различные оценки PD.

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

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

Ранее, согласно правилам Базеля II, регуляторы призывали использовать ПД ТТК, убытки при дефолте (ЛГД) и воздействия при дефолте (ЕАД). Однако в связи с новыми IFRS9 и предлагаемыми стандартами учета CECL регулирующие органы теперь требуют, чтобы учреждения использовали прогнозы PIT ДП, LGD и EAD. Учитывая текущее состояние кредитного цикла, показатели PIT тщательно отслеживают изменения коэффициентов дефолта и потерь с течением времени.

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

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

  • ID — Идентификатор кредита.

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

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

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

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

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

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

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

  • Market — Возврат (год за годом).

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

Этот пример использует моделируемые данные, но можно применить тот же подход к реальным наборам данных.

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

load RetailCreditPanelData.mat
disp(head(data,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
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

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

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

DefaultPerYear = groupsummary(data,'Year','mean','Default');
NumYears = height(DefaultPerYear);
disp(DefaultPerYear)
    Year    GroupCount    mean_Default
    ____    __________    ____________

    1997      35214         0.018629  
    1998      66716         0.013355  
    1999      94639         0.012733  
    2000      92891         0.011379  
    2001      91140         0.010742  
    2002      89847         0.010295  
    2003      88449        0.0056417  
    2004      87828        0.0032905  
subplot(2,1,1)
scatter(DefaultPerYear.Year, DefaultPerYear.mean_Default*100,'*');
grid on
xlabel('Year')
ylabel('Default Rate (%)')
title('Default Rate per Year')
% Get IDs of the 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);
% 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 calendar year
Year = unique(data.Year);
subplot(2,1,2)
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 2 axes. Axes 1 with title Default Rate per Year contains an object of type scatter. Axes 2 with title Default Rate vs. Calendar Year contains 3 objects of type line. These objects represent Cohort 97, Cohort 98, Cohort 99.

График показывает, что скорость по умолчанию уменьшается с течением времени. Заметьте в графике, что кредиты начиная с 1997, 1998 и 1999 годов образуют три когорты. Ни один кредит в панель данных не начинается после 1999 года. Более подробно это показано в разделе «Годы по книгам в сравнении с календарными годами» примера «Стресс- Проверка вероятностей дефолта потребительского кредита с использованием Панели Данных». Уменьшение тренда на этом графике объясняется тем, что в данных только три когорты и что шаблон для каждой когорты уменьшается.

Модель TTC с использованием ScoreGroup и Годы книг

Модели TTC в значительной степени не затронуты экономическими условиями. Первая модель TTC в этом примере использует только ScoreGroup и YOB как предикторы скорости по умолчанию.

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

NumTraining = floor(0.6*nIDs);

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

Используйте fitLifetimePDModel функция для соответствия логистической модели.

TTCModel = fitLifetimePDModel(data(TrainDataInd,:),'logistic',...
   'ModelID','TTC','IDVar','ID','AgeVar','YOB','LoanVars','ScoreGroup',...
   'ResponseVar','Default');
disp(TTCModel.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

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

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

% Predict the in-sample
data.TTCPD(TrainDataInd) = predict(TTCModel,data(TrainDataInd,:));
% Predict the out-of-sample
data.TTCPD(TestDataInd) = predict(TTCModel,data(TestDataInd,:));

Визуализация подгонки в образце и подгонки из образца с помощью modelAccuracyPlot.

figure;
subplot(2,1,1)
modelAccuracyPlot(TTCModel,data(TrainDataInd,:),'Year','DataID',"Training Data")
subplot(2,1,2)
modelAccuracyPlot(TTCModel,data(TestDataInd,:),'Year','DataID',"Testing Data")

Figure contains 2 axes. Axes 1 with title Scatter Grouped by Year Training Data TTC, RMSE = 0.0016556 contains 2 objects of type line. These objects represent Observed, TTC. Axes 2 with title Scatter Grouped by Year Testing Data TTC, RMSE = 0.0019761 contains 2 objects of type line. These objects represent Observed, TTC.

PIT- Модели с использованием ScoreGroup, Годы по книгам, ВВП и рыночным возвратам

Модели PIT варьируются в зависимости от экономического цикла. Модель PIT в этом примере использует ScoreGroup, YOB, GDP, и Market как предикторы скорости по умолчанию. Используйте fitLifetimePDModel функция для соответствия логистической модели.

% Add the GDP and Market returns columns to the original data

data = join(data, dataMacro);
disp(head(data,10))
    ID    ScoreGroup     YOB    Default    Year      TTCPD       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
PITModel = fitLifetimePDModel(data(TrainDataInd,:),'logistic',...
   'ModelID','PIT','IDVar','ID','AgeVar','YOB','LoanVars','ScoreGroup',...
   'MacroVars',{'GDP' 'Market'},'ResponseVar','Default');
disp(PITModel.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

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

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

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

Визуализация подгонки в образце и подгонки из образца с помощью modelAccuracyPlot.

figure;
subplot(2,1,1)
modelAccuracyPlot(PITModel,data(TrainDataInd,:),'Year','DataID',"Training Data")
subplot(2,1,2)
modelAccuracyPlot(PITModel,data(TestDataInd,:),'Year','DataID',"Testing Data")

Figure contains 2 axes. Axes 1 with title Scatter Grouped by Year Training Data PIT, RMSE = 0.00035546 contains 2 objects of type line. These objects represent Observed, PIT. Axes 2 with title Scatter Grouped by Year Testing Data PIT, RMSE = 0.0006322 contains 2 objects of type line. These objects represent Observed, PIT.

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

Вычислите TTC PD с помощью модели PIT

Другой подход для вычисления PD TTC состоит в том, чтобы использовать модель PIT, а затем заменить GDP и Market возвращается с соответствующими средними значениями. В этом подходе вы используете средние значения в течение всего экономического цикла (или даже более длительного периода), так что только базовые экономические условия влияют на модель, и любая изменчивость ставок по умолчанию связана с другими факторами риска. Можно также ввести прогнозные базовые значения для экономики, которые отличаются от среднего значения, наблюдаемого для последнего экономического цикла. Например, использование медианы вместо среднего уменьшает ошибку.

Можно также использовать этот подход вычисления PD TTC, используя модель PIT в качестве инструмента для анализа сценариев; это невозможно сделать в первой версии модели TTC. Дополнительным преимуществом этого подхода является то, что вы можете использовать одну модель как для предсказаний TTC, так и для прогнозов PIT. Это означает, что вам нужно проверить и сохранить только одну модель.

% Modify the data to replace the GDP and Market returns with the corresponding average values
data.GDP(:) = median(data.GDP);
data.Market = repmat(mean(data.Market), height(data), 1);
disp(head(data,10));
    ID    ScoreGroup     YOB    Default    Year      TTCPD      GDP     Market      PITPD  
    __    ___________    ___    _______    ____    _________    ____    ______    _________

    1     Low Risk        1        0       1997    0.0084797    1.85    3.2263    0.0093187
    1     Low Risk        2        0       1998    0.0067697    1.85    3.2263     0.005349
    1     Low Risk        3        0       1999    0.0054027    1.85    3.2263    0.0044938
    1     Low Risk        4        0       2000    0.0043105    1.85    3.2263    0.0038285
    1     Low Risk        5        0       2001    0.0034384    1.85    3.2263    0.0035402
    1     Low Risk        6        0       2002    0.0027422    1.85    3.2263    0.0035259
    1     Low Risk        7        0       2003    0.0021867    1.85    3.2263    0.0018336
    1     Low Risk        8        0       2004    0.0017435    1.85    3.2263    0.0010921
    2     Medium Risk     1        0       1997     0.015097    1.85    3.2263     0.016554
    2     Medium Risk     2        0       1998     0.012069    1.85    3.2263    0.0095319

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

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

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

Визуализация подгонки в образце и подгонки из образца с помощью modelAccuracyPlot.

f = figure;
subplot(2,1,1)
modelAccuracyPlot(PITModel,data(TrainDataInd,:),'Year','DataID',"Training, Macro Average")
subplot(2,1,2)
modelAccuracyPlot(PITModel,data(TestDataInd,:),'Year','DataID',"Testing, Macro Average")

Figure contains 2 axes. Axes 1 with title Scatter Grouped by Year Training, Macro Average PIT, RMSE = 0.0029488 contains 2 objects of type line. These objects represent Observed, PIT. Axes 2 with title Scatter Grouped by Year Testing, Macro Average PIT, RMSE = 0.0034313 contains 2 objects of type line. These objects represent Observed, PIT.

Сбросьте исходные значения GDP и Market переменные. Значения PD TTC, предсказанные с использованием модели PIT, и медианные или средние значения макроса сохраняются в TTCPD2 столбец и этот столбец используются для сравнения предсказаний с другими моделями ниже.

data.GDP = [];
data.Market = [];
data = join(data,dataMacro);
disp(head(data,10))
    ID    ScoreGroup     YOB    Default    Year      TTCPD        PITPD       TTCPD2       GDP     Market
    __    ___________    ___    _______    ____    _________    _________    _________    _____    ______

    1     Low Risk        1        0       1997    0.0084797    0.0093187     0.010688     2.72      7.61
    1     Low Risk        2        0       1998    0.0067697     0.005349    0.0077772     3.57     26.24
    1     Low Risk        3        0       1999    0.0054027    0.0044938    0.0056548     2.86      18.1
    1     Low Risk        4        0       2000    0.0043105    0.0038285    0.0041093     2.43      3.19
    1     Low Risk        5        0       2001    0.0034384    0.0035402    0.0029848     1.26    -10.51
    1     Low Risk        6        0       2002    0.0027422    0.0035259    0.0021674    -0.59    -22.95
    1     Low Risk        7        0       2003    0.0021867    0.0018336    0.0015735     0.63      2.78
    1     Low Risk        8        0       2004    0.0017435    0.0010921    0.0011422     1.85      9.48
    2     Medium Risk     1        0       1997     0.015097     0.016554     0.018966     2.72      7.61
    2     Medium Risk     2        0       1998     0.012069    0.0095319     0.013833     3.57     26.24

Сравнение моделей

Сначала сравните две версии модели TTC.

Сравните дискриминацию модели с помощью modelDiscriminationPlot. Две модели имеют очень сходных клиентов с рейтингом эффективности, измеренных кривой рабочей характеристики приемника (ROC) и областью под кривой ROC (AUROC, или просто AUC) метрикой.

figure;
modelDiscriminationPlot(TTCModel,data(TestDataInd,:),"DataID",'Testing data',"ReferencePD",data.TTCPD2(TestDataInd),"ReferenceID",'TTC 2, Macro Average')

Figure contains an axes. The axes with title ROC Testing data TTC, AUROC = 0.68662 TTC 2, Macro Average, AUROC = 0.68281 contains 2 objects of type line. These objects represent TTC, TTC 2, Macro Average.

Однако модель TTC более точна, предсказанные значения PD ближе к наблюдаемым скоростям по умолчанию. График сгенерирован с помощью modelAccuracyPlot демонстрирует, что корневая средняя квадратичная невязка (RMSE), сообщенная на графике, подтверждает, что модель TTC более точна для этого набора данных.

modelAccuracyPlot(TTCModel,data(TestDataInd,:),'Year',"DataID",'Testing data',"ReferencePD",data.TTCPD2(TestDataInd),"ReferenceID",'TTC 2, Macro Average')

Figure contains an axes. The axes with title Scatter Grouped by Year Testing data TTC, RMSE = 0.0019761 TTC 2, Macro Average, RMSE = 0.0034313 contains 3 objects of type line. These objects represent Observed, TTC, TTC 2, Macro Average.

Использование modelDiscriminationPlot сравнение модели TTC и модели PIT.

AUROC лишь немного лучше подходит для модели PIT, показывая, что обе модели сопоставимы относительно ранжирования клиентов по риску.

figure;
modelDiscriminationPlot(TTCModel,data(TestDataInd,:),"DataID",'Testing data',"ReferencePD",data.PITPD(TestDataInd),"ReferenceID",'PIT')

Figure contains an axes. The axes with title ROC Testing data TTC, AUROC = 0.68662 PIT, AUROC = 0.69341 contains 2 objects of type line. These objects represent TTC, PIT.

Использование modelAccuracyPlot чтобы визуализировать точность модели или калибровку модели. График показывает, что модель PIT работает намного лучше, с предсказанными значениями PD гораздо ближе к наблюдаемым скоростям дефолта. Это ожидается, поскольку предсказания чувствительны к макро- переменные, в то время как модель TTC использует только начальные счета и возраст модели, чтобы сделать предсказания.

modelAccuracyPlot(TTCModel,data(TestDataInd,:),'Year',"DataID",'Testing data',"ReferencePD",data.PITPD(TestDataInd),"ReferenceID",'PIT')

Figure contains an axes. The axes with title Scatter Grouped by Year Testing data TTC, RMSE = 0.0019761 PIT, RMSE = 0.0006322 contains 3 objects of type line. These objects represent Observed, TTC, PIT.

Можно использовать modelDiscrimination программный доступ к AUROC и RMSE без создания графика.

DiscMeasure = modelDiscrimination(TTCModel,data(TestDataInd,:),"DataID",'Testing data',"ReferencePD",data.PITPD(TestDataInd),"ReferenceID",'PIT');
disp(DiscMeasure)
                          AUROC 
                         _______

    TTC, Testing data    0.68662
    PIT, Testing data    0.69341
AccMeasure = modelAccuracy(TTCModel,data(TestDataInd,:),'Year',"DataID",'Testing data',"ReferencePD",data.PITPD(TestDataInd),"ReferenceID",'PIT');
disp(AccMeasure)
                                            RMSE   
                                          _________

    TTC, grouped by Year, Testing data    0.0019761
    PIT, grouped by Year, Testing data    0.0006322

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

Ссылки

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

  2. Baesens, B., D. Rosch, and H. Scheule. Аналитика кредитных рисков. Уайли, 2016.