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

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

Этот пример использует fitLifetimePDModel от Risk Management Toolbox™, чтобы соответствовать Cox Модель PH. Несмотря на то, что та же модель может подбираться с помощью fitcox, пожизненная вероятность значения по умолчанию (PD) версия Cox модель спроектирована для заявок на кредит и поддерживает условное предсказание PD, пожизненное предсказание PD и инструменты проверки допустимости модели, включая графики точности и дискриминацию.

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

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

  • Экстраполирование вне наблюдаемых возрастов в данных — Cox Для модели PH, потому что это создается сверх непараметрического базового показателя риска, нужны дополнительные правила или предположения, чтобы экстраполировать, чтобы дать взаймы возрасты, которые не наблюдаются в наборе данных. Для примера смотрите Использование Модель PD Времени жизни Cox, чтобы Предсказать Условный PD. С другой стороны, Logistic модель обрабатывает возраст ссуды как непрерывная переменная; поэтому, Logistic модель может беспрепятственно экстраполировать, чтобы предсказать ФУНТЫ целую вечность, не наблюдаемые в наборе данных.

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

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

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

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

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

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

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

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

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

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

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

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

Переменные YOBгод, GDP, и Market наблюдаются в конце соответствующего календарного года. ScoreGroup дискретизация исходного кредитного рейтинга когда запущенная ссуда. Значение 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     
% You can also get years observed from YOB, though in this example, the 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 is 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). В этом анализе мероприятие является значением по умолчанию ссуды. Если ссуда наблюдается до значения по умолчанию у вас есть вся информация во время до значения по умолчанию. Поэтому пожизненная информация является не прошедшей цензуру или завершенной. В качестве альтернативы информация рассматривается подвергнутой цензуре или неполной, если в конце периода наблюдения ссуда не приняла значение по умолчанию. Ссуда не могла принять значение по умолчанию, потому что она была предварительно оплачена, или ссуда не приняла значение по умолчанию к концу восьмилетнего периода наблюдения в выборке.

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

% You can get ScoreGroup from YOB==1 because, 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. 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 object. The axes object with title Cumulative Default Probability, All Score Groups contains 3 objects of type stair.

Постройте условные однолетние ФУНТЫ против YOB. Например, условный однолетний PD для YOB из 3 условный однолетний PD для кредитов, которые находятся на их третьем году жизни. В анализе выживания это значение совпадает с дискретным показателем риска, обозначенным h, поскольку количество значений по умолчанию в конкретном году является количеством "отказов", и количество кредитов все еще на книгах в начале того же самого года совпадает с "номером в опасности". Чтобы вычислить h, получите совокупную функцию опасности выход, обозначенный H, и преобразуйте его к функции опасности h. Для получения дополнительной информации см. Метод Каплана-Мейера.

[H,x] = ecdf(dataSurvival.YearsObserved,'Censoring',dataSurvival.Censored, ...
    'Function','cumulative hazard');
% 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,
% you may need to check the x and h variables after every call to the ecdf function before
% plotting or concatenating results. (For example, if data set has no defaults in a
% particular year for the test data.)

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

Figure contains an axes object. The axes object with title Conditional One-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

Сегментируйте данные ScoreGroup дезагрегировать ФУНТЫ ScoreGroup.

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 One-Year PDs, By Score Group')
xlabel('Years on Books')
ylabel('PD')
legend(ScoreGroupLabels)

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

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

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

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

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

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

где:

  • Xi=(xi1,...,xip) переменные предикторы для i-ого предмета.

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

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

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

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

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

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

Соответствовать Cox пожизненная модель PD с помощью fitLifetimePDModel, используйте исходный data таблица в формате данных панели. Несмотря на то, что формат данных выживания в dataSurvival таблица может использоваться с другими функциями выживания, такими как ecdf или fitcox, fitLifetimePDModel функционируйте всегда работает с форматом данных панели. Это упрощает переключатель между моделями с, или без зависящих от времени моделей, и тот же формат данных панели используется для функций валидации, таких как modelAccuracyPlot. Подбирая модели Cox, fitLifetimePDModel функционируйте обрабатывает переменную возраста ('AgeVar' аргумент) как время к событию и это использует переменную отклика ('ResponseVar' аргумент) двоичные значения, чтобы идентифицировать подвергнутые цензуре наблюдения.

