В этом примере показано, как создать модель прогнозирования для корпоративных ставок по умолчанию.
Параметры риска носят динамический характер, и понимание того, как эти параметры изменяются во времени, является фундаментальной задачей для управления рисками.
В первой части этого примера мы работаем с данными об исторических кредитных миграциях, чтобы создать некоторые временные ряды процентов и визуализировать динамику ставок дефолта. Во второй части этого примера мы используем некоторые из серий, созданных в первой части, и некоторые дополнительные данные, чтобы соответствовать модели прогнозирования для корпоративных ставок по умолчанию и показать некоторые концепции обратного тестирования и проверки стресса. Представлена линейная регрессионная модель для корпоративных ставок по умолчанию, но описанные инструменты и концепции могут использоваться с другими методологиями прогнозирования. Приложение в конце ссылается на обработку моделей для полных матриц перехода.
Люди, заинтересованные в прогнозировании, обратном тестировании и проверке стресса, могут перейти непосредственно ко второй части этого примера. Первая часть этого примера более актуальна для людей, которые работают с данными миграции кредита.
Мы работаем с историческими вероятностями перехода для корпоративных эмитентов (переменная 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')
Полученные ставки по умолчанию являются примерами ставок на момент времени (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)];
Примерами других временных рядов интереса являются доля эмитентов ПГ в конце каждого года или возрастной доверенность для ПГ.
% 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)];
Мы работаем со следующей линейной моделью регрессии для корпоративных ставок по умолчанию
где
ВОЗРАСТ: Возраст прокси определен выше
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 годах аналогично низкие показатели и крошечные ошибки.
Тщательный статистический анализ модели здесь не из возможностей, но существует несколько подробных примеров в Statistics and Machine Learning Toolbox™ и Econometrics Toolbox™.
Чтобы оценить, как эта модель выполняет 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')
Следующий график отслеживает совокупную квадратную ошибку, меру, часто используемую для сравнений в упражнениях обратного тестирования. Это подтверждает ТТК как плохую альтернативу. 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
Это сумма, добавленная к резервам потерь на начало года t. На конец года известны фактические потери
Мы принимаем, что неиспользованные резервы потерь остаются в резервном фонде. Начальное сальдо в резервах в начале упражнения устанавливается равным нулю. Если фактические потери превышают ожидаемые потери, то в первую очередь используются неиспользованные резервы, накопленные за эти годы, и только если они заканчиваются, капитал используется для покрытия дефицита. Все это переводится в следующую формулу
или эквивалентно
Следующий рисунок показывает сальдо резервов потерь для каждой из трех альтернатив в упражнении обратного тестирования.
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 миллиарда, всего девять базисных точек значения портфеля.
Напротив, как ТТК, так и ПИТ достигли дефицита в 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');
Наблюдаемые показатели дефолта выходят за пределы интервалов предсказания в течение двух лет, 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
от 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] 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.
bootstrp
| transprob
| transprobbytotals
| transprobfromthresholds
| transprobgrouptotals
| transprobprep
| transprobtothresholds