exponenta event banner

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

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

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

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

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

Ранее, согласно правилам Базеля II, регуляторы призывали к использованию ТТК-PDs, потерь по умолчанию (LGD) и рисков по умолчанию (EAD). Однако в отношении новых IFRS9 и предлагаемых стандартов учета CECL регуляторы теперь требуют от учреждений использовать прогнозы PIT по PDs, 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 в этом примере использует только 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

Прогнозирование ПД для наборов данных обучения и тестирования с использованием 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 в этом примере использует 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

Прогнозирование ПД для обучения и тестирования наборов данных с использованием 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, и прогнозы обычно соответствуют наблюдаемым показателям.

Расчет PD TTC с использованием модели PIT

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

Однако этот подход можно также использовать для расчета ПД ТТК с использованием модели 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

Прогнозирование ПД для обучения и тестирования наборов данных с использованием 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. Бэзенс, Б., Д. Рош и Х. Шёле. Аналитика кредитных рисков. Уайли, 2016.