Прогнозирование корпоративных ставок дефолта

В этом примере показано, как создать модель прогнозирования для корпоративных ставок по умолчанию.

Параметры риска носят динамический характер, и понимание того, как эти параметры изменяются во времени, является фундаментальной задачей для управления рисками.

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

Люди, заинтересованные в прогнозировании, обратном тестировании и проверке стресса, могут перейти непосредственно ко второй части этого примера. Первая часть этого примера более актуальна для людей, которые работают с данными миграции кредита.

Часть I: Работа с данными о кредитных миграциях

Мы работаем с историческими вероятностями перехода для корпоративных эмитентов (переменная TransMat). Это ежегодные данные за период 1981-2005 годов, начиная с [10]. Данные включают за каждый год количество эмитентов на рейтинг в начале года (переменная nIssuers), и количество новых эмитентов на рейтинг в год (переменная nNewIssuers). Существует также прогноз корпоративной прибыли от [9] и корпоративный спред от [4] (переменные CPF и SPR). Переменная, указывающая годы рецессии (Recession), в соответствии с датами рецессии от [7], используется в основном для визуализации.

Example_LoadData

Получение ставок по умолчанию для различных категорий рейтингов

Мы начинаем с выполнения некоторых агрегаций, чтобы получить корпоративные ставки дефолта для эмитентов инвестиционного класса (IG) и спекулятивного класса (SG), и общий корпоративный процент дефолта.

Агрегация и сегментация являются относительными терминами. IG является совокупным по кредитным рейтингам, но сегментом с точки зрения общего корпоративного портфеля. Другие сегменты представляют интерес на практике, например, экономические секторы, отрасли или географические области. Однако данные, которые мы используем, агрегируются кредитными рейтингами, поэтому дальнейшая сегментация невозможна. Тем не менее, обсуждаемые здесь инструменты и рабочий процесс могут быть полезны для работы с другими моделями конкретных сегментов.

Используйте функциональность в Financial Toolbox™, в частности, функции transprobgrouptotals и transprobbytotals, для выполнения агрегации. Эти функции берут в качестве входов структуры с информацией о миграции кредита в конкретном формате. Мы настраиваем входы здесь и визуализируем их ниже, чтобы понять их информацию и формат.

% Pre-allocate the struct array
totalsByRtg(nYears,1) = struct('totalsVec',[],'totalsMat',[],...
   'algorithm','cohort');
for t = 1:nYears
   % Number of issuers per rating at the beginning of the year
   totalsByRtg(t).totalsVec = nIssuers(t,:);
   % Number of transitions between ratings during the year
   totalsByRtg(t).totalsMat = round(diag(nIssuers(t,:))*...
      (0.01*TransMat(:,:,t)));
   % Algorithm
   totalsByRtg(t).algorithm = 'cohort';
end

Рекомендуется видеть как исходные данные, так и данные, хранящиеся в этих итоговых структурах, один за другим. Исходные данные содержат количество эмитентов и вероятности перехода за каждый год. Для примера на 2005 год:

fprintf('\nTransition matrix for 2005:\n\n')
Transition matrix for 2005:
Example_DisplayTransitions(squeeze(TransMat(:,:,end)),nIssuers(end,:),...
   {'AAA','AA','A','BBB','BB','B','CCC'},...
   {'AAA','AA','A','BBB','BB','B','CCC','D','NR'})
         Init    AAA     AA      A    BBB     BB      B    CCC      D     NR 
   AAA     98  88.78   9.18   1.02      0      0      0      0      0   1.02 
    AA    407      0  90.66   4.91   0.49      0      0      0      0   3.93 
     A   1224   0.08   1.63  88.89   4.41      0      0      0      0   4.98 
   BBB   1535      0    0.2   5.93  84.04   3.06   0.46      0   0.07   6.25 
    BB   1015      0      0      0   5.71  76.75    6.9    0.2    0.2  10.25 
     B   1010      0      0    0.1   0.59   8.51  70.59   3.76   1.58  14.85 
   CCC    126      0      0      0   0.79   0.79   25.4  46.83   8.73  17.46 

Структура итогов хранит общее количество эмитентов на рейтинг в начале года в totalsVec и общее количество миграций между рейтингами (вместо вероятностей перехода) в totalsMat поле. Вот информация за 2005 год:

fprintf('\nTransition counts (totals struct) for 2005:\n\n')
Transition counts (totals struct) for 2005:
Example_DisplayTransitions(totalsByRtg(end).totalsMat,...
   totalsByRtg(end).totalsVec,...
   {'AAA','AA','A','BBB','BB','B','CCC'},...
   {'AAA','AA','A','BBB','BB','B','CCC','D','NR'})
         Init    AAA     AA      A    BBB     BB      B    CCC      D     NR 
   AAA     98     87      9      1      0      0      0      0      0      1 
    AA    407      0    369     20      2      0      0      0      0     16 
     A   1224      1     20   1088     54      0      0      0      0     61 
   BBB   1535      0      3     91   1290     47      7      0      1     96 
    BB   1015      0      0      0     58    779     70      2      2    104 
     B   1010      0      0      1      6     86    713     38     16    150 
   CCC    126      0      0      0      1      1     32     59     11     22 

Третье поле структуры итогов, algorithm, указывает, что мы работаем со cohort метод (duration также поддерживается, хотя информация в totalsVec и totalsMat было бы по-другому). Эти структуры получаются как необязательные выходы от transprob, но в этом примере показано, как можно задать эти структуры непосредственно.

