В этом примере показано, как работать с потребителем (розничная продажа) данные о панели кредита, чтобы визуализировать наблюдаемые вероятности значения по умолчанию (ФУНТЫ) на разных уровнях. Это также показывает, как подбирать модель пропорциональных опасностей (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 пропорциональная регрессия опасностей является полупараметрическим методом для корректировки оценок выживаемости, чтобы определить количество эффекта переменных предикторов. Метод представляет эффекты объясняющих переменных как множитель общей базовой функции опасности, . Функция опасности является непараметрической частью Cox пропорциональная функция регрессии опасностей, тогда как удар переменных предикторов является логлинейной регрессией. Эта модель Cox PH
где:
переменные предикторы для предмета ith.
коэффициент jth переменного предиктора.
показатель риска во время 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 включая макро-информацию, а именно, рост валового внутреннего продукта (ВВП) и рост фондового рынка. Значение макро-изменений переменных каждый год, поэтому это зависящие от времени предикторы. Ввод данных для функциональности PH Cox с зависящими от времени предикторами использует исходные данные о панели со сложением макро-информации и временным интервалом для каждой строки.
Расширение Cox пропорциональная модель опасностей с учетом зависящих от времени переменных
где:
значение переменного предиктора для предмета ith и jth независимого от времени предиктора.
значение переменного предиктора для предмета ith и k-ого зависящего от времени предиктора во время t.
коэффициент jth независимого от времени переменного предиктора.
коэффициент k-ого зависящего от времени переменного предиктора.
показатель риска во время 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
Этот раздел показывает, как вычислить пожизненные ФУНТЫ с помощью модели макроса PH Cox и как вычислить пожизненные Ожидаемые потери кредита (ECL).
Для пожизненного моделирования модель PD является тем же самым, но это используется по-другому. Вам нужны предсказанные ФУНТЫ не всего один период вперед, но и в течение каждого года в течение жизни каждой конкретной ссуды. Это означает, что вам также нужны макро-сценарии в течение жизни кредитов. Этот раздел настраивает альтернативные долгосрочные макро-сценарии, вычисляет пожизненные ФУНТЫ согласно каждому сценарию, и соответствующие 1-летние ФУНТЫ, крайние ФУНТЫ и вероятности выживания. Пожизненные и крайние ФУНТЫ визуализируются в течение каждого года согласно каждому макро-сценарию. ECL затем вычисляется для каждого сценария и средневзвешенного пожизненного ECL.
Для конкретности этот раздел изучает восьмилетнюю ссуду в начале своего третьего года и предсказывает 1-летний PD с лет 3 - 8 из жизни этой ссуды. Этот раздел также вычисляет вероятность выживания в течение остающегося срока кредита. Отношение между вероятностью выживания и 1-летние ФУНТЫ или показатели риска , иногда также названный прямыми ФУНТАМИ:
Для примера этого см. Метод Каплана-Мейера.
Пожизненный PD (LPD) является совокупным PD в течение срока кредита, данного дополнением вероятности выживания:
Наконец, другое количество интереса является Крайним PD (MPD), который является увеличением пожизненного 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 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 задана как:
где t обозначает, что период времени, s обозначает сценарий, и .
Для каждого сценария пожизненный ECL вычисляется путем добавления ECLs через время, от периода времени кулака в анализе, к ожидаемой жизни продукта, обозначенного T, который в этом примере составляет пять лет (простая ссуда с пятью годами, оставаясь к зрелости):
Наконец, вычислите взвешенное среднее значение этих ожидаемых потерь кредита, через все сценарии, чтобы получить одно пожизненное значение 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 за ФУНТЫ, как выполнить стресс-тестирование ФУНТОВ, и как вычислить пожизненные ФУНТЫ и ECL.
Подобный пример, Стресс-тестирование Вероятностей Значения по умолчанию Потребительского кредита Используя Данные о Панели, следует за тем же рабочим процессом, но использует логистическую регрессию вместо регрессии Cox. Расчет пожизненных ФУНТОВ и ECL в конце этого примера мог быть выполнен также с логистической моделью с некоторой адаптацией к коду.
Можно изменить рабочий процесс, представленный в этих двух примерах, чтобы использовать другие формулировки модели. Например, можно подбирать логистическую модель, которая обрабатывает возраст как категориальное (дискретное время) переменная. В этом случае модель PD более тесно соответствовала бы наблюдаемым ФУНТАМ, но можно было бы потерять поддержку экстраполяции модели. Кроме того, вместо логистической регрессии, другие обобщенные линейные модели (GLMs) поддержаны fitglm
мог также использоваться с незначительными изменениями к коду, например, нелинейным моделям вероятности с нормальным распределением или дополнительным моделям логарифмического журнала. Поскольку все эти модели включают возраст ссуды и макро-информации явным образом в модель, они могут использоваться для стресс-тестирования и пожизненного PD и анализа ECL.
confidenceBands
| creditDefaultCopula
| getScenarios
| portfolioRisk
| riskContribution
| simulate