Моделирование вероятностей значения по умолчанию с Cox пропорциональные опасности

В этом примере показано, как работать с потребителем (розничная продажа) данные о панели кредита, чтобы визуализировать наблюдаемые вероятности значения по умолчанию (ФУНТЫ) на разных уровнях. Это также показывает, как подбирать модель пропорциональных опасностей (PH) Cox, также известную как регрессию Cox, чтобы предсказать ФУНТЫ. Кроме того, это показывает, как выполнить анализ стресс-тестирования и как смоделировать пожизненные ФУНТЫ и пожизненное значение Ожидаемой потери кредита (ECL).

Подобный пример, Стресс-тестирование Вероятностей Значения по умолчанию Потребительского кредита Используя Данные о Панели, следует за тем же рабочим процессом, но использует логистическую регрессию вместо Cox PH. Основные отличия в двух подходах:

  • Подгонка модели: модель Cox PH имеет непараметрический базовый показатель риска, который может совпадать с шаблонами в ФУНТАХ намного более тесно, чем полностью параметрическая логистическая модель.

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

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

Исследование данных с аналитическими инструментами выживания

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

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

  • ID: Идентификатор ссуды.

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

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

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

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

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

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

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

  • Market: Рынок возвращается (год за год).

Переменные YOBгод, 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')

Постройте условные однолетние ФУНТЫ против YOB. Например, условный однолетний PD для YOB 3 является условным однолетним PD для кредитов, которые находятся на их третьем году жизни. В анализе выживания это называется дискретным показателем риска, обозначенным h. Чтобы вычислить 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')

Можно также вычислить эти вероятности непосредственно с 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

Сегментируйте данные группой счета, чтобы дезагрегировать ФУНТЫ группой счета.

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)

Можно дезагрегировать ФУНТЫ годом изготовления вина и сегментировать данные соответственно похожим способом. Можно построить эти ФУНТЫ против YOB или против календарного года. Чтобы видеть эту визуализацию, обратитесь к Стресс-тестированию Вероятностей Значения по умолчанию Потребительского кредита Используя Данные о Панели.

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

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

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

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

где:

  • Xi=(xi1,...,xIP) переменные предикторы для предмета ith.

  • bj коэффициент jth переменного предиктора.

  • h(Xi,t) показатель риска во время t для Xi.

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

Для получения дополнительной информации смотрите coxphfit или Cox Пропорциональная Модель Опасностей и ссылки там.

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

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

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

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

Предсказанные ФУНТЫ сравнены с наблюдаемыми ФУНТАМИ в обучающих данных.

% 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

Сравните предсказанный по сравнению с наблюдаемыми ФУНТАМИ в тестовых данных.

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

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

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

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

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

Расширение Cox пропорциональная модель опасностей, чтобы составлять зависящие от времени переменные

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

где:

  • xij значение переменного предиктора для предмета ith и jth независимого от времени предиктора.

  • xik(t) значение переменного предиктора для предмета ith и kth зависящего от времени предиктора во время t.

  • bj коэффициент jth независимого от времени переменного предиктора.

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

  • h(Xi(t),t) показатель риска во время t для Xi(t).

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

Для получения дополнительной информации смотрите coxphfit или Cox Пропорциональная Модель Опасностей и ссылки там.

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

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

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

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

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

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

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)]);

Чтобы визуализировать подгонку в выборке, вычислите предсказанную строку ФУНТОВ строкой. Настройте матрицу предиктора, подбирая модель, и затем применяйтесь, формула PH Cox применяется.

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

% 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

Визуализируйте подгонку из выборки.

% 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

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

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

Этот раздел показывает, как выполнить анализ стресс-тестирования ФУНТОВ с помощью модели макроса PH Cox.

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

disp(dataMacroStress)
                 GDP     Market
                _____    ______

    Baseline     2.27    15.02 
    Adverse      1.31     4.56 
    Severe      -0.22    -5.64 

Показатель риска, который дает PD YOB, предсказан для каждой группы и каждого макро-сценария. Этот код предсказывает ФУНТЫ для каждой группы счета и каждого макро-сценария.

Для визуализации каждого макро-сценария возьмите среднее значение по группам счета, чтобы агрегироваться в один 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

Пожизненный PD и ECL

Этот раздел показывает, как вычислить пожизненные ФУНТЫ с помощью модели макроса PH Cox и как вычислить пожизненные Ожидаемые потери кредита (ECL).

Для пожизненного моделирования модель PD является тем же самым, но это используется по-другому. Вам нужны предсказанные ФУНТЫ не всего один период вперед, но и в течение каждого года в течение жизни каждой конкретной ссуды. Это означает, что вам также нужны макро-сценарии в течение жизни кредитов. Этот раздел настраивает альтернативные долгосрочные макро-сценарии, вычисляет пожизненные ФУНТЫ согласно каждому сценарию, и соответствующие 1-летние ФУНТЫ, крайние ФУНТЫ и вероятности выживания. Пожизненные и крайние ФУНТЫ визуализируются в течение каждого года согласно каждому макро-сценарию. ECL затем вычисляется для каждого сценария и средневзвешенного пожизненного ECL.

Для конкретности этот раздел изучает восьмилетнюю ссуду в начале своего третьего года и предсказывает 1-летний PD с лет 3 - 8 из жизни этой ссуды. Этот раздел также вычисляет вероятность выживания в течение остающегося срока кредита. Отношение между вероятностью выживания S(t) и 1-летние ФУНТЫ или показатели риска h(t), иногда также названный прямыми ФУНТАМИ:

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

Для примера этого см. Метод Каплана-Мейера (Statistics and Machine Learning Toolbox).

Пожизненный 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)

Эти пожизненные ФУНТЫ сценарием являются одними из входных параметров для расчета пожизненных ожидаемых потерь кредита (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 обозначает сценарий, и Диск(t)=1(1+EIR)t.

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

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

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

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

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 за ФУНТЫ, как выполнить стресс-тестирование ФУНТОВ, и как вычислить пожизненные ФУНТЫ и ECL.

Подобный пример, Стресс-тестирование Вероятностей Значения по умолчанию Потребительского кредита Используя Данные о Панели, следует за тем же рабочим процессом, но использует логистическую регрессию вместо регрессии Cox. Расчет пожизненных ФУНТОВ и ECL в конце этого примера мог быть выполнен также с логистической моделью с некоторой адаптацией к коду.

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