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

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

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

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

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

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

Мы работаем с историческими вероятностями перехода для корпоративных выпускающих (переменная 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

Полезно видеть и исходные данные и данные, хранимые в этих общих структурах сторона, чтобы примкнуть. Исходные данные содержат количество выпускающих и вероятностей перехода в течение каждого года. Например, для 2 005:

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 поле . Вот информация для 2 005:

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) в категорию SG. 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);

Вот эти 2 005 общих количеств, сгруппированных на уровне 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 и в non-default/default уровнях и сохраните уровни по умолчанию только (мы не используем остальную часть вероятностей перехода).

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 немного отличаются. Например, уровень IG выше в 1 994, чем в 1 995, но противоположное верно для SG. Более заметно уровень по умолчанию IG достиг максимума после 2 001 рецессии, в 2 002, тогда как пик для SG находится в 2 001. Это предполагает, что модели для динамики 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')

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

Полученные уровни по умолчанию являются примерами уровней момента времени (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')

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

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

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

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

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

% 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)];

Примерами других временных рядов интереса является пропорция выпускающих SG в конце каждого года или прокси возраста для SG.

% 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)];

Вторая часть: модель прогнозирования для уровней по умолчанию

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

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

где

  • AGE: прокси Возраста, заданный выше

  • 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')

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

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

Backtesting

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

Для backtesting относительную производительность модели, когда по сравнению с альтернативами, легче оценить, чем производительность модели в изоляции. Здесь мы включаем две альтернативы, чтобы определить уровень следующего года по умолчанию, оба вероятных кандидата на практике. Каждый - уровень по умолчанию 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')

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

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

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

Мы принимаем гомогенный портфель, где все кредиты имеют ту же вероятность значения по умолчанию, ту же потерю, данную значение по умолчанию (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)

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

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

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

В отличие от этого и TTC и PIT достигают дефицита 1,2 миллиардов 2 001. Вещи ухудшаются для TTC за следующие два года, достигая дефицита 2,1 миллиардов 2 003. PIT действительно делает коррекцию быстро после 2001, и 2 004, резервы имеют излишек. Все же и TTC и PIT приводят к большему количеству лет дефицита, чем избыточные годы в этом осуществлении.

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

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

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');

Наблюдаемые уровни по умолчанию выходят за пределы интервалов предсказания в течение двух лет, 1996 и 1997, где очень низкие уровни по умолчанию наблюдаются. Для 95%-го доверительного уровня, два из 10 кажется высоким. Все же наблюдаемые величины в этих случаях падают едва вне интервала предсказания, который является положительным знаком для модели. Это также положительно, что интервалы предсказания содержат наблюдаемые величины вокруг 2 001 рецессии.

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

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

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

Мы берем базовый сценарий предикторов в нашем случае, последние известные значения нашего возраста проксируют AGE, прогноз прибыли корпорации, CPF, и корпоративное распространение, SPR. Мы затем используем модель линейной регрессии, чтобы вычислить 95%-ю верхнюю границу доверия для предсказанного уровня по умолчанию. Мотивация для этого проиллюстрирована в последнем графике раздела backtesting, где 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 %)}'])

Совсем другие значения предиктора приводят к подобным уровням уровня по умолчанию. Например, рассмотрите, прибыль предсказывает приблизительно 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}']})

Уровни контура теперь указывают на потребности в капитале как на процент стоимости портфеля. Эти два сценария выше, прибыль 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')

Сдвиг критических значений к праву или оставленным изменениям вероятности перехода. Например, вот матрица перехода, полученная путем сдвига порогов 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}')

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

Ссылки

[1] Олтмен, E. и E. Хотчкисс, Корпоративное Финансовое Бедствие и Банкротство, третий выпуск, Нью-Джерси: Вайли Финэнс, 2006.

[2] Базельский Комитет по Банковскому надзору, "Международная Сходимость Измерения капитала и Стандартов капитала: Пересмотренная Среда", Банк международных расчетов (BIS), всесторонняя версия, июнь 2006. Доступный в: https://www.bis.org/publ/bcbsca.htm.

[3] Базельский Комитет по Банковскому надзору, "Принципы для Звуковых Методов Стресс-тестирования и Контроля - Итоговая Бумага", Банк международных расчетов (BIS), май 2009. Доступный в: https://www.bis.org/publ/bcbs155.htm.

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

[5] Helwege, J. и П. Клейман, "Изучая совокупные уровни по умолчанию связей высокой доходности", Федеральный резервный банк Нью-Йорка, текущих проблем в экономике и финансах, объеме 2, номер 6, май 1996.

[6] Loeffler, G. и П. Н. Пош, Credit Risk Modeling Using Excel и VBA, Западный Сассекс, Англия: финансы Вайли, 2007.

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

[8] Otani, A., С. Ширэтсука, Р. Тсуруи и Т. Ямада, "Макро-стресс-тестирование на кредитном портфеле японских банков", серия No.09-E-1 рабочего документа Банка Японии, март 2009.

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

[10] Vazza, D., Д. Аврора и Р. Шнек, "ежегодные 2 005 глобальных корпоративных переходов исследования и оценки по умолчанию", Standard & Poor's, глобальное исследование фиксированного дохода, Нью-Йорк, январь 2006.

[11] Вильсон, T. C. "кредитный риск в области портфеля", анализ экономической политики FRBNY, октябрь 1998.