exponenta event banner

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

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

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

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

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

A=wX+1-w2ϵ

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

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

Corr (A, X) = Cov (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 Average (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

Этот подход делает естественным изучение допущения распределения переменных. 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, ∀s≠t:

cov (Xs, Xt) = 0

cov (ϵs,ϵt) = 0

cov (As, At) = 0

Пусть совокупная годовая (log) доходность для каждой серии будет

X‾=∑t=1TXt

A‾=∑t=1TAt

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

Пусть startX2 = var (Xt) и startA2 = var (At) - суточные дисперсии, которые оцениваются по данным суточного возврата.

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

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

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

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

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

var (X ) = var (∑t=1TXt) = TstartX2

var (A ) = var (∑t=1TAt) = TstartA2

cov (X , A ) =cov[∑t=1TXt,∑t=1T (α+βXt+ϵt)] = βcov (X , X ) = βvar (X ‾) = βTstartx2

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

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

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

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

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

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

var (X ) = [

Так как start1 = start2 = startX, то:

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

Рассмотрим Т = 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)

В общем случае для дисперсии совокупного Т-дневного возврата с автокорреляцией от завершающих 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 ) = β2startX2 (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 ) = βstartX, AT/2 + (T-1) Δ1X + (T-2) Δ2X +... + (T-k) ΔkXT/2 + (T-1) Δ1A + (T-2) Δ2A +... + (T-k) ΔkA

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

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');

См. также

| | | | |

Связанные примеры

Подробнее