В этом примере показано, как работать с данными панели потребительского кредита для создания моделей на протяжении цикла (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

График показывает, что скорость по умолчанию уменьшается с течением времени. Заметьте в сюжете, что займы начиная с 1997, 1998 и 1999 годов образуют три когорты. Никакие ссуды в данных панели не начинаются после 1999 года. Это более подробно показано в разделе «Годы в книгах и календарные годы» примера «Стресс-тестирование вероятностей дефолта потребительского кредита с использованием панельных данных». Тенденция к снижению на этом графике объясняется тем, что в данных есть только три когорты и что закономерность для каждой когорты уменьшается.
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")

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")

В модели PIT, как и ожидалось, прогнозы соответствуют наблюдаемым ставкам по умолчанию более близко, чем в модели TTC. Хотя в этом примере используются смоделированные данные, качественно при переходе от моделей TTC к моделям PIT для реальных данных ожидается тот же тип улучшения модели, хотя общая ошибка может быть больше, чем в этом примере. Посадка модели PIT обычно лучше, чем посадка модели TTC, и прогнозы обычно соответствуют наблюдаемым показателям.
Другой подход к расчету 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")

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