Калибровка с одной факторной моделью

Этот пример демонстрирует методы, чтобы калибровать одну факторную модель для оценки потерь кредита портфеля с помощью классов creditMigrationCopula или creditDefaultCopula.

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

Подбор кривой одной факторной модели

Поскольку корпоративные значения по умолчанию редки, распространено использовать прокси для кредитоспособности при калибровке моделей по умолчанию. Связка с одним фактором моделирует стоимость кредита компании с помощью скрытой переменной, A:

A=wX+1-w2ϵ

где X является системным фактором кредита, w является весом, который задает чувствительность компании к одному фактору, и ϵ особенный фактор. w и ϵ имейте среднее значение 0 и отклонение 1, и обычно принимаются, чтобы быть или Гауссовыми или иначе t дистрибутивами.

Вычислите корреляцию между X и A:

Corr(A,X)=Cov(A,X)σAσX

С тех пор X и A имеют отклонение 1 конструкцией и ϵ является некоррелированым с X, затем:

Corr(A,X)=Cov(A,X)=Cov(wX+1-w2ϵ,X)=wCov(X,X)+1-w2Cov(X,ϵ)=w

Если вы используете запас, возвращается как прокси для A, и индексные возвраты рынка являются прокси для X, то параметр веса, w, является корреляцией между запасом и индексом.

Подготовьте данные

Используйте возвраты промышленного индекса Доу-Джонса (DJIA) как сигнал для полного перемещения кредита рынка. Возвраты для 30 компаний компонента используются, чтобы калибровать чувствительность каждой компании к системному перемещению кредита. Веса для других компаний на фондовом рынке оцениваются таким же образом.

% Read one year of DJIA price data
t = readtable('dowPortfolio.xlsx');

% The table contains dates and the prices for each company at market close
% as well as the DJIA.
disp(head(t(:,1:7)))
      Dates       DJI      AA       AIG      AXP      BA        C  
    _________    _____    _____    _____    _____    _____    _____

     1/3/2006    10847    28.72    68.41    51.53    68.63    45.26
     1/4/2006    10880    28.89    68.51    51.03    69.34    44.42
     1/5/2006    10882    29.12     68.6    51.57    68.53    44.65
     1/6/2006    10959    29.02    68.89    51.75    67.57    44.65
     1/9/2006    11012    29.37    68.57    53.04    67.01    44.43
    1/10/2006    11012    28.44    69.18    52.88    67.33    44.57
    1/11/2006    11043    28.05     69.6    52.59     68.3    44.98
    1/12/2006    10962    27.68    69.04     52.6     67.9    45.02
% We separate the dates and the index from the table and compute daily returns using
% tick2ret.
dates = t{2:end,1};
index_adj_close = t{:,2};
stocks_adj_close = t{:,3:end};

index_returns = tick2ret(index_adj_close);
stocks_returns = tick2ret(stocks_adj_close);

Вычислите один факторные веса

Вычислите одно-факторные веса из коэффициентов корреляции между индексом, возвращается, и запас возвращается для каждой компании.

[C,daily_pval] = corr([index_returns stocks_returns]);
w_daily = C(2:end,1);

Эти значения могут использоваться непосредственно при использовании creditDefaultCopula с одним фактором или creditMigrationCopula.

Линейная регрессия часто используется в контексте факторных моделей. Для одной факторной модели линейная регрессия запаса возвращается по возвратам рынка, используется путем использования того, что коэффициент корреляции совпадает с квадратным корнем из коэффициента детерминации (R-squared) линейной регрессии.

w_daily_regress = zeros(30,1);
for i = 1:30
    lm = fitlm(index_returns,stocks_returns(:,i));
    w_daily_regress(i) = sqrt(lm.Rsquared.Ordinary);
end

% The regressed R values are equal to the index cross correlations
fprintf('Max Abs Diff : %e\n',max(abs(w_daily_regress(:) - w_daily(:))))
Max Abs Diff : 7.771561e-16

