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

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

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

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

Поскольку корпоративные значения по умолчанию редки, обычно при калибровке моделей по умолчанию используется прокси для кредитоспособности. Однофакторная копула моделирует кредитоспособность компании, используя латентную переменную 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 является корреляцией между запасом и индексом.

Подготовка данных

Используйте возвраты Dow Jones Industrial Среднего значения (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-квадрат) линейной регрессии.

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-квадратичного значения.

Для калибровки однофакторной модели полезной альтернативой является подбор линейной регрессии с использованием стандартизированных данных о запасах и рыночного возврата A и X«. Стандартизация» здесь означает вычесть среднее и разделить на стандартное отклонение. Модель является A=α+βX+ϵ. Однако, потому что оба A и X имеют нулевое среднее значение, точку пересечения α всегда равен нулю, и потому что оба A и X иметь стандартное отклонение 1, стандартное отклонение термина ошибки удовлетворяет std(ϵ)=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

Этот подход делает естественным исследование распределительных допущений переменных. The 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');

См. также

| | | | |

Похожие примеры

Подробнее о