exponenta event banner

Моделирование вероятностей дефолта с пропорциональными рисками Кокса

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

Аналогичный пример, стресс-тестирование вероятностей дефолта потребительского кредита с использованием данных панели, следует тому же рабочему процессу, но использует логистическую регрессию вместо Cox PH. Основные различия в этих двух подходах заключаются в следующем:

  • Модель подходит: Модель Cox PH имеет непараметрический базовый уровень опасности, который может соответствовать шаблонам в PDS гораздо ближе, чем полностью параметрическая логистическая модель.

  • Экстраполяция за пределы наблюдаемого возраста в данных: Модель Cox PH, поскольку она построена поверх непараметрического базового уровня опасности, не может экстраполировать на возраст займа, который не наблюдается в наборе данных. Логистическая модель рассматривает возраст ссуды как непрерывную переменную, и, следовательно, она может экстраполировать для прогнозирования ПД для возрастов, не наблюдаемых в наборе данных.

  • Ситуации с низкой вероятностью: Если для определенного возраста PD мал и в данных нет наблюдаемых значений по умолчанию, модель Cox PH предсказывает PD как ноль. Напротив, логистическая модель всегда дает ненулевые вероятности.

Исследование данных с помощью инструментов анализа выживания

Начиная с некоторых визуализаций данных, в основном визуализация PD как функции возраста, которая в этом наборе данных совпадает с Years-on-Books (YOB). Поскольку Cox PH является моделью анализа выживаемости, в этом примере обсуждаются некоторые инструменты и концепции анализа выживаемости и используется эмпирическая кумулятивная функция распределения (ecdf) для некоторых из этих вычислений и визуализаций.

Основной набор данных (data) содержит следующие переменные:

  • ID: Идентификатор займа.

  • ScoreGroupКредитный балл в начале кредита, дискретизированный на три группы: High Risk, Medium Risk, и Low Risk.

  • YOBГоды на книгах.

  • Default: Индикатор по умолчанию. Это переменная ответа.

  • YearКалендарный год.

Существует также небольшой набор данных (dataMacro) с макроэкономическими данными за соответствующие календарные годы:

  • YearКалендарный год.

  • GDPРост валового внутреннего продукта (год за годом).

  • MarketРыночная доходность (год за годом).

Переменные YOB, Year, GDP, и Market наблюдаются в конце соответствующего календарного года. Группа баллов представляет собой дискретизацию исходного кредитного балла при начале кредитования. Значение 1 для Default означает, что по кредиту был допущен дефолт в соответствующем календарном году.

Существует также третий набор данных (dataMacroStress) с базовыми, неблагоприятными и сильно неблагоприятными сценариями для макроэкономических переменных. Эта таблица используется для анализа стресс-тестирования.

Загрузите смоделированные данные.

load RetailCreditPanelData.mat
disp(head(data,10))
    ID    ScoreGroup     YOB    Default    Year
    __    ___________    ___    _______    ____

    1     Low Risk        1        0       1997
    1     Low Risk        2        0       1998
    1     Low Risk        3        0       1999
    1     Low Risk        4        0       2000
    1     Low Risk        5        0       2001
    1     Low Risk        6        0       2002
    1     Low Risk        7        0       2003
    1     Low Risk        8        0       2004
    2     Medium Risk     1        0       1997
    2     Medium Risk     2        0       1998

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

% Use groupsummary to reduce data to one ID per row, and keep track of whether the loan defaulted or not
dataSurvival = groupsummary(data,'ID','sum','Default');
disp(head(dataSurvival,10))
    ID    GroupCount    sum_Default
    __    __________    ___________

     1        8              0     
     2        8              0     
     3        8              0     
     4        6              0     
     5        7              0     
     6        7              0     
     7        8              0     
     8        6              0     
     9        7              0     
    10        8              0     
% Could also get years observed from YOB, though here we know YOB always
% starts from 1 in the data, so the GroupCount equals the final YOB
dataSurvival.Properties.VariableNames{2} = 'YearsObserved';
dataSurvival.Properties.VariableNames{3} = 'Default';
% If there is no default, it's a censored observation
dataSurvival.Censored = ~dataSurvival.Default;
disp(head(dataSurvival,10))
    ID    YearsObserved    Default    Censored
    __    _____________    _______    ________

     1          8             0        true   
     2          8             0        true   
     3          8             0        true   
     4          6             0        true   
     5          7             0        true   
     6          7             0        true   
     7          8             0        true   
     8          6             0        true   
     9          7             0        true   
    10          8             0        true   