В подобранной модели, которая следует, единственным предиктором является ScoreGroup переменная. fitLifetimePDModel функционируйте проверяет периодичность данных (наиболее распространенный шаг возраста) и хранит его в 'TimeInterval' свойство Cox пожизненная модель PD. 'TimeInterval' информация важна для предсказания условного PD с помощью predict.

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

nIDs = max(data.ID);
uniqueIDs = unique(data.ID);

rng('default'); % For reproducibility
c = cvpartition(nIDs,'HoldOut',0.4);

TrainIDInd = training(c);
TestIDInd = test(c);

TrainDataInd = ismember(data.ID,uniqueIDs(TrainIDInd));
TestDataInd = ismember(data.ID,uniqueIDs(TestIDInd));

pdModel = fitLifetimePDModel(data(TrainDataInd,:),'cox', ...
   'IDVar','ID','AgeVar','YOB','LoanVars','ScoreGroup','ResponseVar','Default');
disp(pdModel)
  Cox with properties:

           TimeInterval: 1
    ExtrapolationFactor: 1
                ModelID: "Cox"
            Description: ""
                  Model: [1x1 CoxModel]
                  IDVar: "ID"
                 AgeVar: "YOB"
               LoanVars: "ScoreGroup"
              MacroVars: ""
            ResponseVar: "Default"
disp(pdModel.Model)
Cox Proportional Hazards regression model:

                                Beta         SE        zStat       pValue   
                              ________    ________    _______    ___________

    ScoreGroup_Medium Risk    -0.67831    0.037029    -18.319     5.8806e-75
    ScoreGroup_Low Risk        -1.2453    0.045243    -27.525    8.8419e-167

Чтобы предсказать условные ФУНТЫ, используйте predict. Например, предскажите PD для первого ID в данных.

PD_ID1 = predict(pdModel,data(1:8,:))
PD_ID1 = 8×1

    0.0083
    0.0059
    0.0055
    0.0052
    0.0039
    0.0033
    0.0016
    0.0009

Чтобы сравнить предсказанные ФУНТЫ с наблюдаемыми уровнями по умолчанию в обучении или тестовых данных, используйте modelAccuracyPlot. Этот график является визуализацией точности предсказанных значений PD (также известный как калибровку модели или прогнозирующую способность). Сгруппированная переменная требуется для точности модели PD. При помощи YOB как сгруппированная переменная, наблюдаемые уровни по умолчанию совпадают с уровнями по умолчанию, обсужденными в разделе Data Exploration with Survival Analysis Tools.

DataSetChoice = "Testing";
if DataSetChoice =="Training"
    Ind = TrainDataInd;
else
    Ind = TestDataInd;
end

modelAccuracyPlot (pdModel, данные (Ind, :),'YOB','DataID', DataSetChoice)

Figure contains an axes object. The axes object with title Scatter Grouped by YOB Testing Cox, RMSE = 0.00072531 contains 2 objects of type line. These objects represent Observed, Cox.

График точности принимает вторую сгруппированную переменную. Например, используйте ScoreGroup как вторая сгруппированная переменная, чтобы визуализировать предсказания PD на ScoreGroup, против YOB.

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

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

modelDiscriminationPlot возвращает кривую ROC. Используйте дополнительный 'SegmentBy' аргумент, чтобы визуализировать ROC для каждого ScoreGroup.

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

Figure contains an axes object. The axes object with title ROC Testing Segmented by ScoreGroup contains 3 objects of type line. These objects represent Cox, High Risk, AUROC = 0.62904, Cox, Medium Risk, AUROC = 0.61572, Cox, Low Risk, AUROC = 0.61719.

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

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

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

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

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

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) базовая функция показателя риска.

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

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

Ввод данных для Cox пожизненная модель PD с зависящими от времени предикторами использует исходные данные о панели со сложением макро-информации.