Эта линейная регрессия подбирает модель формы A=α+βX+ϵ, который в целом не совпадает со спецификациями с одной факторной моделью. Например, A и X не имейте нулевого среднего значения и стандартного отклонения 1. В целом между коэффициентом нет никакого отношения β и стандартное отклонение остаточного члена ϵ. Линейная регрессия используется выше только в качестве инструмента, чтобы получить коэффициент корреляции между переменными, данными квадратным корнем из значения R-squared.

Для калибровки с одной факторной моделью полезная альтернатива должна соответствовать линейной регрессии с помощью стандартизированного запаса, и рынок возвращают данные A и X. "Стандартизируйте" здесь средние значения, чтобы вычесть среднее значение и разделиться на стандартное отклонение. Модель A=α+βX+ϵ. Однако, потому что оба A и X имейте нулевое среднее значение, прерывание α всегда нуль, и потому что оба A и X имейте стандартное отклонение 1, стандартное отклонение остаточного члена удовлетворяет станд(ϵ)=1-β2. Это точно совпадает со спецификациями коэффициентов одной факторной модели. Параметр с одним фактором w установлен в коэффициент β, и совпадает со значением, найденным непосредственно посредством корреляции ранее.

w_regress_std = zeros(30,1);
index_returns_std = zscore(index_returns);
stocks_returns_std = zscore(stocks_returns);
for i = 1:30
    lm = fitlm(index_returns_std,stocks_returns_std(:,i));
    w_regress_std(i) = lm.Coefficients{'x1','Estimate'};
end

% The regressed R values are equal to the index cross correlations
fprintf('Max Abs Diff : %e\n',max(abs(w_regress_std(:) - w_daily(:))))
Max Abs Diff : 5.551115e-16

Этот подход делает естественным исследовать дистрибутивные предположения о переменных. creditDefaultCopula и объекты creditMigrationCopula поддерживают или нормальные распределения или t дистрибутивы для основных переменных. Например, при использовании normplot рынок возвращается, имеют тяжелые хвосты, поэтому t-связка более сопоставима с данными.

normplot(index_returns_std)

Оценка корреляций в течение более длинных периодов

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

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

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

% As an example, consider an overlapping 1-week window.
index_overlapping_returns = index_adj_close(6:end) ./ index_adj_close(1:end-5) - 1;
stocks_overlapping_returns = stocks_adj_close(6:end,:) ./ stocks_adj_close(1:end-5,:) - 1;

C = corr([index_overlapping_returns stocks_overlapping_returns]);
w_weekly_overlapping = C(2:end,1);

% Compare the correlation with the daily correlation.
% Show the daily vs. the overlapping weekly correlations
barh([w_daily w_weekly_overlapping])
yticks(1:30)
yticklabels(t.Properties.VariableNames(3:end))
title('Correlation with the Index');
legend('daily','overlapping weekly');

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

maxdailypvalue = max(daily_pval(2:end,1));
disp(table(maxdailypvalue,...
    'VariableNames',{'Daily'},...
    'rownames',{'Maximum p-value'}))
                         Daily   
                       __________

    Maximum p-value    1.5383e-08

При перемещении в перекрывающийся стиль окна прокрутки еженедельная корреляция дает немного отличающиеся корреляции. Это - удобный способ оценить более длительные корреляции периода от ежедневных данных. Однако возвраты смежных накладывающихся окон коррелируются так, соответствующие p-значения для перекрывающихся еженедельных отчетов не допустимы, поскольку вычисление p-значения в функции corr не составляет наборы данных накладывающегося окна. Например, смежные возвраты накладывающегося окна состоят из многих из тех же точек данных. Этот компромисс необходим начиная с перемещения в неперекрывающиеся окна, мог закончиться, неприемлемо разреженная выборка.

% Compare to non-overlapping weekly returns
fridays = weekday(dates) == 6;
index_weekly_close = index_adj_close(fridays);
stocks_weekly_close = stocks_adj_close(fridays,:);

index_weekly_returns = tick2ret(index_weekly_close);
stocks_weekly_returns = tick2ret(stocks_weekly_close);