Использование transprobgrouptotals для группирования рейтингов 'AAA' на 'BBB' (рейтинги с 1 по 4) в категорию IG и рейтинги 'BB' на 'CCC' (оценки от 5 до 7) в категорию ПГ. The edges аргумент сообщает функции, оценки которой должны быть сгруппированы вместе (от 1 до 4 и от 5 до 7). Мы также группируем все рейтинги, не связанные с дефолтом, в одну категорию. Это предварительные шаги по получению IG, SG и общих ставок дефолта для каждого года.

edgesIGSG = [4 7];
totalsIGSG = transprobgrouptotals(totalsByRtg,edgesIGSG);
edgesAll = 7; % could also use edgesAll = 2 with totalsIGSG
totalsAll = transprobgrouptotals(totalsByRtg,edgesAll);

Вот итоговые данные 2005 года, сгруппированные на уровне IG/SG, и соответствующая матрица перехода, восстановленная с помощью transprobbytotals.

fprintf('\nTransition counts for 2005 at IG/SG level:\n\n')
Transition counts for 2005 at IG/SG level:
Example_DisplayTransitions(totalsIGSG(end).totalsMat,...
   totalsIGSG(end).totalsVec,...
   {'IG','SG'},...
   {'IG','SG','D','NR'})
         Init     IG     SG      D     NR 
    IG   3264   3035     54      1    174 
    SG   2151     66   1780     29    276 
fprintf('\nTransition matrix for 2005 at IG/SG level:\n\n')
Transition matrix for 2005 at IG/SG level:
Example_DisplayTransitions(transprobbytotals(totalsIGSG(end)),[],...
   {'IG','SG'},...
   {'IG','SG','D','NR'})
           IG     SG      D     NR 
    IG  92.98   1.65   0.03   5.33 
    SG   3.07  82.75   1.35  12.83 

Теперь получите матрицы перехода для каждого года как на уровнях IG/SG, так и не по умолчанию/по умолчанию и сохраните только скорости по умолчанию (мы не используем остальные вероятности перехода).

DefRateIG = zeros(nYears,1);
DefRateSG = zeros(nYears,1);
DefRate = zeros(nYears,1);
for t=1:nYears
   % Get transition matrix at IG/SG level and extract IG default rate and
   % SG default rate for year t
   tmIGSG = transprobbytotals(totalsIGSG(t));
   DefRateIG(t) = tmIGSG(1,3);
   DefRateSG(t) = tmIGSG(2,3);
   % Get transition matrix at most aggregate level and extract overall
   % corporate default rate for year t
   tmAll = transprobbytotals(totalsAll(t));
   DefRate(t) = tmAll(1,2);
end

Вот визуализация динамики IG, SG и общих корпоративных ставок дефолта вместе. Чтобы подчеркнуть их шаблоны, а не их величины, используется шкала журнала. Затененные полосы указывают на годы рецессии. Шаблоны SG и IG немного отличаются. Что касается примера, то в 1994 году показатель IG был выше, чем в 1995 году, но обратное верно для SG. Более заметно, что уровень дефолта ИГ достиг пика после рецессии 2001 года, в 2002 году, в то время как пик для SG приходится на 2001 год. Это предполагает, что модели для динамики ставок по умолчанию IG и SG могут иметь важные различия, общую ситуацию при работе с различными сегментами. Общий корпоративный дефолт по конструкции - это комбинация двух других, и его шаблон ближе к SG, скорее всего, из-за относительной величины SG по сравнению с IG.

minIG = min(DefRateIG(DefRateIG~=0));
figure
plot(Years,log(DefRateSG),'m-*')
hold on
plot(Years,log(DefRate),'b-o')
plot(Years,log(max(DefRateIG,minIG-0.001)),'r-+')
Example_RecessionBands
hold off
grid on
title('{\bf Default Rates (log scale)}')
ylabel('log %')
legend({'SG','Overall','IG'},'location','NW')

Figure contains an axes. The axes with title {\bf Default Rates (log scale)} contains 8 objects of type line, patch. These objects represent SG, Overall, IG.

Получение ставок по умолчанию для различных временных периодов

Полученные ставки по умолчанию являются примерами ставок на момент времени (PIT), для их оценки используется только самая последняя информация. С другой стороны, мы можем использовать все миграции, наблюдаемые за 25 лет, охватываемые набором данных, для оценки долгосрочных или сквозных частот дефолта (TTC). Другими процентными ставками являются средние ставки дефолта за годы рецессии или расширения.

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

tmAllRec = transprobbytotals(totalsAll(Recession));
DefRateRec = tmAllRec(1,2);

tmAllExp = transprobbytotals(totalsAll(~Recession));
DefRateExp = tmAllExp(1,2);

tmAllTTC = transprobbytotals(totalsAll);
DefRateTTC = tmAllTTC(1,2);

На следующем рисунке показаны предполагаемые скорости PIT, скорости TTC, а также темпы рецессии и расширения.

DefRateTwoValues = DefRateExp*ones(nYears,1);
DefRateTwoValues(Recession) = DefRateRec;

figure
plot(Years,DefRate,'bo:','LineWidth',1.2)
hold on
stairs(Years-0.5,DefRateTwoValues,'m-','LineWidth',1.5)
plot(Years,DefRateTTC*ones(nYears,1),'r-.','LineWidth',1.5)
Example_RecessionBands
hold off
grid on
title('{\bf Default Rate}')
ylabel('%')
legend({'Point-in-time (PIT)','Recession/Expansion Avg',...
   'Through-the-cycle (TTC)'},'location','NW')

Figure contains an axes. The axes with title {\bf Default Rate} contains 8 objects of type line, stair, patch. These objects represent Point-in-time (PIT), Recession/Expansion Avg, Through-the-cycle (TTC).

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

Создание предикторов с использованием данных кредитных рейтингов

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