Основная переменная - это количество времени, в течение которого наблюдался каждый кредит (YearsObserved), которая является окончательным значением Года в книге (YOB) переменная. Это количество лет до дефолта, или до окончания периода наблюдения (восемь лет), или до снятия кредита из выборки, например, из-за предоплаты. В этом наборе данных информация YOB совпадает с возрастом займа, потому что все займы начинаются с YOB 1. Для других наборов данных это может быть не так. В торговом портфеле YOB и возраст могут быть разными, потому что кредит, приобретенный на третий год его жизни, будет иметь возраст 3, но значение YOB, равное 1.

Второй требуемой переменной является цензурирующая переменная (Censored). Событие, представляющее интерес, является дефолтом в этом анализе. Если ссуда соблюдается до дефолта, у нас есть полная информация о времени до дефолта, поэтому информация о сроке службы не подлежит цензуре или заполнена. Кроме того, информация считается цензурированной или неполной, если в конце периода наблюдения ссуда не была объявлена дефолтом. Это может быть связано с предоплатой кредита или с тем, что кредит не был объявлен дефолтом к концу восьмилетнего периода наблюдения в выборке.

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

% Can get ScoreGroup from YOB==1, since we know in this data set
% YOB always starts at 1 and the ID's order is the same in data and dataSurvival
dataSurvival.ScoreGroup = data.ScoreGroup(data.YOB==1);
% Define vintages based on the year the loan started, we know all loans
% in this data set start in year 1 of their life
dataSurvival.Vintage = data.Year(data.YOB==1);
disp(head(dataSurvival,10))
    ID    YearsObserved    Default    Censored    ScoreGroup     Vintage
    __    _____________    _______    ________    ___________    _______

     1          8             0        true       Low Risk        1997  
     2          8             0        true       Medium Risk     1997  
     3          8             0        true       Medium Risk     1997  
     4          6             0        true       Medium Risk     1999  
     5          7             0        true       Medium Risk     1998  
     6          7             0        true       Medium Risk     1998  
     7          8             0        true       Medium Risk     1997  
     8          6             0        true       Medium Risk     1999  
     9          7             0        true       Low Risk        1998  
    10          8             0        true       Low Risk        1997  

Наконец, сравните количество строк в исходном наборе данных в формате данных панели и агрегированный набор данных в более традиционном формате выживания.

fprintf('Number of rows original data: %d\n',height(data));
Number of rows original data: 646724
fprintf('Number of rows survival data: %d\n',height(dataSurvival));
Number of rows survival data: 96820

Постройте график кумулятивной вероятности дефолта по отношению к YOB для всего портфеля (все группы баллов и винтаги) с использованием эмпирической кумулятивной функции распределения (ecdf) функциональность.

ecdf(dataSurvival.YearsObserved,'Censoring',dataSurvival.Censored,'Bounds','on')
title('Cumulative Default Probability, All Score Groups')
xlabel('Years on Books')

Figure contains an axes. The axes with title Cumulative Default Probability, All Score Groups contains 3 objects of type stair.

Построить график условных годичных ПД против YOB. Например, условный годичный ПД для YOB 3 является условным годичным ПД для кредитов, которые находятся на третьем году жизни. В анализе выживаемости это называется дискретной степенью опасности, обозначаемой ч. Для вычисления h выведите кумулятивную функцию опасности, обозначенную H, и преобразуйте ее в функцию опасности h.

[H,x] = ecdf(dataSurvival.YearsObserved,'Censoring',dataSurvival.Censored,...
    'Function','cumulative hazard');
% Because it is discrete time, simply take the diff of H to get the hazard h
h = diff(H);
x(1) = [];

% In this example, the times observed (stored in variable x) do not change for 
% different score groups, or for training vs. test sets. For other data sets,
% the x and h variables may need to be checked after every call to the ecdf function before
% plotting or concatenating results (for example, if there are no defaults in a
% particular year for the test data).

plot(x,h,'*')
grid on
title('Conditional 1-Year PDs')
ylabel('PD')
xlabel('Years on Books')

