Стресс-тестирование вероятностей значения по умолчанию потребительского кредита Используя данные о панели

В этом примере показано, как работать с потребителем (розничная продажа) данные о панели кредита, чтобы визуализировать наблюдаемые уровни по умолчанию на разных уровнях. Это также показывает, как подобрать модель, чтобы предсказать вероятности значения по умолчанию (PD) и пожизненные значения PD, и выполнить анализ стресс-тестирования.

Набор данных панели потребительских кредитов позволяет вам идентифицировать шаблоны уровня по умолчанию для кредитов различных возрастов, или годы на книгах. Можно использовать информацию о группе счета, чтобы отличить уровни по умолчанию для различных уровней счета. Кроме того, можно использовать макроэкономическую информацию, чтобы оценить, как состояние экономики влияет на уровни значения по умолчанию потребительского кредита.

Стандартная модель логистической регрессии, тип обобщенной линейной модели, подбирается к розничным данным о панели кредита с и без макроэкономических предикторов, с помощью fitLifetimePDModel от Risk Management Toolbox™. Несмотря на то, что та же модель может подбираться с помощью fitglm функция от Statistics and Machine Learning Toolbox™, пожизненной вероятности значения по умолчанию (PD) версия модели спроектирована для заявок на кредит и поддерживает пожизненное предсказание PD и инструменты проверки допустимости модели, включая дискриминацию и графики точности, показанные в этом примере. Пример также описывает, как подбирать более усовершенствованную модель с учетом эффектов данных о панели, обобщенную линейную смешанную модель эффектов. Однако эффекты панели незначительны для набора данных в этом примере, и стандартная логистическая модель предпочтена для КПД.

Модель логистической регрессии предсказывает вероятности значения по умолчанию для всех уровней счета, годы на книгах и макроэкономических переменных сценариях. Существует краткое обсуждение того, как предсказать пожизненные значения PD с указателями на дополнительную функциональность. Пример показывает дискриминацию модели и инструменты точности модели, чтобы подтвердить и сравнить модели. В последнем разделе этого примера логистическая модель используется для анализа стресс-тестирования, модель предсказывает вероятности значения по умолчанию для данной базовой линии, а также вероятности по умолчанию для неблагоприятных и сильно неблагоприятных макроэкономических сценариев.

Для получения дополнительной информации обратитесь к Обзору Пожизненной Вероятности Моделей По умолчанию. См. также Вероятности Моделирования в качестве примера Значения по умолчанию с 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  
bar(DefRateByScore.ScoreGroup,DefRateByScore.mean_Default*100)
title('Default Rate vs. Score Group')
xlabel('Score Group')
ylabel('Observed Default Rate (%)')
grid on

Figure contains an axes object. The axes object with title Default Rate vs. Score Group contains an object of type bar.