Как отмечалось ранее, подбирая модели Cox, fitLifetimePDModel функционируйте обрабатывает переменную возраста ('AgeVar' аргумент) как время к событию и это использует переменную отклика ('ResponseVar' аргумент) двоичные значения, чтобы идентифицировать подвергнутые цензуре наблюдения. В подобранной модели, которая следует, предикторами является ScoreGroup, GDP, и Market. fitLifetimePDModel проверяет периодичность данных (наиболее распространенный шаг возраста) и хранит его в 'TimeInterval' свойство Cox пожизненная модель PD. Для зависящих от времени моделей, 'TimeInterval' значение используется, чтобы задать интервалы возраста для каждой строки, где значения предиктора являются постоянными. Для получения дополнительной информации смотрите Временной интервал для Моделей Cox. 'TimeInterval' информация также важна для предсказания условного PD при использовании predict.

Внутренне, fitLifetimePDModel функционируйте использует fitcox. Используя fitLifetimePDModel для кредита модели предлагает некоторые преимущества перед fitcox. Например, когда вы работаете непосредственно с fitcox, вам нужна версия выживания данных для независимых от времени моделей, и "версия" процесса подсчета данных (похожий на форму данных о панели, но с дополнительной информацией) необходима для зависящих от времени моделей. fitLifetimePDModel функция всегда принимает форму данных о панели, как введено и выполняет данные, предварительно обрабатывающие прежде, чем вызвать fitcox. Кроме того, с пожизненной версией PD Cox модель, у вас есть специфичное для возможности получения кредита предсказание и функциональность валидации, не непосредственно поддержанная в базовой модели Cox.

data = join(data,dataMacro);
head(data)
ans=8×7 table
    ID    ScoreGroup    YOB    Default    Year     GDP     Market
    __    __________    ___    _______    ____    _____    ______

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

pdModelMacro = fitLifetimePDModel(data(TrainDataInd,:),'cox', ...
   'IDVar','ID','AgeVar','YOB','LoanVars','ScoreGroup', ...
   'MacroVars',{'GDP','Market'},'ResponseVar','Default');
disp(pdModelMacro)
  Cox with properties:

           TimeInterval: 1
    ExtrapolationFactor: 1
                ModelID: "Cox"
            Description: ""
                  Model: [1x1 CoxModel]
                  IDVar: "ID"
                 AgeVar: "YOB"
               LoanVars: "ScoreGroup"
              MacroVars: ["GDP"    "Market"]
            ResponseVar: "Default"
disp(pdModelMacro.Model)
Cox Proportional Hazards regression model:

                                 Beta          SE         zStat       pValue   
                              __________    _________    _______    ___________

    ScoreGroup_Medium Risk       -0.6794     0.037029    -18.348     3.4442e-75
    ScoreGroup_Low Risk          -1.2442     0.045244    -27.501    1.7116e-166
    GDP                        -0.084533     0.043687     -1.935       0.052995
    Market                    -0.0084411    0.0032221    -2.6198      0.0087991

Визуализируйте точность (также известный как калибровку модели или прогнозирующую способность) предсказанных значений PD с помощью modelAccuracyPlot.

DataSetChoice = "Testing";
if DataSetChoice =="Training"
    Ind = TrainDataInd;
else
    Ind = TestDataInd;
end

modelAccuracyPlot (pdModelMacro, данные (Ind, :),'YOB','DataID', DataSetChoice)

Figure contains an axes object. The axes object with title Scatter Grouped by YOB Testing Cox, RMSE = 0.0007251 contains 2 objects of type line. These objects represent Observed, Cox.

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

График точности ScoreGroup и кривая ROC создается тот же путь что касается модели Cox без макро-переменных.

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

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

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

disp(dataMacroStress)
                 GDP     Market
                _____    ______

    Baseline     2.27    15.02 
    Adverse      1.31     4.56 
    Severe      -0.22    -5.64 

Следующий код предсказывает ФУНТЫ для каждого ScoreGroup и каждый макро-сценарий. Для визуализации каждого макро-сценария возьмите среднее значение по ScoreGroups агрегировать данные в один PD YOB.