Figure contains an axes. The axes with title Conditional 1-Year PDs contains an object of type line.

Эти вероятности также можно вычислить непосредственно с помощью groupsummary с использованием исходного формата данных панели. Дополнительные сведения см. в сопутствующем примере Стресс-тестирование вероятностей дефолта потребительского кредита с использованием данных панели. Или вы можете вычислить эти вероятности с помощью grpstats с использованием исходного формата данных панели. Эти подходы дают одни и те же условные годичные ПД.

PDvsYOBByGroupsummary = groupsummary(data,'YOB','mean','Default');

PDvsYOBByGrpstats = grpstats(data.Default,data.YOB);

PDvsYOB = table((1:8)',h,PDvsYOBByGroupsummary.mean_Default,PDvsYOBByGrpstats,...
    'VariableNames',{'YOB','ECDF','Groupsummary','Grpstats'});
disp(PDvsYOB)
    YOB      ECDF       Groupsummary    Grpstats 
    ___    _________    ____________    _________

     1      0.017507      0.017507       0.017507
     2      0.012704      0.012704       0.012704
     3      0.011168      0.011168       0.011168
     4      0.010728      0.010728       0.010728
     5     0.0085949     0.0085949      0.0085949
     6      0.006413      0.006413       0.006413
     7     0.0033231     0.0033231      0.0033231
     8     0.0016272     0.0016272      0.0016272

Сегментируйте данные по группам баллов, чтобы получить PD, дезагрегированные по группам баллов.

ScoreGroupLabels = categories(dataSurvival.ScoreGroup);
NumScoreGroups = length(ScoreGroupLabels);
hSG = zeros(length(h),NumScoreGroups);
for ii=1:NumScoreGroups
    Ind = dataSurvival.ScoreGroup==ScoreGroupLabels{ii};
    H = ecdf(dataSurvival.YearsObserved(Ind),'Censoring',dataSurvival.Censored(Ind));
    hSG(:,ii) = diff(H);
end
plot(x,hSG,'*')
grid on
title('Conditional 1-Year PDs, By Score Group')
xlabel('Years on Books')
ylabel('PD')
legend(ScoreGroupLabels)

Figure contains an axes. The axes with title Conditional 1-Year PDs, By Score Group contains 3 objects of type line. These objects represent High Risk, Medium Risk, Low Risk.

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

Модель Cox PH без макроэффектов

В этом разделе показано, как подогнать модель Cox PH без макроинформации. Для этого используется формат данных выживания и модель включает в себя только не зависящие от времени предикторы, то есть информацию, которая остается постоянной в течение всего срока действия займа. В качестве не зависящего от времени предиктора используется только группа баллов в начале кредитования, но в модель могут быть добавлены другие такие предикторы (например, информация о модификации).

Регрессия пропорциональных рисков Кокса является полупараметрическим методом для корректировки оценок выживаемости для количественной оценки влияния предикторных переменных. Метод представляет эффекты пояснительных переменных как множитель общей базовой функции опасности h0 (t). Функция опасности является непараметрической частью функции регрессии пропорциональных рисков Кокса, в то время как влияние переменных предиктора является логлинейной регрессией. Эта модель Cox PH

h (Xi, t) = h0 (t) exp (∑j=1pxijbj)

где:

  • Xi = (x1,..., xip) являются прогнозирующими переменными для i-го субъекта.

  • bj - коэффициент j-ой прогнозирующей переменной.

  • h (Xi, t) - коэффициент опасности в момент времени t для Xi.

  • h0 (t) - функция базовой степени опасности.

Дополнительные сведения см. в разделе coxphfit или модель пропорциональных рисков Кокса и содержащиеся в ней ссылки.

Базовая модель PH Кокса предполагает, что предикторные значения не изменяются в течение всего срока действия ссуд. В нашем примере так обстоит дело для оценочной группы, потому что это оценка, данная заемщикам в начале кредита. Винтаж также является постоянным в течение всей жизни займа.

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

Чтобы оценить подгонку модели, визуализируйте подгонку модели в образце и вне образца. Во-первых, разбейте данные на группы обучения и тестирования и подберите модель с использованием данных обучения.

nIDs = height(dataSurvival);
NumTraining = floor(0.6*nIDs); % Use 60% of data for training