[C,weekly_pval] = corr([index_weekly_returns stocks_weekly_returns]);
w_weekly_nonoverlapping = C(2:end,1);
maxweeklypvalue = max(weekly_pval(2:end,1));

% Compare the correlation with the daily and overlapping.
barh([w_daily w_weekly_overlapping w_weekly_nonoverlapping])
yticks(1:30)
yticklabels(t.Properties.VariableNames(3:end))
title('Correlation with the Index');
legend('daily','overlapping weekly','non-overlapping weekly');

P-значения для неналожения еженедельные корреляции намного выше, указывая на потерю статистического значения.

% Compute the number of samples in each series
numDaily = numel(index_returns);
numOverlapping = numel(index_overlapping_returns);
numWeekly = numel(index_weekly_returns);

disp(table([maxdailypvalue;numDaily],[NaN;numOverlapping],[maxweeklypvalue;numWeekly],...
    'VariableNames',{'Daily','Overlapping','Non_Overlapping'},...
    'rownames',{'Maximum p-value','Sample Size'}))
                         Daily       Overlapping    Non_Overlapping
                       __________    ___________    _______________

    Maximum p-value    1.5383e-08        NaN            0.66625    
    Sample Size               250        246                 50    

Экстраполирование ежегодной корреляции

Общее предположение с финансовыми данными - то, что возвраты актива являются временно некоррелироваными. Таким образом, актив возвращаются во время T, является некоррелированым к предыдущему возврату во время T-1. Под этим предположением ежегодная взаимная корреляция точно равна ежедневной взаимной корреляции.

Пусть Xt будьте ежедневным журналом, возвращаются из индекса рынка в день t и At будьте ежедневным возвратом коррелированого актива. Используя CAPM, отношение моделируется как:

At=α+βXt+ϵt

Одна факторная модель является особым случаем этого отношения.

Под предположением, что актив и индексные возвраты - каждый некоррелированый с их соответствующим прошлым, затем:

y, st:

cov(Xs,Xt)=0

cov(ϵs,ϵt)=0

cov(As,At)=0

Позвольте совокупному ежегоднику (журнал), возвращаются для каждого ряда быть

X=t=1TXt

A=t=1TAt

где T мог быть 252 в зависимости от базовых ежедневных данных.

Пусть σX2=var(Xt) и σA2=var(At) будьте ежедневными отклонениями, которые оцениваются от ежедневных данных о возврате.

Ежедневная ковариация между Xt и At :

cov(Xt,At)=cov(Xt,α+βXt+ϵt)=βσX2

Ежедневная корреляция между Xt и At :

corr(Xt,At)=cov(Xt,At)σX2σA2=βσXσA

Рассмотрите отклонения и ковариации в течение совокупного года возвратов. Под предположением ни о какой автокорреляции:

var(X)=var(t=1TXt)=TσX2

var(A)=var(t=1TAt)=TσA2

cov(X,A)=cov[t=1TXt,t=1T(α+βXt+ϵt)]=βcov(X,X)=βvar(X)=βTσx2

Ежегодная корреляция между активом и индексом:

corr(X,A)=cov(X,A)var(X)var(A)=βTσX2TσX2TσA2=βσXσA=w

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

Обработка автокорреляции

Если предположение, что активы не имеют никакой автокорреляции, ослаблено, то преобразование от ежедневной газеты до ежегодной взаимной корреляции между активами не является столь же прямым. var(X) теперь имеет дополнительные условия.

Сначала рассмотрите самый простой случай вычисления отклонения X когда T равен 2.

var(X)=[σ1σ2][1ρ12ρ121][σ1σ2]=σ12+σ22+2ρ12σ1σ2

С тех пор σ1=σ2=σXзатем:

var(X)=σX2(2+2ρ12)

Рассмотрите T = 3. Укажите, что корреляция между ежедневной газетой возвращается, которые являются k дни независимо как ρΔk.