Известно, что возраст является важным фактором в прогнозировании показателей дефолта; см., например, [1] и [5]. Возраст здесь означает количество лет с момента выпуска облигации. Кроме того, возраст портфеля - это средний возраст его облигаций. Некоторые шаблоны наблюдались исторически. Многие некачественные заемщики дефолтуют всего через несколько лет после выпуска облигации. Когда проблемные компании выпускают облигации, заимствованная сумма помогает им совершать платежи на год-два. Помимо этого точкой, их единственным источником денег являются денежные потоки, и, если их недостаточно, происходит дефолт.

Мы не можем вычислить точный возраст портфеля, потому что в наборе данных нет информации на уровне эмитента. Однако мы следуем [6] и используем количество новых эмитентов в году t-3, разделенное на общее количество эмитентов на конец года t в качестве возрастного прокси. Из-за отставания возрастной прокси начинается с 1984 года. Для числителя у нас есть явная информация о количестве новых эмитентов. Для знаменателя количество эмитентов на конец года равняется количеству эмитентов на начало следующего года. Это известно за все годы, но последний, который устанавливается на общее число переходов в не дефолтный рейтинг плюс количество новых эмитентов на тот год.

% Total number of issuers at the end of the year
nEOY = zeros(nYears,1);
% nIssuers is number of issuers per ratings at the beginning of the year
% nEOY ( 1981 ) = sum nIssuers ( 1982 ), etc until 2004
nEOY(1:end-1) = sum(nIssuers(2:end,:),2);
% nEOY ( 2005 ) = issuers in non-default state at end of 2005 plus
% new issuers in 2005
nEOY(end) = totalsAll(end).totalsMat(1,1) + sum(nNewIssuers(end,:));
% Age proxy
AGE = 100*[nan(3,1); sum(nNewIssuers(1:end-3,:),2)./nEOY(4:end)];

Примерами других временных рядов интереса являются доля эмитентов ПГ в конце каждого года или возрастной доверенность для ПГ.

% nSGEOY: Number of SG issuers at the end of the year
% nSGEOY is similar to nEOY, but for SG only, from 5 ('BB') to 7 ('CCC')
indSG = 5:7;
nSGEOY = zeros(nYears,1);
nSGEOY(1:end-1) = sum(nIssuers(2:end,indSG),2);
nSGEOY(end) = sum(totalsIGSG(end).totalsMat(:,2)) +...
   sum(nNewIssuers(end,indSG));
% Proportion of SG issuers
SG = 100*nSGEOY./nEOY;
% SG age proxy: new SG issuers in t-3 / total issuers at the end of year t
AGESG = 100*[nan(3,1); sum(nNewIssuers(1:end-3,indSG),2)./nEOY(4:end)];

Часть II: Модель прогнозирования для ставок по умолчанию

Мы работаем со следующей линейной моделью регрессии для корпоративных ставок по умолчанию

DefRate=β0+βageAGE+βcpfCPF+βsprSPR

где

  • ВОЗРАСТ: Возраст прокси определен выше

  • CPF: Прогноз корпоративной прибыли

  • SPR: Корпоративный разброс по казначействам

Это та же модель, что и в [6], за исключением того, что модель в [6] предназначена только для IG.

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

inSample = 4:nYears-1;
T = length(inSample);
varNames = {'AGE','CPF','SPR'};
X = [AGE CPF SPR];
X = X(inSample,:);
y = DefRate(inSample+1); % DefaultRate, year t+1
stats = regstats(y,X);

fprintf('\nConst   AGE   CPF   SPR   adjR^2\n')
Const   AGE   CPF   SPR   adjR^2
fprintf('%1.2f  %1.2f %1.2f  %1.2f   %1.4f\n',...
   [stats.beta;stats.adjrsquare])
-1.19  0.15 -0.10  0.71   0.7424

Коэффициенты имеют ожидаемый знак: дефолтные ставки, как правило, увеличиваются с более высокой долей 3-летних эмитентов, уменьшаются с хорошей корпоративной прибылью и увеличением, когда корпоративные выражения выше. Скорректированный квадрат R показывает хорошую подгонку.

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

bHat = stats.beta;
yHat = [ones(T,1),X]*bHat;

figure
plot(Years(inSample+1),DefRate(inSample+1),'ko','LineWidth',1.5,...
   'MarkerSize',10,'MarkerFaceColor','g')
hold on
plot(Years(inSample+1),yHat,'b-s','LineWidth',1.2,'MarkerSize',10)
hold off
grid on
legend({'Actual','Model'},'location','NW')
title('{\bf Corporate Default Rate Models: In-Sample Fit}')
xlabel('Year')
ylabel('Percent')

Figure contains an axes. The axes with title {\bf Corporate Default Rate Models: In-Sample Fit} contains 2 objects of type line. These objects represent Actual, Model.

Можно показать, что нет сильных статистических данных, чтобы сделать вывод, что линейные регрессионые допущения нарушены. Очевидно, что ставки по умолчанию обычно не распределяются. Модель, однако, не делает этого предположения. Единственное предположение нормальности в модели заключается в том, что, учитывая значения предикторов, ошибка между предсказанной и наблюдаемой частотой дефолта обычно распределена. Глядя на подгонку в образце, это не кажется необоснованным. Величина ошибок, безусловно, кажется независимой от того, высокие ли показатели по умолчанию или низкие. Год 2001 имеет высокий уровень дефолта и высокую ошибку, но годы 1991 или 2002 также имеют высокие показатели и, тем не менее, очень маленькие ошибки. Аналогичным образом, низкие показатели дефолта, такие как 1996 и 1997 годы, свидетельствуют о значительных ошибках, но в 2004 или 2005 годах аналогично низкие показатели и крошечные ошибки.