Затем вычислите уровни по умолчанию, группирующиеся к годам на книгах (представленный 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

Figure contains an axes object. The axes object with title Default Rate vs. Years on Books contains an object of type line.

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

Figure contains an axes object. The axes object with title Default Rate vs. Years on Books contains 3 objects of type line. These objects represent High Risk, Medium Risk, Low Risk.

Годы на книгах по сравнению с календарными годами

Данные содержат три когорты или годы изготовления вина: кредиты запускаются в 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
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

Figure contains an axes object. The axes object with title Default Rate vs. Years on Books contains 3 objects of type line. These objects represent Cohort 97, Cohort 98, Cohort 99.

% 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

Figure contains an axes object. The axes object with title Default Rate vs. Calendar Year contains 3 objects of type line. These objects represent Cohort 97, Cohort 98, Cohort 99.

Модель уровней по умолчанию Используя группу счета и годы на книгах

После того, как вы будете визуализировать данные, можно создать прогнозные модели для уровней по умолчанию.

Разделите данные о панели в обучение и тестирующие наборы, задав эти наборы на основе идентификационных номеров.

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

log(p1-p)=aH+aM1M+aL1L+bYOBYOB+ϵ

1M индикатор со значением 1 для Medium Risk кредиты и 0 в противном случае, и так же для 1L для Low Risk кредиты. Это - стандартный способ обработать категориальный предиктор, такой как ScoreGroup. Существует эффективно различная константа для каждого уровня риска: ах для 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 функция.

Intercept коэффициент является константой для High Risk уровень (ах называют), и ScoreGroup_Medium Risk и ScoreGroup_Low Risk коэффициенты являются корректировками к Medium Risk и Low Risk уровни (и термины Эла).

Вероятность по умолчанию p и логарифмические разногласия (левая сторона модели) перемещаются в то же направление, когда предикторы изменяются. Поэтому, потому что корректировки к Medium Risk и 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');

Как упомянуто во введении, преимуществе пожизненной версии PD модели, подбиравшей с fitLifetimePDModel это, это спроектировано для заявок на кредит, и это может предсказать пожизненный PD и поддерживает инструменты проверки допустимости модели, включая графики точности и дискриминацию. Для получения дополнительной информации см. Обзор Пожизненной Вероятности Моделей По умолчанию.

С учетом эффектов данных о панели более усовершенствованная модель с помощью смешанных эффектов может подбираться с помощью fitglm функция от Statistics and Machine Learning Toolbox™. Несмотря на то, что эта модель не приспособлена в этом примере, код очень похож:

ModelNoMacro = fitglme(data(TrainDataInd,:),'Default ~ 1 + ScoreGroup + YOB + (1|ID)','Distribution','binomial');

(1|ID) назовите в формуле, добавляет случайный эффект к модели. Этот эффект является предиктором, значения которого не даны в данных, но калиброваны вместе с коэффициентами модели. Случайное значение калибруется для каждого ID. Это дополнительное калибровочное требование существенно увеличивает вычислительное время, чтобы подбирать модель в этом случае из-за очень большого количества идентификаторов. Для набора данных панели в этом примере случайный термин оказывает незначительное влияние. Отклонение случайных эффектов очень мало, и коэффициенты модели едва изменяются, когда случайный эффект введен. Более простая модель логистической регрессии предпочтена, потому что это быстрее, чтобы калибровать и предсказать, и уровни по умолчанию, предсказанные с обеими моделями, являются по существу тем же самым.

Предскажите вероятность значения по умолчанию для данных об обучении и тестировании. 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 функция. Для пожизненных предсказаний спроектированные значения предикторов требуются для каждого Значения идентификатора в наборе данных предсказания. Например, предскажите вероятность выживания для первых двух идентификаторов в наборе данных. Смотрите как условный PD (PDNoMacro столбец) и пожизненный PD (LifetimePD столбец), соответствуют в течение первого года каждого ID. После того года увеличивается пожизненный PD, потому что это - интегральная вероятность. Для получения дополнительной информации смотрите predictLifetime. См. также Ожидаемый пример Расчета Кредита Потерь.

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)

Figure contains an axes object. The axes object with title Scatter Grouped by YOB Test No Macro, RMSE = 0.001349 contains 2 objects of type line. These objects represent Observed, No Macro.

Группа счета может быть введена как вторая сгруппированная переменная, чтобы визуализировать подгонку группами счета.

modelAccuracyPlot(ModelNoMacro,data(Ind,:),{'YOB' 'ScoreGroup'},'DataID',DataSetChoice)

Figure contains an axes object. The axes object with title Scatter Grouped by YOB and ScoreGroup Test No Macro, RMSE = 0.0016366 contains 6 objects of type line. These objects represent High Risk, Observed, Medium Risk, Observed, Low Risk, Observed, High Risk, No Macro, Medium Risk, No Macro, Low Risk, No Macro.

Пожизненные модели PD также поддерживают инструменты валидации для дискриминации модели. В частности, modelDiscriminationPlot функция создает график кривой рабочей характеристики приемника (ROC). Здесь отдельную кривую ROC требуют для каждой группы счета. Для получения дополнительной информации смотрите modelDiscriminationPlot.