rng('default'); % Reset rng state, for reproducibility
TrainIDInd = randsample(nIDs,NumTraining);
TrainDataInd = ismember(dataSurvival.ID,TrainIDInd);
TestDataInd = ~TrainDataInd;

% ScoreGroup is categorical, convert to binary columns with dummyvar
X = dummyvar(dataSurvival.ScoreGroup(TrainDataInd));

% Drop first column to avoid linear dependencies,
% also known as the "dummy variable trap"
X(:,1) = [];

% Fit the Cox PH model
[bCox,~,HCox] = coxphfit(X,...
    dataSurvival.YearsObserved(TrainDataInd),...
    'Censoring',dataSurvival.Censored(TrainDataInd),...
    'Baseline',0);

Третий выход coxphfit функция является базовым кумулятивным коэффициентом опасности H. Этот кумулятивный коэффициент опасности может быть преобразован в коэффициент опасности h, как и ранее, за исключением дополнительного шага. Модель PH Кокса предполагает, что время наблюдения измеряется как непрерывная переменная. Здесь время измеряется дискретным образом, потому что время всегда является целым числом между 1 и 8. coxphfit функция поддерживает способы обработки связей в переменной времени (см. 'Ties' дополнительный вход в coxphfit). Из-за связей выход H имеет несколько строк с одинаковыми значениями YOB, но он может быть обработан так, чтобы иметь только столько строк, сколько уникальных значений YOB, как показано здесь.

% Process baseline HCox to account for discrete time (remove time ties)
HCoxDiscreteT = unique(HCox(:,1));
HCoxDiscreteH = grpstats(HCox(:,2),HCox(:,1),'max');
HCox = [HCoxDiscreteT HCoxDiscreteH];

% Convert baseline to h
xCox = HCox(:,1);
hCox = diff([0;HCox(:,2)]);

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

Прогнозируемые PD сравниваются с наблюдаемыми PD в данных обучения.

% Compute proportion of loans in each score group
ScoreGroupFraction = countcats(dataSurvival.ScoreGroup(TrainDataInd));
ScoreGroupFraction = ScoreGroupFraction/sum(ScoreGroupFraction);

% Baseline h is the hazard rate for 'High Risk', in the first column
% Columns 2 and 3 have the 'Medium' and 'Low' risk respectively,
% which are adjusted by their corresponding parametric term of the Cox model
hPredictedByScore = zeros(length(hCox),NumScoreGroups);
hPredictedByScore(:,1) = hCox;
for ii=2:NumScoreGroups
    hPredictedByScore(:,ii) = hCox*exp(bCox(ii-1));
end
hPredicted = hPredictedByScore*ScoreGroupFraction;

% Get the ecdf of the training data
HTrain = ecdf(dataSurvival.YearsObserved(TrainDataInd),...
    'Censoring',dataSurvival.Censored(TrainDataInd),...
    'Function','cumulative hazard');
hTrain = diff(HTrain);

plot(x,hPredicted,'-o',x,hTrain,'*')
xlabel('Years on Books')
ylabel('PD')
legend('Model','Training')
title('Model Fit (Training Data)')
grid on

Figure contains an axes. The axes with title Model Fit (Training Data) contains 2 objects of type line. These objects represent Model, Training.

Сравните прогнозируемые и наблюдаемые PD в данных теста.

ScoreGroupFraction = countcats(dataSurvival.ScoreGroup(TestDataInd));
ScoreGroupFraction = ScoreGroupFraction/sum(ScoreGroupFraction);

hPredicted = hPredictedByScore*ScoreGroupFraction;

% Get the ecdf of the training data
HTest = ecdf(dataSurvival.YearsObserved(TestDataInd),...
    'Censoring',dataSurvival.Censored(TestDataInd),...
    'Function','cumulative hazard');
hTest = diff(HTest);

plot(x,hPredicted,'-o',x,hTest,'*')
xlabel('Years on Books')
ylabel('PD')
legend('Model','Test')
title('Model Fit (Test Data)')
grid on

Figure contains an axes. The axes with title Model Fit (Test Data) contains 2 objects of type line. These objects represent Model, Test.

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

Добавление макроинформации по-прежнему важно, поскольку как стресс-тестирование, так и проекции PD на время жизни требуют явной зависимости от макроинформации.