var(X)=[σ1σ2σ3][1ρΔ1ρΔ2ρΔ11ρΔ1ρΔ2ρΔ11][σ1σ2σ3]=σ12+σ22+σ32+2ρΔ1σ1σ2+2ρΔ1σ2σ3+2ρΔ2σ1σ3=σX2(3+4ρΔ1+2ρΔ2)

В общем случае, для отклонения совокупного T-дня возвращают с автокорреляцией в запаздывание k дни, существует:

var(X)=2σX2(T/2+(T-1)ρΔ1X+(T-2)ρΔ2X+...+(T-k)ρΔkX)

Это - также та же формула для отклонения актива:

var(A)=2σA2(T/2+(T-1)ρΔ1A+(T-2)ρΔ2A+...+(T-k)ρΔkA)

Ковариация между X и A как показано ранее равно βvar(X).

Поэтому взаимная корреляция между индексом и активом с автокорреляцией от запаздывающего 1 до k дней:

corr(X,A)=cov(X,A)var(X)var(A)=βvar(X)var(X)var(A)=βvar(X)var(A)=...

corr(X,A)=β2σX2(T/2+(T-1)ρΔ1X+(T-2)ρΔ2X+...+(T-k)ρΔkX)2σA2(T/2+(T-1)ρΔ1A+(T-2)ρΔ2A+...+(T-k)ρΔkA)

corr(X,A)=βσXσAT/2+(T-1)ρΔ1X+(T-2)ρΔ2X+...+(T-k)ρΔkXT/2+(T-1)ρΔ1A+(T-2)ρΔ2A+...+(T-k)ρΔkA

Обратите внимание на то, что βσXσA вес под предположением ни о какой автокорреляции. Термин квадратного корня обеспечивает корректировку, чтобы составлять автокорреляцию в ряду. Корректировка зависит больше от различия между индексной автокорреляцией и автокорреляцией запаса, а не значениями этих автокорреляций. Таким образом, ежегодный вес с одним фактором, настроенный для автокорреляции:

wadjusted=wT/2+(T-1)ρΔ1X+(T-2)ρΔ2X+...+(T-k)ρΔkXT/2+(T-1)ρΔ1A+(T-2)ρΔ2A+...+(T-k)ρΔkA

Вычислите веса с автокорреляцией

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

corr1 = zeros(30,1);
pv1 = zeros(30,1);
for stockidx = 1:30
    [corr1(stockidx),pv1(stockidx)] = corr(stocks_returns(2:end,stockidx),stocks_returns(1:end-1,stockidx));
end
autocorrIdx = find(pv1 < 0.05)
autocorrIdx = 4×1

    10
    18
    26
    27

Существует четыре запаса с низкими p-значениями, которые могут указать на присутствие автокорреляции. Оцените ежегодную взаимную корреляцию с индексом в соответствии с этой моделью, рассмотрев однодневную автокорреляцию.

% The weights based off of yearly cross correlation are equal to the daily cross
% correlation multiplied by an additional factor.
T = 252;

w_yearly = w_daily;
[rho_index, pval_index] = corr(index_returns(1:end-1),index_returns(2:end));

% Check to see if our index has any significant autocorrelation
fprintf('One day autocorrelation in the index p-value: %f\n',pval_index);
One day autocorrelation in the index p-value: 0.670196
if pval_index < 0.05
    % If the p-value indicates there is no significant autocorrelation in the index,
    % set its rho to 0.
    rho_index = 0;
end

w_yearly(autocorrIdx) = w_yearly(autocorrIdx) .*...
    sqrt((T/2 + (T-1) .* rho_index) ./ (T/2 + (T-1) .* corr1(autocorrIdx)));

% Compare the adjusted annual cross correlation values to the daily values
barh([w_daily(autocorrIdx) w_yearly(autocorrIdx)])
yticks(1:4);
allNames = t.Properties.VariableNames(3:end);
yticklabels(allNames(autocorrIdx))
title('Annual One Factor Weights');
legend('No autocorrelation','With autocorrelation','location','southeast');