В этом примере показано, как работать с данными потребительской (розничной) кредитной панели для визуализации наблюдаемых ставок дефолта на разных уровнях. Это также показывает, как подогнать модель для предсказания вероятностей значений 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