В этом примере показано, как построить модель прогнозирования для корпоративных ставок по умолчанию.
Параметры риска носят динамичный характер, и понимание того, как эти параметры изменяются во времени, является основополагающей задачей для управления рисками.
В первой части этого примера мы работаем с историческими данными миграции кредитов, чтобы построить некоторые временные ряды процентов и визуализировать динамику ставок по умолчанию. Во второй части этого примера мы используем некоторые из серий, построенных в первой части, и некоторые дополнительные данные для соответствия модели прогнозирования корпоративным ставкам по умолчанию, а также для демонстрации некоторых концепций обратного тестирования и стресс-тестирования. Представлена модель линейной регрессии для корпоративных ставок по умолчанию, но описанные инструменты и концепции можно использовать с другими методологиями прогнозирования. Приложение в конце ссылается на обработку моделей для матриц полного перехода.
Люди, заинтересованные в прогнозировании, тестировании и стресс-тестировании, могут перейти непосредственно ко второй части этого примера. Первая часть этого примера более актуальна для людей, работающих с данными миграции кредитов.
Мы работаем с историческими вероятностями перехода для корпоративных эмитентов (переменная TransMat). Это годовые данные за период 1981-2005 годов, начиная с [10]. Данные включают, за каждый год, количество эмитентов на рейтинг в начале года (переменная nIssuers) и количество новых эмитентов на рейтинг в год (переменная nNewIssuers). Существует также прогноз прибыли корпорации от [9] и корпоративный спред от [4] (переменные CPF и SPR). Переменная, указывающая годы рецессии (Recession), в соответствии с датами рецессии [7], используется в основном для визуализации.
Example_LoadData
Мы начинаем с выполнения некоторых агрегаций, чтобы получить корпоративные ставки по умолчанию для эмитентов инвестиционного уровня (IG) и спекулятивного уровня (SG), а также общую корпоративную ставку по умолчанию.
Агрегирование и сегментация являются относительными терминами. ИГ является совокупным по кредитным рейтингам, но сегментом с точки зрения всего корпоративного портфеля. Другие сегменты представляют интерес на практике, например, экономические сектора, отрасли или географические регионы. Однако данные, которые мы используем, агрегируются по кредитным рейтингам, поэтому дальнейшая сегментация невозможна. Тем не менее, инструменты и рабочий процесс, обсуждаемые здесь, могут быть полезны для работы с другими моделями для конкретных сегментов.
Использование функциональных возможностей в Финансах 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) в категорию 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);Вот итоговые данные 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
Вот визуализация динамики ИГ, СГ и общих корпоративных ставок дефолта вместе взятых. Чтобы подчеркнуть их закономерности, а не величины, используется логарифмическая шкала. Затененные полосы указывают на годы рецессии. Паттерны SG и IG немного отличаются. Например, в 1994 году уровень ИГ был выше, чем в 1995 году, но для ПГ все наоборот. Более заметно, что ставка дефолта ИГ достигла пика после рецессии 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')

Полученные скорости по умолчанию являются примерами скоростей на определенный момент времени (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]) используется моделирование, при котором ставка по умолчанию зависит от общего состояния экономики, например, рецессия против расширения. Полученные оценки спада и расширения могут быть полезными в таких рамках. Однако все они являются средними историческими показателями и могут работать плохо, если используются в качестве прогнозов для фактических ставок по умолчанию, ожидаемых в каком-либо конкретном году. Во второй части этого примера мы вновь рассмотрим использование этих типов исторических средних значений в качестве инструментов прогнозирования в заднем тестировании.
С помощью кредитных данных можно создать новые временные ряды процентов. Мы начинаем с возрастного прокси, который используется в качестве предиктора в модели прогнозирования во второй части этого примера.
Известно, что возраст является важным фактором в прогнозировании ставок по умолчанию; см., например, [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)];
Примерами других временных рядов интересов являются доля эмитентов 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)];
Мы работаем со следующей моделью линейной регрессии для корпоративных ставок по умолчанию
β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')

