В этом примере показано, как работать с данными о панели потребительского кредита, чтобы создать через цикл (TTC) и модели момента времени (PIT) и сравнить их соответствующие вероятности значения по умолчанию (PD).
PD должника является основным параметром риска в анализе кредитного риска. PD должника зависит от факторов риска для конкретного заказчика, а также макроэкономических факторов риска. Поскольку они включают макроэкономические условия по-другому, модели TTC и PIT производят различные оценки PD.
Мера по кредитному риску TTC, в основном, отражает тренд кредитного риска клиента за длительный срок. Сглаживаются переходные, краткосрочные изменения в кредитном риске, которые, вероятно, будут обращены с течением времени. Преобладающими функциями мер по кредитному риску TTC является своя высокая степень устойчивости по циклу кредита и гладкости изменения в зависимости от времени.
Мера по кредитному риску в области ЯМЫ использует всю доступную и уместную информацию с данной даты, чтобы оценить PD клиента за данный период времени. Информационный набор включает не только ожидания о тренде кредитного риска клиента за длительный срок, но также и географический, макроэкономический, и трендах макрокредита.
Ранее согласно Базелю II правил, регуляторы призвали к использованию ФУНТОВ TTC, потери, данные значение по умолчанию (LGDs) и воздействия в значении по умолчанию (ИДЗ). Однако с к новому IFRS9 и предложенным стандартам бухгалтерского учета CECL, регуляторы теперь требуют, чтобы учреждения использовали проекции PIT ФУНТОВ, LGDs и ИДЗА. Путем составления текущего состояния цикла кредита меры PIT тесно отслеживают изменения значения по умолчанию и уровней потерь в зависимости от времени.
Основной набор данных в этом примере (data
) содержит следующие переменные:
ID —
Идентификатор ссуды.
ScoreGroup —
Кредитный рейтинг в начале ссуды, дискретизированной в три группы: High Risk
, Medium Risk
, и Low Risk
.
YOB —
Годы на книгах.
Default —
Индикатор по умолчанию. Это - переменная отклика.
Year —
Календарный год.
Данные также включают небольшой набор данных (dataMacro
) с макроэкономическими данными в течение соответствующих календарных лет:
Year —
Календарный год.
GDP —
Рост валового внутреннего продукта (год за год).
Market —
Рынок возвращается (год за год).
Переменные YOB
год
, GDP
, и Market
наблюдаются в конце соответствующего календарного года. ScoreGroup
дискретизация исходного кредитного рейтинга когда запущенная ссуда. Значение 1
для Default
средние значения, что ссуда приняла значение по умолчанию в соответствующий календарный год.
Этот пример использует симулированные данные, но можно применить тот же подход к действительным наборам данных.
Загрузите данные и просмотрите первые 10 строк таблицы. Данные о панели сложены, и наблюдения для того же ID хранятся в непрерывных строках, составляя высокую, тонкую таблицу. Панель является несбалансированной, потому что не все идентификаторы имеют то же количество наблюдений.
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, и 1 999 форм три когорты. Никакая ссуда в данных о панели не запускается после 1999. Это изображено более подробно в разделе "Years on Books Versus Calendar Years" примера на Стресс-тестировании Вероятностей Значения по умолчанию Потребительского кредита Используя Данные о Панели. Уменьшающийся тренд в этом графике объяснен тем, что существует только три когорты в данных и что шаблон для каждой когорты уменьшается.
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
, Годы на книгах, GDP и рынке возвращаютсяМодели 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 и предсказания обычно совпадают с наблюдаемыми уровнями.
Другой подход для вычисления ФУНТОВ TTC должен использовать модель PIT и затем заменить GDP
и Market
возвращается с соответствующими средними значениями. В этом подходе вы используете средние значения по целому экономическому циклу (или еще более длинный период) так, чтобы только базовые экономические условия влияли на модель, и любая изменчивость в уровнях по умолчанию происходит из-за других факторов риска. Можно также ввести предсказанные базовые значения для экономики, которые отличаются от среднего значения, наблюдаемого для нового экономического цикла. Например, использование медианы вместо среднего значения уменьшает ошибку.
Можно также использовать этот подход вычисления ФУНТОВ 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
к programmtically получают доступ к 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., Д. Рош и Х. Шеул. Аналитика кредитного риска. Вайли, 2016.