Тщательный статистический анализ модели здесь не из возможностей, но существует несколько подробных примеров в Statistics and Machine Learning Toolbox™ и Econometrics Toolbox™.

Backtesting

Чтобы оценить, как эта модель выполняет out-of-sample, мы создали упражнение для обратного тестирования. Начиная с конца 1995 года, мы подбираем линейную регрессионую модель к информации, доступной до этой даты, и сравниваем предсказание модели с фактической частотой дефолта, наблюдаемой в следующем году. Повторяем то же самое для всех последующих лет до конца выборки.

Для обратного тестирования относительная эффективность модели, по сравнению с альтернативами, легче оценить, чем эффективность модели в изоляции. Здесь мы включили две альтернативы для определения дефолта в следующем году, оба вероятных кандидата на практике. Один из них является частотой дефолта TTC, оцененной с данными от начала выборки до текущего года, очень стабильной оценкой скорости дефолта. Другой - это показатель PIT, рассчитанный с использованием данных только за последний год, гораздо более чувствительный к последним событиям.

XBT = [AGE,CPF,SPR];
yBT = DefRate;

iYear0 = find(Years==1984); % index of first year in sample, 1984
T = find(Years==1995); % ind "current" year, start at 1995, updated in loop
YearsBT = 1996:2005; % years predicted in BT exercise
iYearsBT = find(Years==1996):find(Years==2005); % corresponding indices
nYearsBT = length(YearsBT); % number of years in BT exercise

MethodTags = {'Model','PIT','TTC'};
nMethods = length(MethodTags);
PredDefRate = zeros(nYearsBT,nMethods);
ErrorBT = zeros(nYearsBT,nMethods);

alpha = 0.05;
PredDefLoBnd = zeros(nYearsBT,1);
PredDefUpBnd = zeros(nYearsBT,1);

