Этот пример демонстрирует методы калибровки однофакторной модели для оценки кредитных потерь портфеля с использованием creditDefaultCopula или creditMigrationCopula классы.
В этом примере данные возврата капитала используются в качестве прокси для колебаний кредита. С помощью данных об акционерном капитале чувствительность к одному фактору оценивается как корреляция между акциями и индексом. Набор данных содержит данные суточной доходности для ряда акций, но однофакторная модель требует калибровки на годичной основе. Если предположить, что автокорреляция отсутствует, то ежедневная взаимная корреляция между акциями и индексом рынка равна годовой взаимной корреляции. Для запасов, демонстрирующих автокорреляцию, этот пример показывает, как вычислять подразумеваемые годовые корреляции, включающие эффект автокорреляции.
Поскольку корпоративные значения по умолчанию встречаются редко, при калибровке моделей по умолчанию обычно используется прокси-сервер для обеспечения кредитоспособности. Однофакторная копула моделирует кредитоспособность компании с использованием скрытой переменной A:
где X является системным кредитным фактором, w - вес, определяющий чувствительность компании к одному фактору, а - идиосинкратический фактор. w и имеют среднее значение 0 и дисперсию 1 и обычно считаются либо гауссовыми, либо другими t распределениями.
Вычислите корреляцию между X и A:
X)
Поскольку X и A имеют дисперсию 1 по конструкции и не коррелируется с 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
Эта линейная регрессия подходит под модель вида X+ϵ, которая в целом не соответствует спецификациям однофакторной модели. Например, A и X не имеют нулевого среднего и стандартного отклонения 1. В целом, отсутствует связь между коэффициентом β и стандартным отклонением члена ошибки ϵ. Линейная регрессия используется выше только как инструмент для получения коэффициента корреляции между переменными, заданными квадратным корнем от значения R-квадрата.
Для калибровки однофакторной модели полезной альтернативой является подгонка линейной регрессии с использованием стандартизированных данных о доходности акций и рынка и . «Стандартизировать» здесь означает вычесть среднее и разделить на стандартное отклонение. Модель . Однако, поскольку и , и имеют нулевое среднее, пересечение всегда равно нулю, и поскольку и , и имеют стандартное отклонение 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. В этом предположении годовая взаимная корреляция точно равна суточной взаимной корреляции.
Пусть - дневная логарифмическая доходность индекса рынка на день t, а - дневная доходность коррелированного актива. С помощью CAPM уравнение моделируется следующим образом:
Однофакторная модель является частным случаем этой взаимосвязи.
Исходя из предположения, что каждый доход от активов и индекса не соотносится с их соответствующим прошлым, тогда:
y,
= 0
= 0
= 0
Пусть совокупная годовая (log) доходность для каждой серии будет
где Т может быть 252 в зависимости от базовых ежедневных данных.
Пусть Xt) var (At) - суточные дисперсии, которые оцениваются по данным суточного возврата.
Ежедневная ковариация между и составляет:
= βstartX2
Ежедневная корреляция между и составляет:
σX2σA2 = β
Рассмотрим отклонения и ковариации для совокупного года возврата. При условии отсутствия автокорреляции:
= TstartX2
= TstartA2
βvar (X ‾) = βTstartx2
Годовая корреляция между активом и индексом составляет:
βTσX2TσX2TσA2 = β
При допущении отсутствия автокорреляции обратите внимание, что ежедневная взаимная корреляция фактически равна годовой взаимной корреляции. Это предположение можно использовать непосредственно в однофакторной модели, установив для однофакторных весов суточную взаимную корреляцию.
Если предположение о том, что активы не имеют автокорреляции, ослабляется, то переход от ежедневной к годовой взаимной корреляции между активами не так прост. Теперь ‾ var (X) имеет дополнительные термины.
Сначала рассмотрим простейший случай вычисления дисперсии ‾, когда T равен 2.
Так как = startX, то:
+ 2α12)
Рассмотрим Т = 3. Укажите корреляцию между суточными доходами, которые отделены друг от друга на k дней, как .
В общем случае для дисперсии совокупного Т-дневного возврата с автокорреляцией от завершающих k дней существует:
. + (T-k) ΔkX)
Это также та же формула для отклонения основного средства:
. + (T-k) ΔkA)
Ковариация между ‾ и ‾, как показано ранее, равна X ‾).
Следовательно, взаимная корреляция между индексом и активом с автокорреляцией от конечного 1 через k дней составляет:
(A ‾) = βvar (X ‾) var (A ‾) =...
(T-2) Δ2A +... + (T-k) Δka
T-2) Δ2A +... + (T-k) ΔkA
Следует отметить, что является весом при условии отсутствия автокорреляции. Член квадратного корня обеспечивает корректировку для учета автокорреляции в серии. Корректировка в большей степени зависит от разницы между автокорреляцией индекса и автокорреляцией запаса, а не от величин этих автокорреляций. Таким образом, годовой однофакторный вес с поправкой на автокорреляцию составляет:
ρΔ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');

confidenceBands | creditDefaultCopula | getScenarios | portfolioRisk | riskContribution | simulate