dataStress = table;
dataStress.YOB = repmat((1:8)',3,1);
dataStress.ScoreGroup = repmat("",size(dataStress.YOB));
dataStress.ScoreGroup(1:8) = ScoreGroupLabels{1};
dataStress.ScoreGroup(9:16) = ScoreGroupLabels{2};
dataStress.ScoreGroup(17:24) = ScoreGroupLabels{3};
dataStress.GDP = zeros(size(dataStress.YOB));
dataStress.Market = zeros(size(dataStress.YOB));

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

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

for jj=1:NumScenarios

   Scenario = ScenarioLabels{jj};
     
   dataStress.GDP(:) = dataMacroStress.GDP(Scenario);
   dataStress.Market(:) = dataMacroStress.Market(Scenario);

   % Predict PD for each ScoreGroup for the current scenario.
   dataStress.PD = predict(pdModelMacro,dataStress);

   % Average PD over ScoreGroups, by age, to visualize in a single plot.
   PDAvgTable = groupsummary(dataStress,"YOB","mean","PD");
   PDScenarios(:,jj) = PDAvgTable.mean_PD;
     
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 object. The axes object with title Stress Test, Probability of Default contains 3 objects of type bar. These objects represent Baseline, Adverse, Severe.

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

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

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

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

S(0)=1,S(1)=(1-PD(1)),...S(t)=S(t-1)(1-PD(t))=(1-PD(1))(1-PD(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)=PD(t+1)S(t)

Для получения дополнительной информации смотрите predictLifetime и метод Каплана-Мейера. predictLifetime функционируйте поддерживает пожизненный PD, крайний PD и форматы вероятности выживания.

Задайте три макроэкономических сценария, одну базовую проекцию и два простых сдвига на 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
YOBLifetime = (CurrentAge:Maturity)';
NumYearsRemaining = length(YOBLifetime);

dataLifetime = table;
dataLifetime.ID = ones(NumYearsRemaining,1);
dataLifetime.YOB = YOBLifetime;
dataLifetime.ScoreGroup = repmat("High Risk",size(dataLifetime.YOB)); % High risk
dataLifetime.GDP = zeros(size(dataLifetime.YOB));
dataLifetime.Market = zeros(size(dataLifetime.YOB));

% Macro scenarios for lifetime analysis
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 for the computation of lifetime ECL
PScenario = [0.2; 0.5; 0.3];

PDLifetime = zeros(size(GDPPredict));
PDMarginal = zeros(size(GDPPredict));
for ii = 1:NumMacroScen
    dataLifetime.GDP = GDPPredict(:,ii);
    dataLifetime.Market = MarketPredict(:,ii);
    PDLifetime(:,ii) = predictLifetime(pdModelMacro,dataLifetime); % Returns lifetime PD by default
    PDMarginal(:,ii) = predictLifetime(pdModelMacro,dataLifetime,'ProbabilityType','marginal');
end

% Start lifetime PD at last year with value of 0 for visualization
% purposes.
tLifetime0 = (dataMacro.Year(end):dataMacro.Year(end)+NumYearsRemaining)';
PDLifetime = [zeros(1,NumMacroScen);PDLifetime];
tLifetime = tLifetime0(2:end);

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 objects. Axes object 1 with title Lifetime PD by Scenario contains 3 objects of type line. These objects represent Slower growth, Baseline, Faster growth. Axes object 2 with title Marginal PD by Scenario contains 3 objects of type bar. These objects represent Slower growth, Baseline, Faster growth.

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

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

С этими входными параметрами ожидаемая потеря кредита во время t для сценария s задана как:

ECL(t;s)=MPD(t;s)LGD(t;s)EAD(t;s)Disc(t)

где t обозначает, что период времени, s обозначает сценарий, и Disc(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 ECLs 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.95927       0.90012        0.8446  
    ECL_2006_s          0.703       0.66366       0.62646  
    ECL_2007_s        0.48217       0.45781       0.43463  
    ECL_2008_s        0.40518       0.38686       0.36931  
    ECL_2009_s        0.22384       0.21488       0.20624  
    ECL_2010_s        0.13866       0.13381        0.1291  
    ECL_total_s        2.9121        2.7571        2.6103  
    Probability_s         0.2           0.5           0.3  
fprintf('Lifetime ECL: %g\n',ECL)
Lifetime ECL: 2.7441

Когда 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.7441, same result because of constant LGD and EAD.

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

Заключение

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

Ссылки

[1] Baesens, Барт, Дэниел Роеш и Харальд Шойле. Аналитика кредитного риска: техники измерений, приложения и примеры в SAS. Вайли, 2016.

[2] Беллини, Тициано. МСФО 9 и моделирование кредитного риска CECL и валидация: практическое руководство с примерами работало в R и SAS. Сан-Диего, CA: Elsevier, 2019.

[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

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

| | | | | | | | |

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

Больше о