В этом примере показано, как работать с данными потребительской (розничной) кредитной панели для визуализации наблюдаемых вероятностей дефолта (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')

Построить график условных годичных ПД против 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')

Эти вероятности также можно вычислить непосредственно с помощью 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)

Можно дезагрегировать ПД по модификации и соответствующим образом сегментировать данные. Эти ПД можно построить по YOB или по календарному году. Для просмотра этих визуализаций см. раздел Стресс-тестирование вероятностей дефолта потребительского кредита с использованием данных панели.
В этом разделе показано, как подогнать модель Cox PH без макроинформации. Для этого используется формат данных выживания и модель включает в себя только не зависящие от времени предикторы, то есть информацию, которая остается постоянной в течение всего срока действия займа. В качестве не зависящего от времени предиктора используется только группа баллов в начале кредитования, но в модель могут быть добавлены другие такие предикторы (например, информация о модификации).
Регрессия пропорциональных рисков Кокса является полупараметрическим методом для корректировки оценок выживаемости для количественной оценки влияния предикторных переменных. Метод представляет эффекты пояснительных переменных как множитель общей базовой функции опасности ). Функция опасности является непараметрической частью функции регрессии пропорциональных рисков Кокса, в то время как влияние переменных предиктора является логлинейной регрессией. Эта модель Cox PH
∑j=1pxijbj)
где:
xip) являются прогнозирующими переменными для i-го субъекта.
- коэффициент j-ой прогнозирующей переменной.
t) - коэффициент опасности в момент времени t Xi.
) - функция базовой степени опасности.
Дополнительные сведения см. в разделе 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

Сравните прогнозируемые и наблюдаемые 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

Непараметрическая часть модели Cox PH позволяет ей близко соответствовать шаблону обучающих данных, даже используя только информацию о группе баллов в этой модели. Ошибки вне выборки (модель в сравнении с данными теста) также малы.
Добавление макроинформации по-прежнему важно, поскольку как стресс-тестирование, так и проекции PD на время жизни требуют явной зависимости от макроинформации.
В этом разделе показано, как соответствовать модели Cox PH, включая макроинформацию, в частности, рост валового внутреннего продукта (ВВП) и рост фондового рынка. Значение переменных макросов меняется каждый год, поэтому они являются зависящими от времени предикторами. При вводе данных для функциональных возможностей Cox PH с зависящими от времени предикторами используются исходные данные панели с добавлением макроинформации и временного интервала для каждой строки.
Расширение модели пропорциональных рисков Кокса для учета зависящих от времени переменных
∑j=1p1xijbj+∑k=1p2xik (t) ck)
где:
- значение переменной предиктора для i-го субъекта и j-го независимого от времени предиктора.
) - значение переменной предиктора для i-го субъекта и k-го зависящего от времени предиктора в момент времени t.
- коэффициент j-й независимой от времени прогнозирующей переменной.
- коэффициент k-ой зависящей от времени переменной предиктора.
t) - коэффициент опасности в момент времени t (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

Визуализация подгонки вне образца.
% 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

Для визуализации 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

В этом разделе показано, как вычислять PD на время жизни с помощью макромодели Cox PH и вычислять ожидаемые кредитные потери на время жизни (ECL).
Для моделирования времени жизни модель PD одинакова, но используется по-другому. Вам нужны прогнозируемые ПД не только на один период вперед, но и на каждый год в течение всего срока действия каждого конкретного кредита. Это означает, что в течение всего срока действия ссуд также требуются макроскарламентарии. В этом разделе устанавливаются альтернативные долгосрочные макро-сценарии, вычисляются предельные значения времени жизни для каждого сценария, а также соответствующие годичные предельные значения, предельные значения предельных значений и вероятности выживания. Срок службы и предельные ПД визуализируются для каждого года в каждом макро сценарии. Затем вычисляется ECL для каждого сценария и средневзвешенного времени жизни ECL.
Для конкретизации в этом разделе рассматривается восьмилетний заем в начале третьего года и прогнозируется годичный ПД от 3 лет до 8 срока действия этого займа. В этом разделе также рассчитывается вероятность выживания в течение оставшегося срока действия займа. Взаимосвязь между вероятностью выживания ) и однолетними ПД или показателями опасности t), иногда также называемыми форвардными ПД, составляет:
(1-h (1)) ⋯ (1-h (t))
Пример этого см. в разделе Метод Каплана-Мейера.
Срок службы PD (LPD) - это совокупный PD в течение срока действия кредита, определяемый дополнением вероятности выживания:
(t)
Наконец, другим количеством процентов является предельный PD (MPD), который представляет собой увеличение срока службы PD между двумя последовательными периодами:
) -LPD (t)
Из этого следует, что предельный PD также является снижением вероятности выживания между последовательными периодами, а также уровнем опасности, умноженным на вероятность выживания:
= 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)

Эти PD срока службы по сценарию являются одним из входных данных для вычисления ожидаемых кредитных потерь в течение срока службы (ECL), которые также требуют значений срока службы для данного дефолта убытков (LGD) и риска убытков при дефолте (EAD) для каждого сценария и вероятностей сценария. Для простоты в этом примере предполагается постоянное значение LGD и EAD, но эти параметры могут изменяться в зависимости от сценария и периода времени, когда используются модели LGD и EAD.
Для расчета ECL в течение всего срока действия также требуется эффективная процентная ставка (EIR) для целей дисконтирования. В этом примере коэффициенты дисконтирования вычисляются в конце периодов времени, но могут использоваться другие времена дисконтирования, например, средняя точка между периодами времени (то есть суммы дисконтирования за первый год с 6-месячным коэффициентом дисконтирования; дисконтные суммы второго года с 1,5-летним коэффициентом дисконтирования и так далее).
С помощью этих входных данных ожидаемый кредитный убыток в момент времени t для сценария s определяется как:
s) Диск (t)
где t обозначает период времени, s обозначает сценарий, а EIR) t.
Для каждого сценария пожизненный ECL вычисляется путем добавления ECL через время от первого периода времени в анализе до ожидаемого срока службы продукта, обозначенного T, который в этом примере составляет пять лет (простой заем с пятью годами, оставшимися до погашения):
; s)
Наконец, вычислите взвешенное среднее этих ожидаемых кредитных потерь по всем сценариям, чтобы получить одно значение ECL срока службы, где ) обозначает вероятности сценария:
(ы)
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 в течение всего срока службы.
confidenceBands | creditDefaultCopula | getScenarios | portfolioRisk | riskContribution | simulate