В этом примере показано, как работать с потребителем (розничная продажа) данные о панели кредита, чтобы визуализировать наблюдаемые вероятности значения по умолчанию (ФУНТЫ) на разных уровнях. Это также показывает, как подбирать модель пропорциональных опасностей (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')
Постройте условные однолетние ФУНТЫ против 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')
Можно также вычислить эти вероятности непосредственно с 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)
Можно также дезагрегировать ФУНТЫ Vintage
информация и сегмент данные похожим способом. Можно построить эти ФУНТЫ против YOB
или против календарного года. Чтобы видеть эту визуализацию, обратитесь к Стресс-тестированию Вероятностей Значения по умолчанию Потребительского кредита Используя Данные о Панели.
Этот раздел показывает, как соответствовать Cox
Модель PH без макро-информации. Модель включает только независимый от времени предиктор ScoreGroup
в происхождении кредитов. Независимые от времени предикторы содержат информацию, которая остается постоянной в сроке кредита. Этот пример использует только ScoreGroup
, но другие независимые от времени предикторы могли быть добавлены к модели (например, Vintage
информация).
Cox пропорциональная регрессия опасностей является полупараметрическим методом для корректировки оценок выживаемости, чтобы определить количество эффекта переменных предикторов. Метод представляет эффекты объясняющих переменных как множитель общей базовой функции опасности, . Функция опасности является непараметрической частью Cox пропорциональная функция регрессии опасностей, тогда как удар переменных предикторов является логлинейной регрессией. Модель Cox PH:
где:
переменные предикторы для i-ого предмета.
коэффициент j-ого переменного предиктора.
показатель риска во время 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)
График точности принимает вторую сгруппированную переменную. Например, используйте ScoreGroup
как вторая сгруппированная переменная, чтобы визуализировать предсказания PD на ScoreGroup
, против YOB
.
modelAccuracyPlot(pdModel,data(Ind,:),{'YOB','ScoreGroup'},'DataID',DataSetChoice)
modelDiscriminationPlot
возвращает кривую ROC. Используйте дополнительный 'SegmentBy'
аргумент, чтобы визуализировать ROC для каждого ScoreGroup
.
modelDiscriminationPlot(pdModel,data(Ind,:),'DataID',DataSetChoice,'SegmentBy','ScoreGroup')
Непараметрическая часть модели Cox позволяет ему тесно совпадать с шаблоном обучающих данных, даже при том, что только ScoreGroup
включен как предиктор в этой модели. Результаты на тестовых данных показывают большие ошибки, чем на обучающих данных, но этим результатом является все еще подходящий вариант.
Сложение макро-информации важно, потому что и стресс-тестирование и пожизненные проекции PD требуют явной зависимости от макро-информации.
Этот раздел показывает, как соответствовать Cox
Модель PH, которая включает макро-информацию, а именно, рост валового внутреннего продукта (ВВП) и рост фондового рынка. Значение макро-изменений переменных каждый год, таким образом, предикторы являются зависящими от времени.
Расширение Cox пропорциональная модель опасностей с учетом зависящих от времени переменных:
где:
значение переменного предиктора для i-ого предмета и j-ого независимого от времени предиктора.
значение переменного предиктора для i-ого предмета и k-ого зависящего от времени предиктора во время t.
коэффициент j-ого независимого от времени переменного предиктора.
коэффициент k-ого зависящего от времени переменного предиктора.
показатель риска во время 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)
Макро-эффекты помогают модели совпадать с наблюдаемыми уровнями по умолчанию еще ближе, и соответствие к обучающим данным похоже на интерполяцию для макро-модели.
График точности 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
Этот раздел показывает, как вычислить пожизненные ФУНТЫ с помощью Cox
макро-модель и как вычислить пожизненные ожидаемые потери кредита (ECL).
Для пожизненного моделирования модель PD является тем же самым, но это используется по-другому. Вам нужны предсказанные ФУНТЫ не всего один период вперед, но и в течение каждого года в течение жизни каждой конкретной ссуды. Вам также нужны макро-сценарии в течение жизни кредитов. Этот пример настраивает альтернативные долгосрочные макро-сценарии, вычисляет пожизненные ФУНТЫ согласно каждому сценарию и вычисляет соответствующие однолетние ФУНТЫ, крайние ФУНТЫ и вероятности выживания. Пожизненные и крайние ФУНТЫ визуализируются в течение каждого года согласно каждому макро-сценарию. ECL затем вычисляется для каждого сценария и средневзвешенного пожизненного ECL.
Для конкретности этот пример изучает восьмилетнюю ссуду в начале своего третьего года и предсказывает однолетний PD с лет 3
через 8
из жизни этой ссуды. Этот пример также вычисляет вероятность выживания в течение остающегося срока кредита. Отношение между вероятностью выживания и однолетние условные ФУНТЫ или показатели риска , иногда также названный прямыми ФУНТАМИ:
Пожизненный PD (LPD) является совокупным PD в течение срока кредита, данного дополнением вероятности выживания:
Другое количество интереса является крайним PD (MPD), который является увеличением пожизненного PD между двумя последовательными периодами:
Из этого следует, что крайний PD является также уменьшением в вероятности выживания между последовательными периодами, и также показателем риска, умноженным на вероятность выживания:
Для получения дополнительной информации смотрите 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)
Эти пожизненные ФУНТЫ, сценарием, являются одними из входных параметров для расчета пожизненных ожидаемых потерь кредита (ECL). ECL также требует пожизненных значений для потери, данной значение по умолчанию (LGD) и воздействия в значении по умолчанию (EAD) для каждого сценария и вероятностей сценария. Для простоты этот пример принимает постоянный LGD и значение EAD, но эти параметры для моделей LGD и EAD могли варьироваться сценарием и периодом времени. Для получения дополнительной информации смотрите fitLGDModel
и fitEADModel
.
Расчет пожизненного 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 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
fitLifetimePDModel
| predict
| predictLifetime
| modelDiscrimination
| modelDiscriminationPlot
| modelAccuracy
| modelAccuracyPlot
| Logistic
| Probit
| Cox