Модель Cox PH с макроэффектами

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

Расширение модели пропорциональных рисков Кокса для учета зависящих от времени переменных

h (Xi, t) = h0 (t) exp (∑j=1p1xijbj+∑k=1p2xik (t) ck)

где:

  • xij - значение переменной предиктора для i-го субъекта и j-го независимого от времени предиктора.

  • xik (t) - значение переменной предиктора для i-го субъекта и k-го зависящего от времени предиктора в момент времени t.

  • bj - коэффициент j-й независимой от времени прогнозирующей переменной.

  • ck - коэффициент k-ой зависящей от времени переменной предиктора.

  • h (Xi (t), t) - коэффициент опасности в момент времени t для Xi (t).

  • h0 (t) - функция базовой степени опасности.

Дополнительные сведения см. в разделе coxphfit или модель пропорциональных рисков Кокса и содержащиеся в ней ссылки.

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

Для зависящего от времени анализа Cox PH используйте расширение исходного набора данных в качестве входных данных для зависящего от времени анализа.

Инструменты ожидают спецификации временных интервалов с соответствующими значениями предикторов. Для первого года интервал времени - от 0 до 1, для второго года интервал времени - от 1 до 2 и так далее. Поэтому диапазон временных интервалов для каждой строки YOB-1 к YOB.

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

Для переменных, зависящих от времени, значения изменяются от одного интервала к следующему. Мы добавим переменные ВВП и рынка в качестве предикторов, зависящих от времени.

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

data.TimeInterval = [data.YOB-1 data.YOB];
data.GDP = dataMacro.GDP(data.Year-min(data.Year)+1);
data.Market = dataMacro.Market(data.Year-min(data.Year)+1);
data.Censored = ~data.Default;
disp(head(data,10))
    ID    ScoreGroup     YOB    Default    Year    TimeInterval     GDP     Market    Censored
    __    ___________    ___    _______    ____    ____________    _____    ______    ________

    1     Low Risk        1        0       1997       0    1        2.72      7.61     true   
    1     Low Risk        2        0       1998       1    2        3.57     26.24     true   
    1     Low Risk        3        0       1999       2    3        2.86      18.1     true   
    1     Low Risk        4        0       2000       3    4        2.43      3.19     true   
    1     Low Risk        5        0       2001       4    5        1.26    -10.51     true   
    1     Low Risk        6        0       2002       5    6       -0.59    -22.95     true   
    1     Low Risk        7        0       2003       6    7        0.63      2.78     true   
    1     Low Risk        8        0       2004       7    8        1.85      9.48     true   
    2     Medium Risk     1        0       1997       0    1        2.72      7.61     true   
    2     Medium Risk     2        0       1998       1    2        3.57     26.24     true   

Подгонка модели, зависящей от времени. Те же идентификаторы, что и ранее, относятся к подмножествам обучения или тестирования, однако индексация отличается из-за различных форматов данных.

TrainDataIndTD = ismember(data.ID,TrainIDInd);
TestDataIndTD = ~TrainDataIndTD;

XTD = dummyvar(data.ScoreGroup(TrainDataIndTD));
XTD(:,1) = [];
[bCoxTD,~,HCoxTD] = ...
    coxphfit([XTD data.GDP(TrainDataIndTD) data.Market(TrainDataIndTD)],...
    data.TimeInterval(TrainDataIndTD,:),...
    'Censoring',data.Censored(TrainDataIndTD),...
    'Baseline',0);

% Process baseline HCoxTD to account for discrete time (remove time ties)
HCoxTDDiscreteT = unique(HCoxTD(:,1));
HCoxTDDiscreteH = grpstats(HCoxTD(:,2),HCoxTD(:,1),'max');
HCoxTD = [HCoxTDDiscreteT HCoxTDDiscreteH];

% Convert cumulative baseline to hCoxTD
xCoxTD = HCoxTD(:,1);
hCoxTD = diff([0;HCoxTD(:,2)]);

Чтобы визуализировать подгонку в образце, вычислите предсказанные PD по строкам. Настройте матрицу предиктора, как при подгонке модели, а затем примените формулу Cox PH.

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

% Set up predictor matrix
XPredict = [dummyvar(data.ScoreGroup(TrainDataIndTD)), data.GDP(TrainDataIndTD), data.Market(TrainDataIndTD)];
XPredict(:,1) = [];

