Этот пример показывает, как создать модель прогнозирования для корпоративных уровней по умолчанию.
Параметры риска являются динамическими по своей природе, и понимающий, как эти параметры изменение вовремя являются основной задачей для управления рисками.
В первой части этого примера мы работаем с историческими данными о миграциях кредита, чтобы создать некоторые временные ряды интереса и визуализировать динамику уровней по умолчанию. Во второй части этого примера мы используем некоторые ряды, созданные в первой части и некоторых дополнительных данных, чтобы соответствовать модели прогнозирования для корпоративных уровней по умолчанию и показать некоторый 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)];
Мы работаем со следующей моделью линейной регрессии для корпоративных уровней по умолчанию
где
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. Начиная в конце 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
Это - сумма, добавленная к резервам потерь в начале года t. В конце года известны фактические потери
Мы принимаем, что неиспользованные резервы потерь остаются в резервном фонде. Стартовый баланс в резервах в начале осуществления обнуляется. Если фактические потери превосходят ожидаемую потерю, неиспользованные резервы, накопленные за эти годы, используются сначала, и только если они заканчиваются, капитал использован, чтобы покрыть недостаток. Все это переводит в следующую формулу
или эквивалентно
Следующие данные показывают резервный баланс потерь для каждой из этих трех альтернатив в осуществлении 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
. Более точно мы строим контуры уровня по умолчанию по целой сетке значений SPR
и CPF
. Мы используем консервативную 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.