В этом примере показано, как работать с потребителем (розничная продажа) данные о панели кредита, чтобы визуализировать наблюдаемые уровни по умолчанию на разных уровнях. Это также показывает, как подобрать модель, чтобы предсказать вероятности значения по умолчанию и выполнить анализ стресс-тестирования.
Набор данных панели потребительских кредитов позволяет вам идентифицировать шаблоны уровня по умолчанию для кредитов различных возрастов, или годы на книгах. Можно использовать информацию о группе счета, чтобы отличить уровни по умолчанию для различных уровней счета. Кроме того, можно использовать макроэкономическую информацию, чтобы оценить, как состояние экономики влияет на уровни значения по умолчанию потребительского кредита.
Стандартная модель логистической регрессии, тип обобщенной линейной модели, подбирается к розничным данным о панели кредита с и без макроэкономических предикторов. Пример описывает, как подбирать более усовершенствованную модель, чтобы составлять эффекты данных о панели, обобщенную линейную смешанную модель эффектов. Однако эффекты панели незначительны для набора данных в этом примере, и стандартная логистическая модель предпочтена для КПД.
Стандартная модель логистической регрессии предсказывает вероятности значения по умолчанию для всех уровней счета, годы на книгах и макроэкономических переменных сценариях. Когда стандартная модель логистической регрессии используется в анализе стресс-тестирования, модель предсказывает вероятности значения по умолчанию для данной базовой линии, а также вероятности по умолчанию для неблагоприятных и сильно неблагоприятных макроэкономических сценариев.
Для получения дополнительной информации отошлите к Вероятностям Моделирования в качестве примера Значения по умолчанию с Cox Пропорциональные Опасности, который следует за тем же рабочим процессом, но использует регрессию Cox вместо логистической регрессии, и также имеет дополнительную информацию о расчете пожизненного PD и пожизненной Ожидаемой потери кредита (ECL).
Основной набор данных (data
) содержит следующие переменные:
ID
: Идентификатор ссуды.
ScoreGroup
: Кредитный рейтинг в начале ссуды, дискретизированной в три группы: High Risk
, Medium Risk
, и Low Risk
.
YOB
: Годы на книгах.
Default
: Индикатор по умолчанию. Это - переменная отклика.
Year
: Календарный год.
Существует также небольшой набор данных (dataMacro
) с макроэкономическими данными в течение соответствующих календарных лет:
Year
: Календарный год.
GDP
: Рост валового внутреннего продукта (год за год).
Market
: Рынок возвращается (год за год).
Переменные YOB
год
, GDP
, и Market
наблюдаются в конце соответствующего календарного года. Группа счета является дискретизацией исходного кредитного рейтинга когда запущенная ссуда. Значение 1
для Default
средние значения, что ссуда приняла значение по умолчанию в соответствующий календарный год.
Существует также третий набор данных (dataMacroStress
) с базовой линией, неблагоприятными, и сильно неблагоприятными сценариями для макроэкономических переменных. Эта таблица используется в анализе стресс-тестирования.
Этот пример использует симулированные данные, но тот же подход был успешно применен к действительным наборам данных.
Загрузите данные и просмотрите первые 10 и продержитесь 10 строк таблицы. Данные о панели сложены, в том смысле, что наблюдения для того же ID хранятся в непрерывных строках, составляя высокую, тонкую таблицу. Панель является несбалансированной, потому что не все идентификаторы имеют то же количество наблюдений.
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
figure; bar(double(DefRateByScore.ScoreGroup),DefRateByScore.mean_Default*100) set(gca,'XTickLabel',categories(data.ScoreGroup)) 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
figure; 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
disp(' ...')
...
DefRateByScoreYOB2 = reshape(DefRateByScoreYOB.mean_Default,... NumYOB,NumScoreGroups); figure; plot(DefRateByScoreYOB2*100,'-*') title('Default Rate vs. Years on Books') xlabel('Years on Books') ylabel('Observed Default Rate (%)') legend(categories(data.ScoreGroup)) grid on
Данные содержат три когорты или годы изготовления вина: кредиты запускаются в 1 997, 1998, и 1999. Никакая ссуда в данных о панели, запущенных после 1999.
Этот раздел показывает, как визуализировать уровень по умолчанию для каждой когорты отдельно. Уровни по умолчанию для всех когорт построены, и против номера лет на книгах и против календарного года. Шаблоны в годах на книгах предлагают характеристики продукта ссуды. Шаблоны в календарные годы предлагают влияние макроэкономической среды.
С лет два - четыре на книгах, кривые показывают различные шаблоны для этих трех когорт. Когда построено против календарного года, однако, эти три когорты показывают подобное поведение от 2 000 до 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 figure; 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); figure; 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');
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
. Существует эффективно различная константа для каждого уровня риска: ах для High Risk
, aH+aM для Medium Risk
, и aH+aL для Low Risk
.
Чтобы калибровать модель, вызовите fitglm
функция от Statistics and Machine Learning Toolbox™. Формула выше выражается как
Default ~ 1 + ScoreGroup + YOB
1 + ScoreGroup
условия составляют базовую константу и корректировки к уровню риска. Установите дополнительный аргумент Distribution
к binomial
указать, что логистическая модель желаема (то есть, модель с логарифмическими разногласиями на левой стороне).
ModelNoMacro = fitglm(data(TrainDataInd,:),... 'Default ~ 1 + ScoreGroup + YOB',... 'Distribution','binomial'); disp(ModelNoMacro)
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
функция.
Intercept
коэффициент является константой для High Risk
уровень (ах называют), и ScoreGroup_Medium Risk
и ScoreGroup_Low Risk
коэффициенты являются корректировками к Medium Risk
и Low Risk
уровни (и условия Эла).
Вероятность по умолчанию p и логарифмические разногласия (левая сторона модели) перемещаются в то же направление, когда предикторы изменяются. Поэтому, потому что корректировки к Medium Risk
и Low Risk
отрицательны, уровни по умолчанию ниже для лучших уровней риска, как ожидалось. Коэффициент для номера лет на книгах также отрицателен, сопоставим с полной тенденцией к понижению для номера лет на книгах, наблюдаемых в данных.
Чтобы составлять эффекты данных о панели, более усовершенствованная модель с помощью смешанных эффектов может подбираться с помощью fitglm
функция от Statistics and Machine Learning Toolbox™. Несмотря на то, что эта модель не приспособлена в этом примере, код очень похож:
ModelNoMacro = fitglme(data(TrainDataInd,:),'Default ~ 1 + ScoreGroup + YOB + (1|ID)','Distribution','binomial');
(1|ID)
термин в формуле добавляет случайный эффект в модель. Этот эффект является предиктором, значения которого не даны в данных, но калиброваны вместе с коэффициентами модели. Случайное значение калибруется для каждого ID. Это дополнительное калибровочное требование существенно увеличивает вычислительное время, чтобы подбирать модель в этом случае из-за очень большого количества идентификаторов. Для набора данных панели в этом примере случайный термин оказывает незначительное влияние. Отклонение случайных эффектов очень мало, и коэффициенты модели едва изменяются, когда случайный эффект введен. Более простая модель логистической регрессии предпочтена, потому что это быстрее, чтобы калибровать и предсказать, и уровни по умолчанию, предсказанные с обеими моделями, являются по существу тем же самым.
Предскажите вероятность значения по умолчанию для данных об обучении и тестировании.
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,:));
Визуализируйте подгонку в выборке.
PredPDTrainYOB = groupsummary(data(TrainDataInd,:),'YOB','mean',... {'Default','PDNoMacro'}); figure; scatter(PredPDTrainYOB.YOB,PredPDTrainYOB.mean_Default*100,'*'); hold on plot(PredPDTrainYOB.YOB,PredPDTrainYOB.mean_PDNoMacro*100); hold off xlabel('Years on Books') ylabel('Default Rate (%)') legend('Observed','Predicted') title('Model Fit (Training Data)') grid on
Визуализируйте подгонку из выборки.
PredPDTestYOB = groupsummary(data(TestDataInd,:),'YOB','mean',... {'Default','PDNoMacro'}); figure; scatter(PredPDTestYOB.YOB,PredPDTestYOB.mean_Default*100,'*'); hold on plot(PredPDTestYOB.YOB,PredPDTestYOB.mean_PDNoMacro*100); hold off xlabel('Years on Books') ylabel('Default Rate (%)') legend('Observed','Predicted') title('Model Fit (Testing Data)') grid on
Визуализируйте пригодное в выборке для всех групп счета. Подгонка из выборки может вычисляться и визуализироваться похожим способом.
PredPDTrainScoreYOB = groupsummary(data(TrainDataInd,:),... {'ScoreGroup','YOB'},'mean',{'Default','PDNoMacro'}); figure; hs = gscatter(PredPDTrainScoreYOB.YOB,... PredPDTrainScoreYOB.mean_Default*100,... PredPDTrainScoreYOB.ScoreGroup,'rbmgk','*'); mean_PDNoMacroMat = reshape(PredPDTrainScoreYOB.mean_PDNoMacro,... NumYOB,NumScoreGroups); hold on hp = plot(mean_PDNoMacroMat*100); for ii=1:NumScoreGroups hp(ii).Color = hs(ii).Color; end hold off xlabel('Years on Books') ylabel('Observed Default Rate (%)') legend(categories(data.ScoreGroup)) title('Model Fit by Score Group (Training Data)') grid on
Тренд, предсказанный с предыдущей моделью, как функция лет на книгах, имеет очень регулярный уменьшающийся шаблон. Данные, однако, показывают некоторые отклонения от того тренда. Чтобы попытаться составлять те отклонения, добавьте валовой внутренний продукт ежегодный рост (представленный GDP
переменная) и фондовый рынок ежегодные возвраты (представленный Market
переменная) к модели.
Расширьте набор данных, чтобы добавить один столбец для GDP
и один для Market
, использование данных из dataMacro
таблица.
data.GDP = dataMacro.GDP(data.Year-1996); data.Market = dataMacro.Market(data.Year-1996); 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 = fitglm(data(TrainDataInd,:),... 'Default ~ 1 + ScoreGroup + YOB + GDP + Market',... 'Distribution','binomial'); disp(ModelMacro)
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
Обе макроэкономических переменные показывают отрицательный коэффициент, сопоставимый с интуицией, что более высокий экономический рост уменьшает уровни по умолчанию.
Предскажите вероятность значения по умолчанию для данных об обучении и тестировании.
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,:));
Визуализируйте подгонку в выборке. Как желаемый, модель включая макроэкономические переменные или макро-модель, отклоняется от сглаженного тренда, предсказанного предыдущей моделью. Уровни, предсказанные с макро-моделью, соответствуют более тесно с наблюдаемыми уровнями по умолчанию.
PredPDTrainYOBMacro = groupsummary(data(TrainDataInd,:),'YOB','mean',... {'Default','PDMacro'}); figure; scatter(PredPDTrainYOBMacro.YOB,PredPDTrainYOBMacro.mean_Default*100,'*'); hold on plot(PredPDTrainYOB.YOB,PredPDTrainYOB.mean_PDNoMacro*100); % No Macro plot(PredPDTrainYOBMacro.YOB,PredPDTrainYOBMacro.mean_PDMacro*100); % Macro hold off xlabel('Years on Books') ylabel('Default Rate (%)') legend('Observed','No Macro', 'Macro') title('Macro Model Fit (Training Data)') grid on
Визуализируйте подгонку из выборки.
PredPDTestYOBMacro = groupsummary(data(TestDataInd,:),'YOB','mean',... {'Default','PDMacro'}); figure; scatter(PredPDTestYOBMacro.YOB,PredPDTestYOBMacro.mean_Default*100,'*'); hold on plot(PredPDTestYOB.YOB,PredPDTestYOB.mean_PDNoMacro*100); % No Macro plot(PredPDTestYOBMacro.YOB,PredPDTestYOBMacro.mean_PDMacro*100); % Macro hold off xlabel('Years on Books') ylabel('Default Rate (%)') legend('Observed','No Macro', 'Macro') title('Macro Model Fit (Testing Data)') grid on
Визуализируйте пригодное в выборке для всех групп счета.
PredPDTrainScoreYOBMacro = groupsummary(data(TrainDataInd,:),... {'ScoreGroup','YOB'},'mean',{'Default','PDMacro'}); figure; hs = gscatter(PredPDTrainScoreYOBMacro.YOB,... PredPDTrainScoreYOBMacro.mean_Default*100,... PredPDTrainScoreYOBMacro.ScoreGroup,'rbmgk','*'); mean_PDMacroMat = reshape(PredPDTrainScoreYOBMacro.mean_PDMacro,... NumYOB,NumScoreGroups); hold on hp = plot(mean_PDMacroMat*100); for ii=1:NumScoreGroups hp(ii).Color = hs(ii).Color; end hold off xlabel('Years on Books') ylabel('Observed Default Rate (%)') legend(categories(data.ScoreGroup)) title('Macro Model Fit by Score Group (Training Data)') grid on
Используйте подбиравшую макро-модель для стресс-теста предсказанные вероятности значения по умолчанию.
Примите, что следующее является сценариями напряжения для макроэкономических переменных если, например, регулятором.
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.
Федеральная резервная система, Анализ Comprehensive Capital и Анализ (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.