% Predict at row level
hPredictedTD = hCoxTD(data.YOB(TrainDataIndTD)).*exp(XPredict*bCoxTD);

% Take the average of the predicted hazard rates at each time point (YOB)
hPredictedTD = grpstats(hPredictedTD,data.YOB(TrainDataIndTD));

plot(x,hPredictedTD,'-o',x,hTrain,'*')
xlabel('Years on Books')
ylabel('PD')
legend('Model','Training')
title('Macro Model Fit (Training Data)')
grid on

Figure contains an axes. The axes with title Macro Model Fit (Training Data) contains 2 objects of type line. These objects represent Model, Training.

Визуализация подгонки вне образца.

% Set up predictor matrix
XPredict = [dummyvar(data.ScoreGroup(TestDataIndTD)), data.GDP(TestDataIndTD), data.Market(TestDataIndTD)];
XPredict(:,1) = [];

% Predict at row level
hPredictedTD = hCoxTD(data.YOB(TestDataIndTD)).*exp(XPredict*bCoxTD);

% Take the average of the predicted hazard rates at each time point (YOB)
hPredictedTD = grpstats(hPredictedTD,data.YOB(TestDataIndTD));

plot(x,hPredictedTD,'-o',x,hTest,'*')
xlabel('Years on Books')
ylabel('PD')
legend('Model','Test')
title('Macro Model Fit (Test Data)')
grid on

Figure contains an axes. The axes with title Macro Model Fit (Test Data) contains 2 objects of type line. These objects represent Model, Test.

Для визуализации in-sample и out-of-sample на уровне группы баллов выполните те же операции после сегментирования данных по группам баллов.

Стресс-тестирование

В этом разделе показано, как выполнить анализ стресс-тестирования PDs с использованием макромодели Cox PH.

Предположим, что ниже приведены сценарии стресса для макроэкономических переменных, предоставляемых, например, регулятором.

disp(dataMacroStress)
                 GDP     Market
                _____    ______

    Baseline     2.27    15.02 
    Adverse      1.31     4.56 
    Severe      -0.22    -5.64 

Коэффициент опасности, который дает ПД по YOB, прогнозируется для каждой группы и каждого макросклада. Этот код предсказывает PD для каждой группы баллов и каждого макро-сценария.

Для визуализации каждого макро сценария возьмите среднее значение по группам баллов для объединения в один PD по YOB. График показывает прогнозируемое влияние неблагоприятных и сильно неблагоприятных макроусловий на средний PD для каждого YOB.

ScenarioLabels = dataMacroStress.Properties.RowNames;
NumScenarios = length(ScenarioLabels);

PDScenarios = zeros(length(x),NumScenarios);