for k=1:nYearsBT
   % In sample years for predictors, from 1984 to "last" year (T-1)
   inSampleBT = iYear0:T-1;
   
   % Method 1: Linear regression model
   %   Fit regression model with data up to "current" year (T)
   s = regstats(yBT(inSampleBT+1),XBT(inSampleBT,:));
   %   Predict default rate for "next" year (T+1)
   PredDefRate(k,1) = [1 XBT(T,:)]*s.beta;
   %   Compute prediction intervals
   tCrit = tinv(1-alpha/2,s.tstat.dfe);
   PredStd = sqrt([1 XBT(T,:)]*s.covb*[1 XBT(T,:)]'+s.mse);
   PredDefLoBnd(k) = max(0,PredDefRate(k,1) - tCrit*PredStd);
   PredDefUpBnd(k) = PredDefRate(k,1) + tCrit*PredStd;

   % Method 2: Point-in-time (PIT) default rate
   PredDefRate(k,2) = DefRate(T);

   % Method 3: Through-the-cycle (TTC) default rate
   tmAll = transprobbytotals(totalsAll(iYear0:T));
   PredDefRate(k,3) = tmAll(1,2);

   % Update error
   ErrorBT(k,:) = PredDefRate(k,:) - DefRate(T+1);
   
   % Move to next year
   T = T + 1;
end

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

Example_BacktestPlot(YearsBT,DefRate(iYearsBT),PredDefRate,'Year','%',...
   '{\bf Default Rate Estimation Methods: Backtesting}',...
   ['Actual' MethodTags],'NW')

Figure contains an axes. The axes with title {\bf Default Rate Estimation Methods: Backtesting} contains 4 objects of type line. These objects represent Actual, Model, PIT, TTC.

Следующий график отслеживает совокупную квадратную ошибку, меру, часто используемую для сравнений в упражнениях обратного тестирования. Это подтверждает ТТК как плохую альтернативу. PIT показывает более низкую совокупную ошибку, чем линейная регрессионая модель в конце девяностых, но после рецессии 2001 года ситуация меняется. Кумулятивная квадратная ошибка, однако, не является интуитивной мерой, трудно понять, что различие между этими альтернативами означает в практическом плане.

CumSqError = cumsum(ErrorBT.^2);
Example_BacktestPlot(YearsBT,[],CumSqError,'Year','Cum Sq Error',...
   '{\bf Cumulative Square Error in Backtesting Exercise}',...
   MethodTags,'NW')

Figure contains an axes. The axes with title {\bf Cumulative Square Error in Backtesting Exercise} contains 3 objects of type line. These objects represent Model, PIT, TTC.

Имеет смысл преобразовать ошибки предсказания в денежную меру. Здесь мы измеряем влияние ошибки предсказания на упрощенную среду для создания резервов потерь в учреждении.

Мы предполагаем однородный портфель, где все кредиты имеют одинаковую вероятность дефолта, те же потери, что и дефолт (LGD), и тот же риск по умолчанию (EAD). LGD и EAD приняты известными. Для простоты мы сохраняем эти значения постоянными в течение 10 лет упражнения. Мы установили LGD на уровне 45%, и EAD на облигацию на уровне 100 миллионов. Портфель, как принято, имеет тысячу облигаций, поэтому общее значение портфеля, всего EAD, составляет 100 миллиардов.

Прогнозируемая ставка дефолта для года t, определенная на конец года t-1, используется для вычисления ожидаемого убытка для года t

ELt=EADt×LGDt×PredictedDefaultRatet

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

ALt=EADt×LGDt×ObservedDefaultRatet

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

Reservest=Reservest-1+(ELt-ALt)

или эквивалентно

Reservest=s=1t(ELt-ALt)

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

EAD = 100*ones(nYearsBT,1); % in billions
LGD = 0.45*ones(nYearsBT,1); % Loss given default, 45%
% Reserves excess or shortfall for each year, in billions
ReservesExcessShortfall = bsxfun(@times,EAD.*LGD,ErrorBT/100);
% Cumulative reserve balance for each year, in billions
ReservesBalanceEOY = cumsum(ReservesExcessShortfall);

Example_BacktestPlot(YearsBT,[],ReservesBalanceEOY,'Year',...
   'Billions of Dollars',...
   '{\bf Reserves Balance (EOY): Backtesting}',...
   MethodTags,'SW')
grid on

Figure contains an axes. The axes with title {\bf Reserves Balance (EOY): Backtesting} contains 3 objects of type line. These objects represent Model, PIT, TTC.

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

Напротив, как ТТК, так и ПИТ достигли дефицита в 1,2 миллиарда к 2001 году. Ситуация ухудшается для ТТК в ближайшие два года, достигнув дефицита в 2,1 миллиарда к 2003 году. ПИТ производит коррекцию быстро после 2001 года, и к 2004 году запасы имеют положительный результат. Тем не менее, как TTC, так и PIT приводят к большему дефициту лет, чем положительный год в этом мероприятии.

Линейная регрессионная модель показывает больше контрциклического эффекта, чем альтернативы в этом упражнении. Деньги, отложенные с использованием модели линейной регрессии, достигают почти миллиарда в 1997 и 1998 годах. Высокие уровни неиспользованных резервов приводят к более медленным темпам кредитования (не отраженным в упражнении, потому что мы экзогенно навязываем значение портфеля). Кроме того, капитал лишь незначительно пострадал во время рецессии 2001 года благодаря резервам, накопленным за предыдущий рост. Это приводит к увеличению объема доступного капитала для дальнейшего кредитования, при желании, в период экономического подъема.

Последним инструментом обратного тестирования, который мы обсуждаем, является использование интервалов предсказания. Модели линейной регрессии обеспечивают стандартные формулы для вычисления доверительных интервалов для значений новых наблюдений. Эти интервалы показаны на следующем рисунке за 10 лет, охватываемых обратным тестированием.

figure
plot(YearsBT,DefRate(iYearsBT),'ko','LineWidth',1.5,'MarkerSize',10,...
   'MarkerFaceColor','g')
hold on
plot(YearsBT,PredDefRate(:,1),'b-s','LineWidth',1.2,'MarkerSize',10)
plot(YearsBT,[PredDefLoBnd PredDefUpBnd],'b:','LineWidth',1.2)
hold off
strConf = num2str((1-alpha)*100);
title(['{\bf Backtesting Results with ' strConf '% Prediction Intervals}'])
xlabel('Year');
ylabel('%');
legend({'Actual','Predicted','Conf Bounds'},'location','NW');

Figure contains an axes. The axes with title {\bf Backtesting Results with 95% Prediction Intervals} contains 4 objects of type line. These objects represent Actual, Predicted, Conf Bounds.

Наблюдаемые показатели дефолта выходят за пределы интервалов предсказания в течение двух лет, 1996 и 1997 годов, где наблюдаются очень низкие показатели дефолта. Для 95% доверительного уровня два из 10 кажутся высокими. Тем не менее, наблюдаемые значения в этих случаях едва выходят за пределы интервала предсказания, что является положительным знаком для модели. Положительно также то, что интервалы предсказания содержат наблюдаемые значения вокруг рецессии 2001 года.

Стресс- Проверка

Стресс- проверка является широкой областью, которая достигает далеко за пределами вычислительных инструментов; см., например, [3]. Мы покажем некоторые инструменты, которые могут быть включены в комплексный стресс- среду тестирования. Мы опираемся на линейную регрессионую модель, представленную выше, но концепции и инструменты совместимы с другими методологиями прогнозирования.

Первым инструментом является использование интервалов предсказания для определения прогнозов худшего сценария. Это для учета неопределенности только в модели, а не в значении предикторов.

Мы берем базовый сценарий предикторов, в нашем случае, последних известных значений нашего возрастного прокси AGE, прогноз корпоративной прибыли, CPF, и корпоративный спред, SPR. Затем мы используем линейную регрессионую модель, чтобы вычислить 95% доверительную верхнюю границу для предсказанной скорости по умолчанию. Мотивация для этого проиллюстрирована на последнем графике секции обратного тестирования, где 95% доверительный верхний предел действует как консервативная граница, когда предсказание занижает фактические скорости дефолта.

tCrit = tinv(1-alpha/2,stats.tstat.dfe);
XLast = [AGE(end),CPF(end),SPR(end)];

yPred = [1 XLast]*stats.beta;
PredStd = sqrt([1 XLast]*stats.covb*[1 XLast]'+stats.mse);
yPredUB = yPred + tCrit*PredStd;

fprintf('\nPredicted default rate:\n');
Predicted default rate:
fprintf('     Baseline: %4.2f%%\n',yPred);
     Baseline: 1.18%
fprintf('     %g%% Upper Bound: %4.2f%%\n',(1-alpha)*100,yPredUB);
     95% Upper Bound: 2.31%

Следующим шагом является включение стрессовых сценариев предикторов в анализ. CPF и SPR может измениться в краткосрочной перспективе, в то время как AGE невозможно. Это важно. На прогноз корпоративной прибыли и корпоративное распространение влияют мировые события, в том числе, для примера, стихийные бедствия. Эти предикторы могут значительно измениться за ночь. С другой стороны AGE зависит от управленческих решений, которые могут вовремя изменить долю старых и новых кредитов, но эти решения требуют месяцев, если не лет, чтобы отразиться в AGE временные ряды. Сценарии для AGE совместимы с долгосрочным анализом. Здесь мы смотрим только на год вперед и продолжаем AGE исправлен для оставшейся части этого раздела.

Удобно задать предсказанную скорость по умолчанию и доверительные границы как функции CPF и SPR для упрощения анализа сценария.

yPredFn = @(cpf,spr) [1 AGE(end) cpf spr]*stats.beta;
PredStdFn = @(cpf,spr) sqrt([1 AGE(end) cpf spr]*stats.covb*...
   [1 AGE(end) cpf spr]'+stats.mse);
yPredUBFn = @(cpf,spr) (yPredFn(cpf,spr) + tCrit*PredStdFn(cpf,spr));
yPredLBFn = @(cpf,spr) (yPredFn(cpf,spr) - tCrit*PredStdFn(cpf,spr));

Два экстремальных сценария интереса могут быть снижением прогнозируемой корпоративной прибыли на 4% относительно базового уровня и увеличением корпоративного спреда на 100 базисные точки по сравнению с базовым уровнем.

Перемещение одного предиктора за раз в этом случае не неразумно, потому что корреляция между CPF и SPR очень низкая. Умеренные уровни корреляции могут потребовать возмущения предикторов вместе, чтобы получить более надежные результаты. Высоко коррелированные предикторы обычно не сосуществуют в одной модели, так как они предлагают избыточную информацию.

fprintf('\n\n         What-if Analysis\n');
         What-if Analysis
fprintf('Scenario         LB    Pred    UB\n');
Scenario         LB    Pred    UB
cpf = CPF(end)-4;
spr = SPR(end);
yPredRange = [yPredLBFn(cpf,spr),yPredFn(cpf,spr),yPredUBFn(cpf,spr)];
fprintf('CPF drops 4%%    %4.2f%%  %4.2f%%  %4.2f%%\n',yPredRange);
CPF drops 4%    0.42%  1.57%  2.71%
cpf = CPF(end);
spr = SPR(end)+1;
yPredRange = [yPredLBFn(cpf,spr),yPredFn(cpf,spr),yPredUBFn(cpf,spr)];
fprintf('SPR rises 1%%    %4.2f%%  %4.2f%%  %4.2f%%\n',yPredRange);
SPR rises 1%    0.71%  1.88%  3.05%
cpf = CPF(end);
spr = SPR(end);
yPredRange = [yPredLBFn(cpf,spr),yPredFn(cpf,spr),yPredUBFn(cpf,spr)];
fprintf('    Baseline    %4.2f%%  %4.2f%%  %4.2f%%\n',yPredRange);
    Baseline    0.04%  1.18%  2.31%
fprintf('\nCorrelation between CPF and SPR: %4.3f\n',corr(CPF,SPR));
Correlation between CPF and SPR: 0.012

Теперь мы принимаем более глобальный взгляд на анализ сценария. Вместо анализа одного сценария за раз, мы визуализируем прогнозы скорости по умолчанию как функцию CPF и SPR. Точнее, мы строим графики контуров скорости по умолчанию на целой сетке CPF и SPR значения. Мы используем консервативную 95% верхнюю границу.

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

gridCPF = 2*min(CPF):0.1:max(CPF);
gridSPR = min(SPR):0.1:2*max(SPR);
nGridCPF = length(gridCPF);
nGridSPR = length(gridSPR);

DefRateUB = zeros(nGridCPF,nGridSPR);
for i=1:nGridCPF
   for j=1:nGridSPR
      DefRateUB(i,j) = yPredUBFn(gridCPF(i),gridSPR(j));
   end
end
Example_StressTestPlot(gridCPF,gridSPR,DefRateUB,CPF,SPR,...
   'Corporate Profits Forecast (%)','Corporate Spread (%)',...
   ['{\bf ' strConf '% UB Default Rate Regions (in %)}'])

Figure contains an axes. The axes with title {\bf 95% UB Default Rate Regions (in %)} contains 3 objects of type contour, line, scatter.

Очень различные значения предиктора приводят к сходным уровням скорости по умолчанию. Например, рассмотрим прогноз прибыли около 10% с спредом 3,5% и прогноз прибыли -2,5% с спредом 2%, они оба приводят к дефолтной ставке чуть выше 3%. Кроме того, только одна точка в доступной истории приводит к ставке по умолчанию выше 4%.

Денежные условия, еще раз, могут быть более значимыми. Мы используем формулу требований к капиталу Базеля II (см. [2]), чтобы перевести ставки по умолчанию в денежную меру. Формула Базеля II удобна, потому что она аналитическая (не нужно моделировать, чтобы оценить требования к капиталу), но также и потому, что она зависит только от вероятностей дефолта. Мы определяем требования к капиталу Базеля II как функцию K.

% Correlation as a function of PD
w = @(pd) (1-exp(-50*pd))/(1-exp(-50)); % weight
R = @(pd) (0.12*w(pd)+0.24*(1-w(pd))); % correlation
% Vasicek formula
V = @(pd) normcdf(norminv(pd)+R(pd).*norminv(0.999)./sqrt(1-R(pd)));
% Parameter b for maturity adjustment
b = @(pd) (0.11852-0.05478*log(pd)).^2;
% Basel II capital requirement with LGD=45% and maturity M=2.5 (numerator
% in maturity adjustment term becomes 1)
K = @(pd) 0.45*(V(pd)-pd).*(1./(1-1.5*b(pd)));

Наихудшие ставки по умолчанию для целой сетки CPF - SPR пары хранятся в DefRateUB. Путем применения функции K на DefRateUB, мы можем визуализировать требования к капиталу по той же сетке.

CapReq = 100*K(DefRateUB/100);
Example_StressTestPlot(gridCPF,gridSPR,CapReq,CPF,SPR,...
   'Corporate Profits Forecast (%)','Corporate Spread (%)',...
   {'{\bf Capital Requirement Regions (% of value)}';...
   ['{\bf using ' strConf '% UB Default Rate}']})

Figure contains an axes. The axes with title {\bf Capital Requirement Regions (% of value)} {\bf using 95% UB Default Rate} contains 3 objects of type contour, line, scatter.

Контурные уровни теперь указывают потребность в капитале как процент от значения портфеля. Два сценария выше, прибыль 10% с разбросом 3,5% и прибыль -2,5% и спред 2%, приводят к потребности в капитале около 2,75%. Наихудшая точка из исторических данных приводит к требованию капитала около 3%.

Эта визуализация также может использоваться, например, как часть анализа обратного стресс-теста. Критические уровни капитала могут быть определены первыми, и рисунок может использоваться, чтобы определить области значений факторов риска (в этом случае CPF и SPR) которые приводят к этим критическим уровням.

Вместо исторических наблюдений за CPF и SPRэмпирическое распределение для факторов риска может быть моделировано с помощью, для примера, вектора авторегрессивной (VAR) модели из Econometrics Toolbox™. Требования к капиталу, соответствующие каждому уровню вероятности по умолчанию, могут быть найдены путем симуляции, если формула закрытой формы недоступна, и могут быть сгенерированы те же графики. Для больших симуляций распределенная вычислительная реализация с использованием Parallel Computing Toolbox™ или MATLAB ® Parallel Server™ может сделать процесс более эффективным.

Приложение: Моделирование матриц полного перехода

Матрицы перехода изменяются во времени, и полное описание их динамики требует работы с многомерными временными рядами. Существуют, однако, методы, которые используют конкретную структуру матриц перехода, чтобы уменьшить размерность задачи. В [8], например, используется один параметр, относящийся к пропорции понижений, и оба [6] и [8] описывают метод сдвига вероятностей перехода с помощью одного параметра. Последний подход показан в этом добавлении.

Метод принимает матрицу перехода TTC за базовую линию.

tmTTC = transprobbytotals(totalsByRtg);
Example_DisplayTransitions(tmTTC,[],...
   {'AAA','AA','A','BBB','BB','B','CCC'},...
   {'AAA','AA','A','BBB','BB','B','CCC','D','NR'})
          AAA     AA      A    BBB     BB      B    CCC      D     NR 
   AAA   88.2   7.67   0.49   0.09   0.06      0      0      0   3.49 
    AA   0.58  87.16   7.63   0.58   0.06   0.11   0.02   0.01   3.85 
     A   0.05    1.9  87.24   5.59   0.42   0.15   0.03   0.04   4.58 
   BBB   0.02   0.16   3.85  84.13   4.27   0.76   0.17   0.27   6.37 
    BB   0.03   0.04   0.25   5.26  75.74   7.36    0.9   1.12   9.29 
     B      0   0.05   0.19   0.31   5.52  72.67   4.21   5.38  11.67 
   CCC      0      0   0.28   0.41   1.24  10.92  47.06  27.02  13.06 

Эквивалентным способом представления этой матрицы является преобразование ее в пороги качества кредита, то есть критические значения стандартного нормального распределения, которые дают одинаковые вероятности перехода (строка за строкой).

thresholdMat = transprobtothresholds(tmTTC);
Example_DisplayTransitions(thresholdMat,[],...
   {'AAA','AA','A','BBB','BB','B','CCC'},...
   {'AAA','AA','A','BBB','BB','B','CCC','D','NR'})
          AAA     AA      A    BBB     BB      B    CCC      D     NR 
   AAA    Inf  -1.19  -1.74   -1.8  -1.81  -1.81  -1.81  -1.81  -1.81 
    AA    Inf   2.52  -1.16  -1.68  -1.75  -1.75  -1.76  -1.77  -1.77 
     A    Inf   3.31   2.07  -1.24  -1.62  -1.66  -1.68  -1.68  -1.69 
   BBB    Inf   3.57   2.91   1.75  -1.18  -1.43  -1.49   -1.5  -1.52 
    BB    Inf   3.39   3.16   2.72   1.59  -0.89  -1.21  -1.26  -1.32 
     B    Inf    Inf   3.28   2.82   2.54   1.55   -0.8  -0.95  -1.19 
   CCC    Inf    Inf    Inf   2.77   2.46   2.07   1.13  -0.25  -1.12 

Пороги качества кредита проиллюстрированы на следующем рисунке. Сегменты вертикальной оси представляют вероятности перехода, и контуры между ними определяют критические значения в горизонтальной оси через стандартное нормальное распределение. Каждая строка в матрице переходов определяет набор порогов. Рисунок показывает пороги для 'CCC' рейтинг.

xliml = -5;
xlimr = 5;
step = 0.1;
x = xliml:step:xlimr;
thresCCC = thresholdMat(7,:);
centersY = (normcdf([thresCCC(2:end) xliml])+...
   normcdf([xlimr thresCCC(2:end)]))/2;
labels = {'AAA','AA','A','BBB','BB','B','CCC','D','NR'};

figure
plot(x,normcdf(x),'m','LineWidth',1.5)
for i=2:length(labels)
   val = thresCCC(i);
   line([val val],[0 normcdf(val)],'LineStyle',':');
   line([x(1) val],[normcdf(val) normcdf(val)],'LineStyle',':');
   if (centersY(i-1)-centersY(i))>0.05
      text(-4.5,centersY(i),labels{i});
   end
end
xlabel('Credit Quality Thresholds')
ylabel('Cumulative Probability')
title('{\bf Visualization of Credit Quality Thresholds}')
legend('Std Normal CDF','Location','E')

Figure contains an axes. The axes with title {\bf Visualization of Credit Quality Thresholds} contains 21 objects of type line, text. This object represents Std Normal CDF.

Смещение критических значений вправо или влево изменяет вероятности перехода. Например, вот матрица перехода, полученная сдвигом порогов TTC на 0,5 вправо. Обратите внимание, что вероятность по умолчанию увеличивается.

shiftedThresholds = thresholdMat+0.5;
Example_DisplayTransitions(transprobfromthresholds(shiftedThresholds),...
   [],{'AAA','AA','A','BBB','BB','B','CCC'},...
   {'AAA','AA','A','BBB','BB','B','CCC','D','NR'})
          AAA     AA      A    BBB     BB      B    CCC      D     NR 
   AAA  75.34  13.84   1.05   0.19   0.13      0      0      0   9.45 
    AA   0.13  74.49  13.53   1.21   0.12   0.22   0.04   0.02  10.24 
     A   0.01   0.51   76.4  10.02   0.83   0.31   0.06   0.08  11.77 
   BBB      0   0.03    1.2  74.03   7.22   1.39   0.32   0.51  15.29 
    BB      0   0.01   0.05   1.77  63.35  10.94   1.47   1.88  20.52 
     B      0   0.01   0.04   0.07   1.91  59.67   5.74    8.1  24.46 
   CCC      0      0   0.05    0.1   0.36   4.61  35.06  33.18  26.65 

Учитывая конкретную матрицу PIT, идея в [6] и [8] состоит в том, чтобы изменить параметр сдвига, примененный к порогам TTC, так, чтобы полученная матрица перехода была максимально близка к матрице PIT. Близость измеряется как сумма квадратов различий между соответствующими вероятностями перехода. Оптимальная перемена называется кредитным индексом. Кредитный индекс определяется для каждой матрицы перехода PIT в выборке.

Здесь мы используем fminunc от Optimization Toolbox™ до поиска кредитных индексов.

CreditIndex = zeros(nYears,1);
ExitFlag = zeros(nYears,1);
options = optimset('LargeScale','Off','Display','Off');
for i=1:nYears
   errorfun = @(z)norm(squeeze(TransMat(:,:,i))-...
      transprobfromthresholds(...
      transprobtothresholds(tmTTC)+z),'fro');
   [CreditIndex(i),~,ExitFlag(i)] = fminunc(errorfun,0,options);
end

В целом ожидается, что более высокие кредитные индексы соответствуют более рискованным годам. Серия найденных кредитных индексов не полностью соответствует этому шаблону. Для этого могут быть разные причины. Во-первых, вероятности перехода могут отличаться от их долгосрочных средних значений различными способами, которые могут привести к смешанным эффектам в одном параметре, пытающемся захватить эти различия, кредитный индекс. Наличие отдельных кредитных индексов для IG и SG, например, может помочь разделить смешанные эффекты. Во-вторых, различие в пять базисных точек может быть очень значительной для 'BBB' скорость по умолчанию, но не так важно для 'CCC' скорость по умолчанию, но используемая норма взвешивает их одинаково. Могут быть рассмотрены и другие нормы. Также всегда неплохо проверить выходные флаги решателей оптимизации, на случай, если алгоритм не смог найти решение. Здесь мы получаем действительные решения на каждый год (все выходные флаги 1).

figure
plot(Years,CreditIndex,'-d')
hold on
Example_RecessionBands
hold off
grid on
xlabel('Year')
ylabel('Shift')
title('{\bf Credit Index}')

Figure contains an axes. The axes with title {\bf Credit Index} contains 6 objects of type line, patch.

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

Ссылки

[1] Altman, E. and E. Hotchkiss, Corporate Financial Distress and Bankruptcy, третье издание, New Jersey: Wiley Finance, 2006.

[2] Базельский комитет по банковскому надзору, «Международная конвергенция стандартов измерения капитала и стандартов капитала: пересмотренная среда», Банк международных расчетов (БМР), всеобъемлющий вариант, июнь 2006 года. Доступно в: https://www.bis.org/publ/bcbsca.htm.

[3] Базельский комитет по банковскому надзору, «Принципы рационального стресса Проверки практики и надзора - заключительный документ», Банк международных расчетов (БМР), май 2009 года. Доступно в: https://www.bis.org/publ/bcbs155.htm.

[4] FRED, Федеральная резервная система Сент-Луиса, Федеральная резервная экономическая база данных, https://research.stlouisfed.org/fred2/.

[5] Helwege, J. and P. Kleiman, «Понимание совокупных ставок дефолта облигаций с высоким выражением», Федеральный резервный банк Нью-Йорка, Текущие вопросы экономики и финансов, том 2, номер 6, май 1996.

[6] Loeffler, G. and P. N. Posch, моделирование кредитных рисков с использованием Excel и VBA, Западный Суссекс, Англия: Wiley Finance, 2007.

[7] NBER, Национальное бюро экономических исследований, расширения и сокращения бизнес-цикла, https://www.nber.org/cycles/.

[8] Otani, A., S. Shiratsuka, R. Tsurui, and T. Yamada, «Macro Stress-Testing on the Loan Portfolio of Japan Banks», Bank of Japan Working Paper Series No.09-E-1, March 2009.

[9] Опрос профессиональных прогнозистов, Федеральный резервный банк Филадельфии, https://www.philadelphiafed.org/.

[10] Vazza, D., D. Aurora, and R. Schneck, «Annual 2005 Global Corporate Default Study And Rating Transitions», Standard & Poor's, Global Fixed Income Research, New York, JAnanuary 2006.

[11] Wilson, T. C., «Portfolio Credit Risk», FRBNY Economic Policy Review, октябрь 1998.

См. также

| | | | | |

Похожие темы

Внешние веб-сайты