modelDiscriminationPlot(ModelNoMacro,data(Ind,:),'SegmentBy','ScoreGroup','DataID',DataSetChoice)

Figure contains an axes object. The axes object with title ROC Test Segmented by ScoreGroup contains 3 objects of type line. These objects represent No Macro, High Risk, AUROC = 0.60996, No Macro, Medium Risk, AUROC = 0.62274, No Macro, Low Risk, AUROC = 0.61918.

Модель уровней по умолчанию включая макроэкономические переменные

Тренд, предсказанный с предыдущей моделью, в зависимости от лет на книгах, имеет очень регулярный уменьшающийся шаблон. Данные, однако, показывают некоторые отклонения от того тренда. Чтобы попробовать с учетом тех отклонений, добавьте валовой внутренний продукт ежегодный рост (представленный GDP переменная) и фондовый рынок ежегодные возвраты (представленный Market переменная) к модели.

log(p1-p)=aH+aM1M+aL1L+bYOBYOB+bGDPGDP+bMarketMarket+ϵ

Расширьте набор данных, чтобы добавить один столбец для 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 функция, как показано в Модели Default Rates Using Score Group и годы на разделе Books.

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)

Figure contains an axes object. The axes object with title Scatter Grouped by YOB Test Macro, RMSE = 0.00060724 No Macro, RMSE = 0.001349 contains 3 objects of type line. These objects represent Observed, Macro, No Macro.

modelAccuracyPlot(ModelMacro,data(Ind,:),{'YOB','ScoreGroup'},'ReferencePD',data.PDNoMacro(Ind),'ReferenceID',ModelNoMacro.ModelID,'DataID',DataSetChoice)

Figure contains an axes object. The axes object with title Scatter Grouped by YOB and ScoreGroup Test Macro, RMSE = 0.00088425 No Macro, RMSE = 0.0016366 contains 9 objects of type line. These objects represent High Risk, Observed, Medium Risk, Observed, Low Risk, Observed, High Risk, Macro, High Risk, No Macro, Medium Risk, Macro, Medium Risk, No Macro, Low Risk, Macro, Low Risk, No Macro.

Точность предсказаний значительно улучшается по сравнению с моделью без макроэкономических переменных. Предсказанные условные значения PD больше сопровождают шаблон наблюдаемых уровней по умолчанию, и среднеквадратичная ошибка (RMSE), о которой сообщают, значительно меньше, когда макроэкономические переменные включены в модель.

Постройте кривую ROC макро-модели и модели без макроэкономических переменных, чтобы сравнить их эффективность относительно дискриминации модели.

modelDiscriminationPlot(ModelMacro,data(Ind,:),'ReferencePD',data.PDNoMacro(Ind),'ReferenceID',ModelNoMacro.ModelID,'DataID',DataSetChoice)

Figure contains an axes object. The axes object with title ROC Test Macro, AUROC = 0.69341 No Macro, AUROC = 0.68662 contains 2 objects of type line. These objects represent Macro, No Macro.

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

Figure contains an axes object. The axes object with title Stress Test, Probability of Default contains 3 objects of type bar. These objects represent Baseline, Adverse, Severe.

Ссылки

  1. Обобщенная линейная документация Моделей: https://www.mathworks.com/help/stats/generalized-linear-regression.html

  2. Обобщенная линейная Смешанная документация Моделей Эффектов: https://www.mathworks.com/help/stats/generalized-linear-mixed-effects-models.html

  3. Федеральная резервная система, Анализ Comprehensive Capital и Анализ (CCAR): https://www.federalreserve.gov/bankinforeg/ccar.htm

  4. Банк Англии, Стресс-тестирование: https://www.bankofengland.co.uk/financial-stability

  5. Европейские Банковские полномочия, Стресс-тестирование Во всех странах Европейского союза: https://www.eba.europa.eu/risk-analysis-and-data/eu-wide-stress-testing

Смотрите также

| | | | | | | | | |

Связанные примеры

Больше о