В этом примере показано, как работать с данными панели потребительских кредитов для создания моделей на протяжении всего цикла (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
График показывает, что скорость по умолчанию уменьшается с течением времени. Заметьте в графике, что кредиты начиная с 1997, 1998 и 1999 годов образуют три когорты. Ни один кредит в панель данных не начинается после 1999 года. Более подробно это показано в разделе «Годы по книгам в сравнении с календарными годами» примера «Стресс- Проверка вероятностей дефолта потребительского кредита с использованием Панели Данных». Уменьшение тренда на этом графике объясняется тем, что в данных только три когорты и что шаблон для каждой когорты уменьшается.
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")
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")
В модели PIT, как и ожидалось, предсказания соответствуют наблюдаемым скоростям дефолта более тесно, чем в модели TTC. Хотя этот пример использует моделируемые данные, качественно такой же тип улучшения модели ожидается при переходе от моделей TTC к моделям PIT для данных реального мира, хотя общая ошибка может быть больше, чем в этом примере. Подгонка модели PIT обычно лучше, чем подгонка модели TTC, и предсказания обычно совпадают с наблюдаемыми скоростями.
Другой подход для вычисления 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")
Сбросьте исходные значения 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')
Однако модель TTC более точна, предсказанные значения PD ближе к наблюдаемым скоростям по умолчанию. График сгенерирован с помощью modelAccuracyPlot
демонстрирует, что корневая средняя квадратичная невязка (RMSE), сообщенная на графике, подтверждает, что модель TTC более точна для этого набора данных.
modelAccuracyPlot(TTCModel,data(TestDataInd,:),'Year',"DataID",'Testing data',"ReferencePD",data.TTCPD2(TestDataInd),"ReferenceID",'TTC 2, Macro Average')
Использование modelDiscriminationPlot
сравнение модели TTC и модели PIT.
AUROC лишь немного лучше подходит для модели PIT, показывая, что обе модели сопоставимы относительно ранжирования клиентов по риску.
figure; modelDiscriminationPlot(TTCModel,data(TestDataInd,:),"DataID",'Testing data',"ReferencePD",data.PITPD(TestDataInd),"ReferenceID",'PIT')
Использование modelAccuracyPlot
чтобы визуализировать точность модели или калибровку модели. График показывает, что модель PIT работает намного лучше, с предсказанными значениями PD гораздо ближе к наблюдаемым скоростям дефолта. Это ожидается, поскольку предсказания чувствительны к макро- переменные, в то время как модель TTC использует только начальные счета и возраст модели, чтобы сделать предсказания.
modelAccuracyPlot(TTCModel,data(TestDataInd,:),'Year',"DataID",'Testing data',"ReferencePD",data.PITPD(TestDataInd),"ReferenceID",'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 может быть предпочтительной, если важно иметь более стабильные предсказания с течением времени.
Документация обобщенных линейных моделей: https://www.mathworks.com/help/stats/generalized-linear-regression.html
Baesens, B., D. Rosch, and H. Scheule. Аналитика кредитных рисков. Уайли, 2016.