Этот пример демонстрирует методы, чтобы калибровать одну факторную модель для оценки потерь кредита портфеля с помощью creditDefaultCopula
или creditMigrationCopula
классы.
Эта акция использования в качестве примера возвращает данные как прокси для колебаний кредита. С данными об акции чувствительность к одному фактору оценивается как корреляция между запасом и индексом. Набор данных содержит ежедневные данные о возврате для серии акций, но одна факторная модель требует калибровки на основе года по году. Предположение, что нет никакой автокорреляции, затем ежедневной взаимной корреляции между запасом и индексом рынка, равно ежегодной взаимной корреляции. Для запасов, показывающих автокорреляцию, этот пример показывает, как вычислить подразумеваемые ежегодные корреляции, включающие эффект автокорреляции.
Поскольку корпоративные значения по умолчанию редки, распространено использовать прокси для кредитоспособности при калибровке моделей по умолчанию. Связка с одним фактором моделирует стоимость кредита компании с помощью скрытой переменной, A:
где X
системный фактор кредита, w
вес, который задает чувствительность компании к одному фактору, и особенный фактор. w
и имейте среднее значение 0 и отклонение 1, и обычно принимаются, чтобы быть или Гауссовыми или иначе t распределениями.
Вычислите корреляцию между X и A:
С тех пор X и A имеют отклонение 1
конструкцией и является некоррелированым с X, затем:
Если вы используете запас, возвращается как прокси для 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
Эта линейная регрессия подбирает модель формы , который в целом не совпадает с техническими требованиями с одной факторной моделью. Например, и не имейте нулевого среднего значения и стандартного отклонения 1. В общем случае между коэффициентом нет никакого отношения и стандартное отклонение остаточного члена . Линейная регрессия используется выше только в качестве инструмента, чтобы получить коэффициент корреляции между переменными, данными квадратным корнем из значения R-squared.
Для калибровки с одной факторной моделью полезная альтернатива должна соответствовать линейной регрессии с помощью стандартизированного запаса, и рынок возвращают данные и . "Стандартизируйте" здесь средние значения, чтобы вычесть среднее значение и разделиться на стандартное отклонение. Модель . Однако, потому что оба и имейте нулевое среднее значение, прерывание всегда нуль, и потому что оба и имейте стандартное отклонение 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
Этот подход делает естественным исследовать дистрибутивные предположения о переменных. 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