В этом примере показано, как работать с данными потребительской (розничной) кредитной панели для визуализации наблюдаемых ставок дефолта на разных уровнях. Это также показывает, как подогнать модель для предсказания вероятностей значений PD по умолчанию (PD) и жизни и выполнить анализ стресс-тестирования.
Набор панели данных потребительских кредитов позволяет вам идентифицировать шаблоны ставки дефолта для кредитов разного возраста или лет в книгах. Можно использовать информацию о группе счетов для различения ставок по умолчанию для различных уровней счетов. В сложение можно использовать макроэкономическую информацию, чтобы оценить, как состояние экономики влияет на ставки дефолта потребительского кредита.
Стандартная логистическая регрессионая модель, тип обобщенной линейной модели, подгоняется к данным розничной кредитной панели с макроэкономическими предикторами и без них, используя fitLifetimePDModel из Risk Management Toolbox™. Хотя та же модель может быть установлена с помощью fitglm функция от Statistics and Machine Learning Toolbox™, пожизненная версия модели вероятности дефолта (PD) предназначена для кредитных приложений и поддерживает пожизненное предсказание PD и инструменты валидации модели, включая графики дискриминации и точности, показанные в этом примере. Пример также описывает аппроксимацию более совершенной модели для учета эффектов данных панели, обобщенной модели линейных смешанных эффектов. Однако эффекты панели незначительны для набора данных в этом примере, и стандартная логистическая модель предпочтительна для эффективности.
Логистическая регрессионная модель предсказывает вероятности дефолта для всех уровней счета, лет в книгах и макроэкономических сценариев переменных. Существует краткое обсуждение того, как предсказать значения PD в течение жизни, с указателями на дополнительную функциональность. В примере показаны инструменты распознавания моделей и точности моделей для валидации и сравнения моделей. В последнем разделе этого примера логистическая модель используется для анализа стресс-тестирования, модель предсказывает вероятности дефолта для данного базового уровня, а также вероятности дефолта для неблагоприятных и серьезно неблагоприятных макроэкономических сценариев.
Для получения дополнительной информации смотрите Обзор жизненной вероятности моделей по умолчанию. См. также пример Вероятности моделирования дефолта с пропорциональными рисками Кокса, который следует тому же рабочему процессу, но использует регрессию Кокса вместо логистической регрессии, а также имеет информацию об расчете PD в течение жизни и ожидаемого кредитного убытка (ECL).
Основной набор данных (data) содержит следующие переменные:
ID: Идентификатор кредита.
ScoreGroup: Кредитный счет в начале кредита, дискретизированный в три группы: High Risk, Medium Risk, и Low Risk.
YOB: Годы по книгам.
Default: Индикатор по умолчанию. Это переменная отклика.
Year: Календарный год.
Существует также небольшой набор данных (dataMacro) с макроэкономическими данными за соответствующие календарные годы:
Year: Календарный год.
GDP:: Рост валового внутреннего продукта (год за годом).
Market: Возврат рынка (год за годом).
Переменные YOB, Year, GDP, и Market наблюдаются в конце соответствующего календарного года. Группа баллов является дискретизацией исходного кредитного счета, когда кредит начался. Значение 1 для Default означает, что кредит по дефолту в соответствующем календарном году.
Существует также третий набор данных (dataMacroStress) с исходным, неблагоприятным и серьезно неблагоприятным сценариями для макроэкономических переменных. Эта таблица используется для анализа стресс-тестирования.
Этот пример использует моделируемые данные, но тот же подход был успешно применен к реальным наборам данных.
Загрузите данные и просмотрите первые 10 и последние 10 строк таблицы. Данные панели сложены, в том смысле, что наблюдения за тем же идентификатором хранятся в смежных строках, создавая высокую, тонкую таблицу. Панель не сбалансирована, потому что не все идентификаторы имеют одинаковое количество наблюдений.
load RetailCreditPanelData.mat fprintf('\nFirst ten rows:\n')
First ten rows:
disp(data(1: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
fprintf('Last ten rows:\n')Last ten rows:
disp(data(end-9:end,:))
ID ScoreGroup YOB Default Year
_____ ___________ ___ _______ ____
96819 High Risk 6 0 2003
96819 High Risk 7 0 2004
96820 Medium Risk 1 0 1997
96820 Medium Risk 2 0 1998
96820 Medium Risk 3 0 1999
96820 Medium Risk 4 0 2000
96820 Medium Risk 5 0 2001
96820 Medium Risk 6 0 2002
96820 Medium Risk 7 0 2003
96820 Medium Risk 8 0 2004
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
Используйте группу кредитных счетов как сгруппированную переменную для вычисления наблюдаемой ставки по умолчанию для каждой группы счетов. Для этого используйте groupsummary функция для вычисления среднего значения Default переменная, группировка по ScoreGroup переменная. Постройте график результатов на столбчатой диаграмме. Как ожидалось, дефолтная ставка снижается по мере улучшения качества кредита.
DefRateByScore = groupsummary(data,'ScoreGroup','mean','Default'); NumScoreGroups = height(DefRateByScore); disp(DefRateByScore)
ScoreGroup GroupCount mean_Default
___________ __________ ____________
High Risk 2.0999e+05 0.017167
Medium Risk 2.1743e+05 0.0086006
Low Risk 2.193e+05 0.0046784
bar(DefRateByScore.ScoreGroup,DefRateByScore.mean_Default*100) title('Default Rate vs. Score Group') xlabel('Score Group') ylabel('Observed Default Rate (%)') grid on

Затем вычислите ставки по умолчанию, группировка по годам в книгах (представлено YOB переменная). В результате ставки являются условными годичными ставками дефолта. Например, дефолтная ставка за третий год по бухгалтерским книгам - это доля кредитов, дефолтующих на третий год, относительно количества кредитов, которые находятся в портфеле за второй год. Другими словами, ставка по умолчанию для третьего года - это количество строк с YOB = 3 и Default = 1, разделенная на количество строк с YOB = 3.
Постройте график результатов. Существует явный тренд к снижению, при этом показатели дефолта снижаются по мере увеличения количества лет в книгах. Три и четыре года имеют одинаковые коэффициенты дефолта. Однако из этого графика неясно, является ли это характеристикой кредитного продукта или эффектом макроэкономического окружения.
DefRateByYOB = groupsummary(data,'YOB','mean','Default'); NumYOB = height(DefRateByYOB); disp(DefRateByYOB)
YOB GroupCount mean_Default
___ __________ ____________
1 96820 0.017507
2 94535 0.012704
3 92497 0.011168
4 91068 0.010728
5 89588 0.0085949
6 88570 0.006413
7 61689 0.0033231
8 31957 0.0016272
plot(double(DefRateByYOB.YOB),DefRateByYOB.mean_Default*100,'-*') title('Default Rate vs. Years on Books') xlabel('Years on Books') ylabel('Observed Default Rate (%)') grid on

Теперь сгруппируйте как по счету группе, так и по количеству лет по книгам, а затем стройте графики результатов. График показывает, что все группы счетов ведут себя аналогично по мере развития времени с общим трендом к снижению. Три и четыре года являются исключением из тренда: ставки сглаживаются для High Risk группируйте, и поднимайтесь в третьем году для Low Risk группа.
DefRateByScoreYOB = groupsummary(data,{'ScoreGroup','YOB'},'mean','Default');
% Display output table to show the way it is structured
% Display only the first 10 rows, for brevity
disp(DefRateByScoreYOB(1:10,:)) ScoreGroup YOB GroupCount mean_Default
___________ ___ __________ ____________
High Risk 1 32601 0.029692
High Risk 2 31338 0.021252
High Risk 3 30138 0.018448
High Risk 4 29438 0.018276
High Risk 5 28661 0.014794
High Risk 6 28117 0.011168
High Risk 7 19606 0.0056615
High Risk 8 10094 0.0027739
Medium Risk 1 32373 0.014302
Medium Risk 2 31775 0.011676
DefRateByScoreYOB2 = reshape(DefRateByScoreYOB.mean_Default,... NumYOB,NumScoreGroups); plot(DefRateByScoreYOB2*100,'-*') title('Default Rate vs. Years on Books') xlabel('Years on Books') ylabel('Observed Default Rate (%)') legend(categories(data.ScoreGroup)) grid on

Данные содержат три группы, или винтажи: кредиты, начатые в 1997, 1998 и 1999 годах. Ссуда в данных панели не началась после 1999 года.
В этом разделе показано, как визуализировать частоту по умолчанию для каждой когорты отдельно. Ставки по умолчанию для всех когорт построены как с учетом количества лет в книгах, так и с учетом календарного года. Шаблоны в годах по книгам предполагают характеристики кредитного продукта. Шаблоны в календарные годы предполагают влияние макроэкономического окружения.
С двух по четыре года на книгах кривые показывают различные шаблоны для трех когорт. Однако при построении графика относительно календарного года три когорты показывают аналогичное поведение с 2000 по 2002 год. Кривые уплощаются в течение этого периода.
% Get IDs of 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); % IDs2000AndUp is unused, it is only computed to show that this is empty, % no loans started after 1999 IDs2000AndUp = 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 years on books plot(ObsDefRate1997.YOB,ObsDefRate1997.mean_Default*100,'-*') hold on plot(ObsDefRate1998.YOB,ObsDefRate1998.mean_Default*100,'-*') plot(ObsDefRate1999.YOB,ObsDefRate1999.mean_Default*100,'-*') hold off title('Default Rate vs. Years on Books') xlabel('Years on Books') ylabel('Default Rate (%)') legend('Cohort 97','Cohort 98','Cohort 99') grid on

% Plot against the calendar year Year = unique(data.Year); 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

После того, как вы визуализируете данные, можно создать прогнозирующие модели для скоростей по умолчанию.
Разделите данные панели на наборы для обучения и тестирования, определяя эти наборы на основе идентификационных номеров.
NumTraining = floor(0.6*nIDs); rng('default'); % for reproducibility TrainIDInd = randsample(nIDs,NumTraining); TrainDataInd = ismember(data.ID,UniqueIDs(TrainIDInd)); TestDataInd = ~TrainDataInd;
Первая модель использует только группу счетов и количество лет в книгах в качестве предикторов скорости по умолчанию p. Шансы на дефолт определены как p/( 1-p). Логистическая модель связывает логарифм шансов, или журнал шансов, с предикторами следующим образом:
1M является индикатором со значением 1 для Medium Risk займы и 0 в противном случае и аналогично для 1L для Low Risk займы. Это стандартный способ обработки категориального предиктора, такого как ScoreGroup. Фактически существует разная константа для каждого уровня риска: aH для High Risk, aH + aM для Medium Risk, и aH + aL для Low Risk.
ModelNoMacro = fitLifetimePDModel(data(TrainDataInd,:),'logistic',... 'ModelID','No Macro','Description','Logistic model with YOB and score group, but no macro variables',... 'IDVar','ID','LoanVars','ScoreGroup','AgeVar','YOB','ResponseVar','Default'); disp(ModelNoMacro.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
Для любой строки в данных значение p не наблюдается, только 0 или 1 наблюдается индикатор по умолчанию. Калибровка находит коэффициенты модели, и предсказанные значения p для отдельных строк могут быть восстановлены с помощью predict функция.
The Intercept коэффициент является константой для High Risk уровень (термин aH) и ScoreGroup_Medium Risk и ScoreGroup_Low Risk коэффициенты являются корректировками для Medium Risk и Low Risk уровни (условия aM и aL).
Вероятность по умолчанию p и шансы журнала (левая сторона модели) движутся в том же направлении, когда изменяются предикторы. Поэтому, потому что корректировки для Medium Risk и Low Risk отрицательные, ставки по умолчанию ниже для лучших уровней риска, как и ожидалось. Коэффициент количества лет на книгах также отрицательный, что согласуется с общим трендом к снижению количества лет на книгах, наблюдаемых в данных.
Альтернативным способом подгонки модели является использование fitglm функция из Statistics and Machine Learning Toolbox™. Приведенная выше формула выражена как
Default ~ 1 + ScoreGroup + YOB
The 1 + ScoreGroup условия учитывают базовую константу и корректировки уровня риска. Установите необязательный аргумент Distribution на binomial чтобы указать, что требуется логистическая модель (то есть модель с журналом шансами на левой стороне), следующим образом:
ModelNoMacro = fitglm(data(TrainDataInd,:), 'Default ~ 1 + ScoreGroup + YOB','Distribution','binomial');
Как упоминалось во введении, преимущество пожизненной версии PD модели, оснащенной fitLifetimePDModel это то, что он предназначен для кредитных приложений, и он может предсказывать PD в течение жизни и поддерживает инструменты валидации модели, включая графики дискриминации и точности. Для получения дополнительной информации смотрите Обзор Жизненной вероятности моделей по умолчанию.
Для учета эффектов данных панели, более продвинутая модель, использующая смешанные эффекты, может быть установлена с помощью fitglm функция из Statistics and Machine Learning Toolbox™. Хотя эта модель не подгоняется в этом примере, код очень похож:
ModelNoMacro = fitglme(data(TrainDataInd,:),'Default ~ 1 + ScoreGroup + YOB + (1|ID)','Distribution','binomial');
The (1|ID) термин в формуле добавляет в модель случайный эффект. Этот эффект является предиктором, значения которого не заданы в данных, а калибруются вместе с коэффициентами модели. Случайное значение калибруется для каждого идентификатора. Это дополнительное требование калибровки существенно увеличивает вычислительное время для соответствия модели в этом случае из-за очень большого количества идентификаторов. Для панели набора данных в этом примере случайный термин имеет незначительный эффект. Отклонение случайных эффектов очень мала, и коэффициенты модели едва изменяются, когда вводится случайный эффект. Более простая модель логистической регрессии предпочтительна, потому что она быстрее калибровать и прогнозировать, а скорости по умолчанию, предсказанные с обеими моделями, по существу одинаковы.
Предсказать вероятность дефолта для данных обучения и проверки. The predict функция предсказывает условные значения PD, строка за строкой. Мы храним данные, чтобы сравнить предсказания с макросом, модель в следующем разделе.
data.PDNoMacro = zeros(height(data),1); % Predict in-sample data.PDNoMacro(TrainDataInd) = predict(ModelNoMacro,data(TrainDataInd,:)); % Predict out-of-sample data.PDNoMacro(TestDataInd) = predict(ModelNoMacro,data(TestDataInd,:));
Чтобы сделать предсказания PD в течение жизни, используйте predictLifetime функция. Для пожизненных предсказаний проективные значения предикторов требуются для каждого значения ID в наборе данных предсказания. Для примера спрогнозируйте вероятность выживания для первых двух идентификаторов в наборе данных. Посмотрите, как условный PD (PDNoMacro столбец) и срок службы PD (LifetimePD столбец) совпадают для первого года каждого идентификатора. После этого года время жизни PD увеличивается, потому что это совокупная вероятность. Для получения дополнительной информации смотрите predictLifetime. См. также пример расчета ожидаемого кредитного убытка (ECL).
data1 = data(1:16,:); data1.LifetimePD = predictLifetime(ModelNoMacro,data1); disp(data1)
ID ScoreGroup YOB Default Year PDNoMacro LifetimePD
__ ___________ ___ _______ ____ _________ __________
1 Low Risk 1 0 1997 0.0084797 0.0084797
1 Low Risk 2 0 1998 0.0067697 0.015192
1 Low Risk 3 0 1999 0.0054027 0.020513
1 Low Risk 4 0 2000 0.0043105 0.024735
1 Low Risk 5 0 2001 0.0034384 0.028088
1 Low Risk 6 0 2002 0.0027422 0.030753
1 Low Risk 7 0 2003 0.0021867 0.032873
1 Low Risk 8 0 2004 0.0017435 0.034559
2 Medium Risk 1 0 1997 0.015097 0.015097
2 Medium Risk 2 0 1998 0.012069 0.026984
2 Medium Risk 3 0 1999 0.0096422 0.036366
2 Medium Risk 4 0 2000 0.0076996 0.043785
2 Medium Risk 5 0 2001 0.006146 0.049662
2 Medium Risk 6 0 2002 0.0049043 0.054323
2 Medium Risk 7 0 2003 0.0039125 0.058023
2 Medium Risk 8 0 2004 0.0031207 0.060962
Визуализируйте подгонку в выборке (обучение) или вне выборки (тест) с помощью modelAccuracyPlot. Это требует сгруппированной переменной, чтобы вычислить скорости по умолчанию и средние предсказанные значения PD для каждой группы. Здесь используйте годы в книгах как сгруппированную переменную.
DataSetChoice ="Test"; if DataSetChoice = ="Training" Ind = TrainDataInd; else Ind = TestDataInd; end modelAccuracyPlot (ModelNoMacro, данные (Ind,:),'YOB','DataID', DataSetChoice)

Группа счетов может быть введена как вторая сгруппированная переменная, чтобы визуализировать подгонку по группам счетов.
modelAccuracyPlot(ModelNoMacro,data(Ind,:),{'YOB' 'ScoreGroup'},'DataID',DataSetChoice)
Модели PD в течение жизни также поддерживают инструменты валидации для дискриминации моделей. В частности, modelDiscriminationPlot функция создает приемник график кривой рабочей характеристики (ROC). Здесь запрашивается отдельная кривая ROC для каждой группы счетов. Для получения дополнительной информации смотрите modelDiscriminationPlot.
modelDiscriminationPlot(ModelNoMacro,data(Ind,:),'SegmentBy','ScoreGroup','DataID',DataSetChoice)

Тренд, предсказанный с предыдущей моделью, как функция лет на книгах, имеет очень регулярный убывающий шаблон. Данные, однако, показывают некоторые отклонения от этого тренда. Чтобы попытаться учесть эти отклонения, добавьте ежегодный рост валового внутреннего продукта (представленный GDP переменная) и годовые возвраты фондового рынка (представленная Market переменная) к модели.
Разверните набор данных, чтобы добавить один столбец для GDP и один для Market, с использованием данных из dataMacro таблица.
data = join(data,dataMacro); disp(data(1:10,:))
ID ScoreGroup YOB Default Year PDNoMacro 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
Подгонка модели с помощью макроэкономических переменных или макромодели путем расширения формулы модели, чтобы включить GDP и Market переменные.
ModelMacro = fitLifetimePDModel(data(TrainDataInd,:),'logistic',... 'ModelID','Macro','Description','Logistic model with YOB, score group and macro variables',... 'IDVar','ID','LoanVars','ScoreGroup','AgeVar','YOB',... 'MacroVars',{'GDP','Market'},'ResponseVar','Default'); disp(ModelMacro.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 функция для предсказания условного PD. Для рисунка вот как предсказать условный PD на обучении и проверке данных с помощью макро- модель. Результаты хранятся как новый столбец в data таблица. Предсказание PD в течение жизни также поддерживается predictLifetime функция, как показано в Модели коэффициентов по умолчанию с использованием группы счетов и Лет в книгах.
data.PDMacro = zeros(height(data),1); % Predict in-sample data.PDMacro(TrainDataInd) = predict(ModelMacro,data(TrainDataInd,:)); % Predict out-of-sample data.PDMacro(TestDataInd) = predict(ModelMacro,data(TestDataInd,:));
Графики точности и дискриминации моделей предлагают легко доступные инструменты сравнения для моделей.
Визуализируйте образец в или вне образца подгонки с помощью modelAccuracyPlot. Передайте предсказания из модели без макроэкономических переменных в качестве образца модели. Сначала постройте график с использованием лет в книгах в качестве одной сгруппированной переменной, а затем используйте группу счетов в качестве второй сгруппированной переменной.
DataSetChoice ="Test"; if DataSetChoice = ="Training" Ind = TrainDataInd; else Ind = TestDataInd; end modelAccuracyPlot (ModelMacro, данные (Ind,:),'YOB','ReferencePD', data.PDNoMacro (Ind),'ReferenceID', ModelNoMacro. ModelID,'DataID', DataSetChoice)

modelAccuracyPlot(ModelMacro,data(Ind,:),{'YOB','ScoreGroup'},'ReferencePD',data.PDNoMacro(Ind),'ReferenceID',ModelNoMacro.ModelID,'DataID',DataSetChoice)
Точность предсказаний значительно улучшается по сравнению с моделью без макроэкономических переменных. Предсказанные условные значения PD более точно следуют шаблону наблюдаемых частот дефолта, и сообщенная корневая средняя квадратная ошибка (RMSE) значительно меньше, когда макроэкономические переменные включены в модель.
Постройте график кривой ROC макромодели и модели без макроэкономических переменных, чтобы сравнить их эффективность с различением моделей.
modelDiscriminationPlot(ModelMacro,data(Ind,:),'ReferencePD',data.PDNoMacro(Ind),'ReferenceID',ModelNoMacro.ModelID,'DataID',DataSetChoice)

Дискриминация измеряет рейтинг клиентов по риску. Обе модели работают одинаково, с лишь небольшим улучшением, когда макроэкономические переменные добавляются к модели. Это означает, что обе модели выполняют одинаковую работу, разделяя клиентов с низким риском, средним риском и высоким риском путем присвоения более высоких значений PD клиентам с более высоким риском.
Несмотря на то, что эффективность распознавания обеих моделей одинаковая, предсказанные значения PD более точны для макромодели. Использование инструментов дискриминации и точности важно для валидации модели и сравнения модели.
Используйте подобранную макрокоманду модели для стресс-тестирования предсказанных вероятностей по умолчанию.
Предположим, что следующие сценарии стресса для макроэкономических переменных, предоставленных, например, регулятором.
disp(dataMacroStress)
GDP Market
_____ ______
Baseline 2.27 15.02
Adverse 1.31 4.56
Severe -0.22 -5.64
Настройте таблицу основных данных для предсказания вероятностей по умолчанию. Это фиктивная таблица данных с одной строкой для каждой комбинации группы счетов и количества лет в книгах.
dataBaseline = table; [ScoreGroup,YOB]=meshgrid(1:NumScoreGroups,1:NumYOB); dataBaseline.ScoreGroup = categorical(ScoreGroup(:),1:NumScoreGroups,... categories(data.ScoreGroup),'Ordinal',true); dataBaseline.YOB = YOB(:); dataBaseline.ID = ones(height(dataBaseline),1); dataBaseline.GDP = zeros(height(dataBaseline),1); dataBaseline.Market = zeros(height(dataBaseline),1);
Чтобы сделать предсказания, установите одинаковые макроэкономические условия (базовый уровень, неблагоприятные или серьезно неблагоприятные) для всех комбинаций групп счетов и количества лет в книгах.
% Predict baseline the probabilities of default dataBaseline.GDP(:) = dataMacroStress.GDP('Baseline'); dataBaseline.Market(:) = dataMacroStress.Market('Baseline'); dataBaseline.PD = predict(ModelMacro,dataBaseline); % Predict the probabilities of default in the adverse scenario dataAdverse = dataBaseline; dataAdverse.GDP(:) = dataMacroStress.GDP('Adverse'); dataAdverse.Market(:) = dataMacroStress.Market('Adverse'); dataAdverse.PD = predict(ModelMacro,dataAdverse); % Predict the probabilities of default in the severely adverse scenario dataSevere = dataBaseline; dataSevere.GDP(:) = dataMacroStress.GDP('Severe'); dataSevere.Market(:) = dataMacroStress.Market('Severe'); dataSevere.PD = predict(ModelMacro,dataSevere);
Визуализируйте среднюю предсказанную вероятность дефолта по группам счетов в трех альтернативных сценариях регулирования. Здесь все группы счетов неявно взвешиваются одинаково. Однако предсказания также могут быть сделаны на уровне кредита для любого данного портфеля, чтобы сделать прогнозируемые ставки дефолта совместимыми с фактическим распределением кредитов в портфеле. Одна и та же визуализация может быть получена для каждой группы счетов отдельно.
PredPDYOB = zeros(NumYOB,3); PredPDYOB(:,1) = mean(reshape(dataBaseline.PD,NumYOB,NumScoreGroups),2); PredPDYOB(:,2) = mean(reshape(dataAdverse.PD,NumYOB,NumScoreGroups),2); PredPDYOB(:,3) = mean(reshape(dataSevere.PD,NumYOB,NumScoreGroups),2); figure; bar(PredPDYOB*100); xlabel('Years on Books') ylabel('Predicted Default Rate (%)') legend('Baseline','Adverse','Severe') title('Stress Test, Probability of Default') grid on

Документация обобщенных линейных моделей: https://www.mathworks.com/help/stats/generalized-linear-regression.html
Обобщенная документация по моделям линейных смешанных эффектов: https://www.mathworks.com/help/stats/generalized-linear-mixed-effects-models.html
Федеральный резерв, комплексный анализ и обзор капитала (CCAR): https://www.federalreserve.gov/bankinforeg/ccar.htm
Банк Англии, стресс- Проверка: https://www.bankofengland.co.uk/financial-stability
Европейское банковское управление, общеевропейский стресс- Проверка: https://www.eba.europa.eu/risk-analysis-and-data/eu-wide-stress-testing
fitglm | fitglme | fitLifetimePDModel | Logistic | modelAccuracy | modelAccuracyPlot | modelDiscrimination | modelDiscriminationPlot | predict | predictLifetime | Probit