В этом примере показано, как оценить первое к умолчанию (FTD) свопы под однородным предположением потерь.
Своп от первого к дефолту является инструментом, который платит предопределенную сумму, когда (и если) первый из корзины кредитных инструментов дефолт. Кредитными инструментами в корзине обычно являются облигации. Если мы примем, что сумма убытка после кредитного события одинаковая для всех кредитов в корзине, мы находимся под однородным допущением убытка. Это предположение упрощает модели, потому что любое значение по умолчанию в корзине инициирует ту же сумму платежа. Этот пример является реализацией методологии ценообразования для этих инструментов, как описано в O'Kane [2]. Существует два шага в методологии: а) Вычислите вероятность выживания для корзины численно; b) Используйте эту кривую выживания и стандартную функциональность кредитно-дефолтного свопа (CDS) для поиска спредов FTD и оценки существующих FTD свопов.
Учитывая рыночные котировки CDS для каждого эмитента в корзине, используйте cdsbootstrap
для калибровки отдельных кривых вероятностей по умолчанию для каждого эмитента.
% Interest rate curve ZeroDates = datenum({'17-Jan-10','17-Jul-10','17-Jul-11','17-Jul-12',... '17-Jul-13','17-Jul-14'}); ZeroRates = [1.35 1.43 1.9 2.47 2.936 3.311]'/100; ZeroData = [ZeroDates ZeroRates]; % CDS spreads % Each row in MarketSpreads corresponds to a different issuer; each % column to a different maturity date (corresponding to MarketDates) MarketDates = datenum({'20-Sep-10','20-Sep-11','20-Sep-12','20-Sep-14',... '20-Sep-16'}); MarketSpreads = [ 160 195 230 285 330; 130 165 205 260 305; 150 180 210 260 300; 165 200 225 275 295]; % Number of issuers equals number of rows in MarketSpreads nIssuers = size(MarketSpreads,1); % Settlement date Settle = datenum('17-Jul-2009');
На практике временная ось дискретизирована, и FTD-кривая выживания оценивается только в точках сетки. Мы используем одну точку каждые три месяца. Запросить эту cdsbootstrap
возвращает значения вероятностей по умолчанию для определенных точек сетки, которые мы хотим, используйте необязательный аргумент 'ProbDates'. Мы добавляем исходные стандартные даты рынка CDS в сетку, в противном случае информация о вероятности по умолчанию для этих дат будет интерполирована с использованием двух ближайших дат в сетке, и цены на даты рынка будут несовместимы с исходными рыночными данными.
ProbDates = union(MarketDates,daysadd(Settle,360*(0.25:0.25:8),1)); nProbDates = length(ProbDates); DefProb = zeros(nIssuers,nProbDates); for ii = 1:nIssuers MarketData = [MarketDates MarketSpreads(ii,:)']; ProbData = cdsbootstrap(ZeroData,MarketData,Settle,... 'ProbDates',ProbDates); DefProb(ii,:) = ProbData(:,2)'; end
Это калиброванные кривые вероятности по умолчанию для каждого кредита в корзине.
figure plot(ProbDates',DefProb) datetick title('Individual Default Probability Curves') ylabel('Cumulative Probability') xlabel('Date')
Скрытые переменные используются в различных контекстах кредитного риска с различными интерпретациями. В некоторых контекстах латентная переменная является прокси для изменения значения активов, и область этой переменной привязана, причем каждое интервал соответствует кредитному рейтингу. Пределы интервалов, или пороги, определяются из матриц миграции кредита. В нашем контексте латентная переменная связана со временем по умолчанию, и пороги определяют интервалы в дискретизированной временной сетке, где могут возникнуть значения по умолчанию.
Формально, если время до дефолта конкретного эмитента обозначено, и мы знаем его функцию вероятности по умолчанию, латентная переменная и соответствующие пороги удовлетворяют
или
Эти отношения делают латентные переменные подходы удобными как для симуляций, так и для аналитических производных. И то, и другое являются функциями времени.
Выбор распределения для переменной определяет пороги. В стандартной модели скрытых переменных переменная выбирается так, чтобы следовать стандартному нормальному распределению, из которого
где - совокупное стандартное нормальное распределение.
Используйте предыдущую формулу, чтобы определить пороги по умолчанию или просто пороги по умолчанию, соответствующие вероятностям по умолчанию, ранее полученным для кредитов в корзине.
DefThresh = norminv(DefProb);
Следуя O'Kane [2], мы используем модель латентной переменной с одним фактором, чтобы вывести выражения для функции вероятности выживания корзины.
Заданные параметры для каждого эмитента и заданные независимые стандартные нормальные переменные и, однофакторная латентная переменная модель принимает, что латентная переменная, связанная с эмитентом, удовлетворяет
Это вызывает корреляцию между эмитентами и о. Все скрытые переменные разделяют общий фактор как источник неопределенности, но каждая скрытая переменная также имеет идиосинкратический источник неопределенности. Чем больше коэффициент, тем больше латентная переменная напоминает общий коэффициент.
Используя модель скрытой переменной, мы выводим аналитическую формулу для вероятности выживания корзины.
Вероятность того, что эмитент выживает в прошлом времени, другими словами, что его время по умолчанию больше, чем
где - порог по умолчанию, вычисленный выше для эмитента, для -й даты в дискретизационной сетке.
Обусловленная значением однофактора, вероятность того, что все эмитенты выживают в прошлом времени,
где продукт оправдан, потому что все 's независимы. Поэтому, условно,'s являются независимыми.
Безусловная вероятность отсутствия значений по умолчанию по времени является интегралом по всем значениям предыдущей условной вероятности
со стандартной нормальной плотностью.
Путем оценки этого одномерного интеграла для каждой точки в сетке, мы получаем дискретизацию кривой выживания для всей корзины, которая является FTD кривой выживания.
Модель скрытой переменной может также использоваться, чтобы симулировать время дефолта, которое является задним механизмом многих методологий ценообразования для кредитных инструментов. Loeffler и Posch [1], например, оценивают вероятность выживания корзины посредством симуляции. В каждом моделируемом сценарии для каждого эмитента определяется время по умолчанию. При некоторой бухгалтерии вероятность наличия первого значения по умолчанию на каждом блоке сетки может быть оценена из симуляции. Подход к симуляции также обсуждается в O'Kane [2]. Симуляция очень гибко и применима ко многим кредитным инструментам. Однако, аналитические подходы предпочтительны, когда они доступны, потому что они намного быстрее и точнее, чем симуляция.
Чтобы вычислить вероятности выживания FTD в нашем примере, мы установите все беты в квадратный корень целевой корреляции. Затем мы закольцовываем все даты во временной сетке, чтобы вычислить одномерный интеграл, который дает вероятность выживания корзины.
Относительно реализации, условная вероятность выживания как функция от скаляра Z
будет
condProb=@(Z)prod(normcdf((-DefThresh(:,jj)+beta*Z)./sqrt(1-beta.^2)));
Однако функция интегрирования, которую мы используем, требует, чтобы указатель на функцию интегранда принимал векторы. Несмотря на то, что цикл вокруг скалярной версии условной вероятности работал бы, гораздо эффективнее векторизировать условную вероятность используя bsxfun
.
beta = sqrt(0.25)*ones(nIssuers,1); FTDSurvProb = zeros(size(ProbDates)); for jj = 1:nProbDates % vectorized conditional probability as a function of Z vecCondProb = @(Z)prod(normcdf(bsxfun(@rdivide,... -repmat(DefThresh(:,jj),1,length(Z))+bsxfun(@times,beta,Z),... sqrt(1-beta.^2)))); % truncate domain of normal distribution to [-5,5] interval FTDSurvProb(jj) = integral(@(Z)vecCondProb(Z).*normpdf(Z),-5,5); end FTDDefProb = 1-FTDSurvProb;
Сравните вероятность FTD с вероятностями по умолчанию отдельных эмитентов.
figure plot(ProbDates',DefProb) datetick hold on plot(ProbDates,FTDDefProb,'LineWidth',3) datetick hold off title('FTD and Individual Default Probability Curves') ylabel('Cumulative Probability') xlabel('Date')
В предположении, что все инструменты в корзине имеют одинаковую скорость восстановления или однородное предположение потерь (см. О'Кейн в ссылках), мы получаем спред для FTD-свопа с помощью cdsspread
функция, но передача FTD данных вероятностей только что вычислена.
Maturity = MarketDates; ProbDataFTD = [ProbDates, FTDDefProb]; FTDSpread = cdsspread(ZeroData,ProbDataFTD,Settle,Maturity);
Сравните спреды FTD с отдельными спредами.
figure plot(MarketDates,MarketSpreads') datetick hold on plot(MarketDates,FTDSpread,'LineWidth',3) hold off title('FTD and Individual CDS Spreads') ylabel('FTD Spread (bp)') xlabel('Maturity Date')
Существующий FTD-своп можно оценить с помощью cdsprice
, с использованием той же FTD вероятности.
Maturity0 = MarketDates(1); % Assume maturity on nearest market date Spread0 = 540; % Spread of existing FTD contract % Assume default values of recovery and notional FTDPrice = cdsprice(ZeroData,ProbDataFTD,Settle,Maturity0,Spread0); fprintf('Price of existing FTD contract: %g\n',FTDPrice)
Price of existing FTD contract: 17644.7
Чтобы проиллюстрировать чувствительность спредов FTD к параметрам модели, мы вычисляем рыночные спреды для области значений значений корреляции.
corr = [0 0.01 0.10 0.25 0.5 0.75 0.90 0.99 1]; FTDSpreadByCorr = zeros(length(Maturity),length(corr)); FTDSpreadByCorr(:,1) = sum(MarketSpreads)'; FTDSpreadByCorr(:,end) = max(MarketSpreads)'; for ii = 2:length(corr)-1 beta = sqrt(corr(ii))*ones(nIssuers,1); FTDSurvProb = zeros(length(ProbDates)); for jj = 1:nProbDates % vectorized conditional probability as a function of Z condProb = @(Z)prod(normcdf(bsxfun(@rdivide,... -repmat(DefThresh(:,jj),1,length(Z))+bsxfun(@times,beta,Z),... sqrt(1-beta.^2)))); % truncate domain of normal distribution to [-5,5] interval FTDSurvProb(jj) = integral(@(Z)condProb(Z).*normpdf(Z),-5,5); end FTDDefProb = 1-FTDSurvProb; ProbDataFTD = [ProbDates, FTDDefProb]; FTDSpreadByCorr(:,ii) = cdsspread(ZeroData,ProbDataFTD,Settle,Maturity); end
FTD-спреды лежат в полосе между суммой и максимумом отдельных спредов. Когда корреляция увеличивается до единицы, спреды FTD уменьшаются к максимуму отдельных спредов в корзине (все кредиты по умолчанию вместе). Когда корреляция уменьшается до нуля, спреды FTD приближаются к сумме отдельных спредов (независимых кредитов).
figure legends = cell(1,length(corr)); plot(MarketDates,FTDSpreadByCorr(:,1),'k:') legends{1} = 'Sum of Spreads'; datetick hold on for ii = 2:length(corr)-1 plot(MarketDates,FTDSpreadByCorr(:,ii),'LineWidth',3*corr(ii)) legends{ii} = ['Corr ' num2str(corr(ii)*100) '%']; end plot(MarketDates,FTDSpreadByCorr(:,end),'k-.') legends{end} = 'Max of Spreads'; hold off title('FTD Spreads for Different Correlations') ylabel('FTD Spread (bp)') xlabel('Maturity Date') legend(legends,'Location','NW')
Для коротких зрелостей и небольших корреляций корзина эффективно независима (спред FTD очень близок к сумме отдельных спредов). Корреляционный эффект становится более значимым для более длительных сроков.
Вот альтернативная визуализация зависимости FTD-спредов от корреляции.
figure surf(corr,MarketDates,FTDSpreadByCorr) datetick('y') ax = gca; ax.YDir = 'reverse'; view(-40,10) title('FTD Spreads for Different Correlations and Maturities') xlabel('Correlation') ylabel('Maturity Date') zlabel('FTD Spread (bp)')
[1] Loeffler, Gunter and Peter Posch, моделирование кредитных рисков с использованием Excel и VBA, Wiley Finance, 2007.
[2] O'Kane, Dominic, Modelling single-name and multi-name Credit Derivatives, Wiley Finance, 2008.
cdsbootstrap
| cdsprice
| cdsrpv01
| cdsspread