Можно показать, что нет убедительных статистических данных, позволяющих сделать вывод о нарушении допущений линейной регрессии. Очевидно, что ставки по умолчанию обычно не распределяются. Однако модель не делает такого предположения. Единственное предположение о нормальности в модели заключается в том, что, учитывая значения предикторов, ошибка между прогнозируемой и наблюдаемой ставками по умолчанию обычно распределяется. Глядя на подгонку в образце, это не кажется неразумным. Величина ошибок, безусловно, не зависит от того, являются ли ставки по умолчанию высокими или низкими. В 2001 году отмечается высокий уровень дефолта и высокая погрешность, однако в 1991 или 2002 годах также отмечаются высокие показатели и, тем не менее, очень небольшие погрешности. Аналогичным образом, в такие годы, как 1996 и 1997 годы, отмечаются значительные ошибки, однако в 2004 или 2005 годах отмечаются столь же низкие показатели и незначительные ошибки.
Тщательный статистический анализ модели выходит за рамки настоящего документа, однако существует несколько подробных примеров в Toolbox™ статистики и машинного обучения и Econometrics Toolbox™.
Чтобы оценить, как эта модель работает вне выборки, мы настроили упражнение бэктестирования. Начиная с конца 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')

На следующем графике отслеживается кумулятивная квадратная ошибка - мера, часто используемая для сравнения при тестировании. Это подтверждает, что TTC является плохой альтернативой. PIT показывает более низкую совокупную ошибку, чем модель линейной регрессии в конце девяностых, но после рецессии 2001 года ситуация меняется. Кумулятивная квадратная ошибка, однако, не является интуитивной мерой, трудно понять, что разница между этими альтернативами означает в практическом плане.
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-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

Используя модель линейной регрессии, мы наблюдаем дефицит резервов только через два из десяти лет, а максимальный дефицит в 2001 году составляет 0,09 миллиарда, всего девять базисных пунктов стоимости портфеля.
Напротив, и ТТК, и ПИТ к 2001 году достигнут дефицита в 1,2 млрд. Ситуация ухудшается для TTC в ближайшие два года, достигнув дефицита в 2,1 миллиарда к 2003 году. После 2001 года PIT делает коррекцию быстро, и к 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');

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

Очень разные предикторные значения приводят к сходным уровням скорости по умолчанию. Например, рассмотрим прогноз прибыли около 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 из 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] Альтман, Э. и Э. Хотчкисс, Корпоративный финансовый кризис и банкротство, третье издание, Нью-Джерси: Wiley Finance, 2006.
[2] Базельский комитет по банковскому надзору, «Международная конвергенция измерения капитала и стандартов капитала: пересмотренная основа», Банк международных расчетов (БМР), всеобъемлющий вариант, июнь 2006 года. Доступно по адресу: https://www.bis.org/publ/bcbsca.htm.
[3] Базельский комитет по банковскому надзору, «Принципы обоснованной практики стресс-тестирования и надзора - окончательный документ», Банк международных расчетов (БМР), май 2009 года. Доступно по адресу: https://www.bis.org/publ/bcbs155.htm.
[4] ФРЕД, Федеральная резервная система Сент-Луиса, Экономическая база данных Федеральной резервной системы, https://research.stlouisfed.org/fred2/.
[5] Хелвеге, Дж., и П. Клейман, «Понимание совокупных ставок дефолта высокодоходных облигаций», Федеральный резервный банк Нью-Йорка, Текущие вопросы экономики и финансов, том 2, номер 6, май 1996 года.
[6] Лоэффлер, Г. и П. Н. Пош, моделирование кредитных рисков с использованием Excel и VBA, Западный Суссекс, Англия: Wiley Finance, 2007.
[7] NBER, Национальное бюро экономических исследований, расширения и сокращения бизнес-цикла, https://www.nber.org/cycles/.
[8] Отани, А., С. Ширацука, Р. Цуруи и Т. Ямада, «Макро-стресс-тестирование кредитного портфеля японских банков», серия рабочих документов Банка Японии No.09-E-1, март 2009 г.
[9] Опрос профессиональных прогнозистов, Федеральный резервный банк Филадельфии, https://www.philadelphiafed.org/.
[10] Вацца, Д., Д. Аврора и Р. Шнек, «Ежегодное исследование глобального корпоративного дефолта 2005 года и переходы рейтинга», Standard & Poor's, Global Fixed Income Research, Нью-Йорк, январь 2006 года.
[11] Уилсон, Т. К., «Портфельный кредитный риск», Обзор экономической политики ФРБНИ, октябрь 1998 года.
bootstrp | transprob | transprobbytotals | transprobfromthresholds | transprobgrouptotals | transprobprep | transprobtothresholds