for ii=1:NumScoreGroups
    
    Score = ScoreGroupLabels{ii};
    XPredictScore = ismember(ScoreGroupLabels(2:end)',Score);

    PDScenariosGroup = zeros(length(x),length(ScenarioLabels));
    
    for jj=1:NumScenarios

        Scenario = ScenarioLabels{jj};
        
        XPredictST = [XPredictScore dataMacroStress.GDP(Scenario) dataMacroStress.Market(Scenario)];
        hPredictedST = hCoxTD*exp(XPredictST*bCoxTD);

        PDScenariosGroup(:,jj) = hPredictedST;
        
    end
    
    PDScenarios = PDScenarios + PDScenariosGroup/NumScoreGroups;
    
end

figure;
bar(x,PDScenarios)
title('Stress Test, Probability of Default')
xlabel('Years on Books')
ylabel('PD')
legend('Baseline','Adverse','Severe')
grid on

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

Срок службы PD и ECL

В этом разделе показано, как вычислять PD на время жизни с помощью макромодели Cox PH и вычислять ожидаемые кредитные потери на время жизни (ECL).

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

Для конкретизации в этом разделе рассматривается восьмилетний заем в начале третьего года и прогнозируется годичный ПД от 3 лет до 8 срока действия этого займа. В этом разделе также рассчитывается вероятность выживания в течение оставшегося срока действия займа. Взаимосвязь между вероятностью выживания S (t) и однолетними ПД или показателями опасности h (t), иногда также называемыми форвардными ПД, составляет:

S (0) = 1, S (1) = (1-h (1)),... S (t) = S (t-1) (1-h (t)) = (1-h (1)) ⋯ (1-h (t))

Пример этого см. в разделе Метод Каплана-Мейера.

Срок службы PD (LPD) - это совокупный PD в течение срока действия кредита, определяемый дополнением вероятности выживания:

LPD (t) = 1-S (t)

Наконец, другим количеством процентов является предельный PD (MPD), который представляет собой увеличение срока службы PD между двумя последовательными периодами:

MPD (t + 1) = LPD (t + 1) -LPD (t)

Из этого следует, что предельный PD также является снижением вероятности выживания между последовательными периодами, а также уровнем опасности, умноженным на вероятность выживания:

MPD (t + 1) = S (t) -S (t + 1) = h (t + 1) S (t)

Укажите три макроэкономических сценария, один базовый прогноз и два простых сдвига на 20% выше или на 20% ниже значений для базового роста, которые называются «более быстрым ростом» и «более медленным ростом», соответственно. Сценарии в этом примере и соответствующие вероятности являются простыми сценариями только для иллюстрации. Более подробный набор сценариев может быть составлен с использованием более мощных моделей с использованием Econometrics Toolbox™ или Statistics and Machine Learning Toolbox™; см., например, Моделирование экономики США (Econometrics Toolbox). Автоматические методы обычно могут моделировать большое количество сценариев. На практике требуется лишь небольшое количество сценариев. Эти сценарии и соответствующие вероятности выбираются в сочетании с количественными инструментами и экспертными оценками.

CurrentAge = 3; % currently starting third year of loan
Maturity = 8; % loan ends at end of year 8
ScoreGroup = 'High Risk'; % High risk

YOBLifetime = (CurrentAge:Maturity)';
NumYearsRemaining = length(YOBLifetime);

tLifetime = (dataMacro.Year(end)+1:dataMacro.Year(end)+NumYearsRemaining)';
tLifetime0 = (dataMacro.Year(end):dataMacro.Year(end)+NumYearsRemaining)';

XPredictScore = ismember(ScoreGroupLabels(2:end)',ScoreGroup);
XPredictScore = repmat(XPredictScore,NumYearsRemaining,1);

GDPPredict = [2.3; 2.2; 2.1; 2.0; 1.9; 1.8];
GDPPredict = [0.8*GDPPredict GDPPredict 1.2*GDPPredict];

MarketPredict = [15; 13; 11; 9; 7; 5];
MarketPredict = [0.8*MarketPredict MarketPredict 1.2*MarketPredict];

ScenLabels = ["Slower growth" "Baseline" "Faster growth"];
NumMacroScen = size(GDPPredict,2);

% Scenario probabilities, used for the computation of lifetime ECL
PScenario = [0.2; 0.5; 0.3];

hPredict = zeros(size(GDPPredict));
for ii = 1:NumMacroScen
    XPredictLifetime = [XPredictScore GDPPredict(:,ii) MarketPredict(:,ii)];
    hPredict(:,ii) = hCoxTD(YOBLifetime).*exp(XPredictLifetime*bCoxTD);
end
survivalLifetime = [ones(1,NumMacroScen); cumprod(1-hPredict)];
PDLifetime = 1-survivalLifetime;
PDMarginal = diff(PDLifetime);

figure;
subplot(2,1,1)
plot(tLifetime0,PDLifetime)
xticks(tLifetime0)
grid on
xlabel('Year')
ylabel('Lifetime PD')
title('Lifetime PD By Scenario')
legend(ScenLabels,'Location','best')
subplot(2,1,2)
bar(tLifetime,PDMarginal)
grid on
xlabel('Year')
ylabel('Marginal PD')
title('Marginal PD By Scenario')
legend(ScenLabels)

Figure contains 2 axes. Axes 1 with title Lifetime PD By Scenario contains 3 objects of type line. These objects represent Slower growth, Baseline, Faster growth. Axes 2 with title Marginal PD By Scenario contains 3 objects of type bar. These objects represent Slower growth, Baseline, Faster growth.

Эти PD срока службы по сценарию являются одним из входных данных для вычисления ожидаемых кредитных потерь в течение срока службы (ECL), которые также требуют значений срока службы для данного дефолта убытков (LGD) и риска убытков при дефолте (EAD) для каждого сценария и вероятностей сценария. Для простоты в этом примере предполагается постоянное значение LGD и EAD, но эти параметры могут изменяться в зависимости от сценария и периода времени, когда используются модели LGD и EAD.

Для расчета ECL в течение всего срока действия также требуется эффективная процентная ставка (EIR) для целей дисконтирования. В этом примере коэффициенты дисконтирования вычисляются в конце периодов времени, но могут использоваться другие времена дисконтирования, например, средняя точка между периодами времени (то есть суммы дисконтирования за первый год с 6-месячным коэффициентом дисконтирования; дисконтные суммы второго года с 1,5-летним коэффициентом дисконтирования и так далее).

С помощью этих входных данных ожидаемый кредитный убыток в момент времени t для сценария s определяется как:

ECL (t; s) = MPD (t; s) LGD (t; s) EAD (t; s) Диск (t)

где t обозначает период времени, s обозначает сценарий, а Disc (t) = 1 (1 + EIR) t.

Для каждого сценария пожизненный ECL вычисляется путем добавления ECL через время от первого периода времени в анализе до ожидаемого срока службы продукта, обозначенного T, который в этом примере составляет пять лет (простой заем с пятью годами, оставшимися до погашения):

ECL =∑t=1TECL (t; s)

Наконец, вычислите взвешенное среднее этих ожидаемых кредитных потерь по всем сценариям, чтобы получить одно значение ECL срока службы, где P (s) обозначает вероятности сценария:

ECL=∑s=1NumScenariosECL (ы) P (ы)

LGD = 0.55; % Loss Given Default
EAD = 100; % Exposure at Default
EIR = 0.045; % Effective Interest Rate

DiscTimes = tLifetime-tLifetime0(1);
DiscFactors = 1./(1+EIR).^DiscTimes;

ECL_t_s = (PDMarginal*LGD*EAD).*DiscFactors; % ECL by year and scenario
ECL_s = sum(ECL_t_s); % ECL total by scenario
ECL = ECL_s*PScenario; % ECL weighted average over all scenarios

% Arrange yearly ECL's for display in table format
% Append ECL total per scenario, and scenario probabilities
ECL_Disp = array2table([ECL_t_s; ECL_s; PScenario']);
ECL_Disp.Properties.VariableNames = strcat("Scenario_",string(1:NumMacroScen)');
ECL_Disp.Properties.RowNames = [strcat("ECL_",string(tLifetime),"_s"); "ECL_total_s"; "Probability_s"];
disp(ECL_Disp)
                     Scenario_1    Scenario_2    Scenario_3
                     __________    __________    __________

    ECL_2005_s        0.94549        0.8921       0.84173  
    ECL_2006_s        0.71543        0.6789       0.64419  
    ECL_2007_s        0.53884       0.51412       0.49048  
    ECL_2008_s        0.40169       0.38527       0.36947  
    ECL_2009_s        0.20849       0.20098       0.19372  
    ECL_2010_s        0.12339       0.11952       0.11576  
    ECL_total_s        2.9333        2.7909        2.6554  
    Probability_s         0.2           0.5           0.3  
fprintf('Lifetime ECL: %g\n',ECL)
Lifetime ECL: 2.77872

Когда LGD и EAD не зависят от сценариев (даже если они изменяются со временем), средневзвешенное значение кривых PD на время жизни может быть взято для получения одной кривой PD на время жизни.

PDLifetimeWeightedAvg = PDLifetime*PScenario;
ECLByWeightedPD = sum(diff(PDLifetimeWeightedAvg)*LGD*EAD.*DiscFactors);
fprintf('Lifetime ECL, using weighted lifetime PD: %g, same result because of constant LGD and EAD.\n',...
    ECLByWeightedPD)
Lifetime ECL, using weighted lifetime PD: 2.77872, same result because of constant LGD and EAD.

Однако при изменении значений LGD и EAD в сценариях необходимо сначала вычислить значения ECL на уровне сценария, а затем найти средневзвешенное значение значений ECL.

Заключение

В этом примере показано, как подогнать модель Cox PH для PDs, как выполнить стресс-тестирование PDs и как вычислить PD и ECL на время жизни.

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

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

См. также

| | | | |

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

Подробнее