Этот пример демонстрирует методы для калибровки однофакторной модели для оценки потерь портфельного кредита с помощью creditDefaultCopula
или creditMigrationCopula
классы.
Этот пример использует данные возврата капитала в качестве прокси для колебаний кредита. С данными о капитале чувствительность к одному фактору оценивается как корреляция между акцией и индексом. Набор данных содержит ежедневные данные о возврате для ряда акций, но однофакторная модель требует калибровки на базис года за годом. Принимая, что автокорреляция отсутствует, ежедневная перекрестная корреляция между акциями и рыночным индексом равна ежегодной перекрестной корреляции. Для запасов, проявляющих автокорреляцию, этот пример показывает, как вычислить подразумеваемые ежегодные корреляции, включающие эффект автокорреляции.
Поскольку корпоративные значения по умолчанию редки, обычно при калибровке моделей по умолчанию используется прокси для кредитоспособности. Однофакторная копула моделирует кредитоспособность компании, используя латентную переменную A:
где X
является системным кредитным фактором, w
- вес, который определяет чувствительность компании к одному фактору, и является идиосинкратическим фактором. w
и имеют среднее значение 0 и отклонение 1 и обычно приняты либо Гауссовыми, либо другими t распределениями.
Вычислите корреляцию между X и A:
Поскольку X и A имеют отклонение 1
по конструкции и не коррелирует с X, затем:
Если вы используете возвраты акций в качестве прокси для 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
Эта линейная регрессия подходит для модели вида , что в целом не соответствует однофакторным спецификациям модели. Для примера, и не имеют нулевого среднего и стандартного отклонения 1. В целом, нет связи между коэффициентом и стандартное отклонение термина ошибки . Линейная регрессия используется выше только как инструмент, чтобы получить коэффициент корреляции между переменными, заданными квадратным корнем из R-квадратичного значения.
Для калибровки однофакторной модели полезной альтернативой является подбор линейной регрессии с использованием стандартизированных данных о запасах и рыночного возврата и «. Стандартизация» здесь означает вычесть среднее и разделить на стандартное отклонение. Модель является . Однако, потому что оба и имеют нулевое среднее значение, точку пересечения всегда равен нулю, и потому что оба и иметь стандартное отклонение 1, стандартное отклонение термина ошибки удовлетворяет . Это в точности соответствует спецификациям коэффициентов однофакторной модели. Однофакторный параметр устанавливается в коэффициент , и является таким же, как значение, найденное непосредственно через корреляцию ранее.
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. При этом предположении ежегодная перекрестная корреляция в точности равна ежедневной перекрестной корреляции.
Давайте быть ежедневным логарифмическим возвратом рыночного индекса в день t и быть ежедневным возвратом коррелированного актива. Используя CAPM, отношение моделируется как:
Однофакторная модель является частным случаем этой зависимости.
При условии, что возвраты активов и индексов не коррелируется с их соответствующим прошлым, тогда:
y,
Пусть совокупный годовой (логарифмический) возврат для каждой серии будет
где T может быть 252
в зависимости от базовых ежедневных данных.
Давайте и - дневные отклонения, которые оцениваются из данных ежедневного возврата.
Ежедневная ковариация между и является:
Ежедневная корреляция между и является:
Рассмотрим отклонения и ковариации для совокупного года возвратов. При условии отсутствия автокорреляции:
Годовая корреляция между активом и индексом:
При условии отсутствия автокорреляции заметьте, что ежедневная перекрестная корреляция на самом деле равна ежегодной перекрестной корреляции. Можно использовать это предположение непосредственно в однофакторной модели путем установки однофакторных весов к ежедневной перекрестной корреляции.
Если предположение, что активы не имеют автокорреляции, ослаблено, то преобразование от ежедневной к ежегодной перекрестной корреляции между активами не так однозначно. теперь есть дополнительные условия.
Сначала рассмотрим самый простой случай вычисления отклонения когда T равно 2
.
С тех пор , затем:
Рассмотрим T = 3
. Укажите корреляцию между ежедневными возвратами, которые дни разнесенные как .
В общем случае для отклонения совокупного T-дневного возврата с автокорреляцией от конечных k-дней существует:
Это также та же формула отклонения основного средства:
Ковариация между и как показано ранее, это равно .
Поэтому перекрестная корреляция между индексом и активом с автокорреляцией из конечного 1
через k дней это:
Обратите внимание, что - вес при условии отсутствия автокорреляции. Квадратный корневой термин обеспечивает корректировку для учета автокорреляции в ряду. Корректировка больше зависит от различия между автокорреляцией индекса и автокорреляцией штока, чем от величин этих автокорреляций. Таким образом, годовой однофакторный вес с поправкой на автокорреляцию:
Проверьте автокорреляцию в каждом из запасов с возвратом за предыдущий день и скорректируйте веса, чтобы включить эффект однодневной автокорреляции.
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