В этом примере показаны два подхода к использованию факторной модели для оптимизации распределения активов в среде средних отклонений. Многофакторные модели часто используются в моделировании рисков, управлении портфелем и атрибуции эффективности портфеля. Многофакторная модель уменьшает размерность инвестиционной вселенной и отвечает за описание большей части случайности рынка [1]. Факторы могут быть статистическими, макроэкономическими и фундаментальными. В первом подходе в этом примере вы создаете статистические факторы из возвратов основных средств и оптимизируете распределение непосредственно с факторами. Во втором подходе вы используете данную информацию о факторе для вычисления ковариационной матрицы возвратов активов и затем используете Portfolio
Класс для оптимизации распределения активов.
Загрузите моделируемый набор данных, который включает в себя общую сумму возвратов активов p = 100 активов и ежедневные наблюдения 2000.
clear;
load('asset_return_100_simulated.mat');
[nObservation, p] = size(stockReturns)
nObservation = 2000
p = 100
splitPoint = ceil(nObservation*0.6); training = 1:splitPoint; test = splitPoint+1:nObservation; trainingNum = numel(training);
Визуализируйте кривую собственного капитала для каждого запаса. В данном примере постройте график первых пяти запасов.
plot(ret2tick(stockReturns{training,1:5}, 'method', 'simple')*100); hold off; xlabel('Timestep'); ylabel('Value'); title('Equity Curve'); legend(stockReturns.Properties.VariableNames(1:5), 'Location',"bestoutside",'Interpreter', 'none');
Для коэффициентов можно использовать статистические коэффициенты, извлеченные из ряда возврата основных средств. В этом примере для извлечения статистических факторов [1] используется анализ основных компонентов (PCA). Затем можно использовать эту модель фактора, чтобы решить задачу оптимизации портфеля.
С помощью модели фактора p возврат активов может быть выражен как линейная комбинация k-факторных возвратов, , где k < < p. В среде средних дисперсий портфельный риск
, с ,
где:
- возврат портфеля (скаляр).
- возврат активов.
- среднее значение возврата активов.
- коэффициент загрузки с размерностями p-на-k.
- коэффициент возврата.
- идиосинкратический возврат, относящийся к каждому активу.
- вес актива.
- вес фактора.
- ковариация факторных возвратов.
- отклонение идиосинкратических возвратов.
Параметры , , , являются p-by- 1
Векторы-столбцы, и являются k-by- 1
Векторы-столбцы, - матрица p-на-p, является k-на-k матрицей, и является p-на-p диагонали матрицей.
Поэтому задача оптимизации средних дисперсий сформулирована как
, ,.
В размерном пространстве p, образованном p возвратами активов, PCA находит наиболее важные направления k, которые захватывают наиболее важные изменения в заданных возвратах p активов. Обычно k меньше, чем p. Поэтому при помощи PCA можно разложить возвраты активов на k факторов, что значительно уменьшает размерность задачи. Направления k принципа интерпретируются как загрузки, а счета от разложения интерпретируются как возвраты фактора. Для получения дополнительной информации смотрите pca
(Statistics and Machine Learning Toolbox™). В этом примере используйте k = 10
как количество основных компонентов. Кроме того, можно также найти значение k путем определения порога для общего отклонения, представленной как верхние k главных компонентов. Обычно 95% является приемлемым порогом.
k = 10;
[factorLoading,factorRetn,latent,tsq,explained,mu] = pca(stockReturns{training,:}, 'NumComponents', k);
disp(size(factorLoading))
100 10
disp(size(factorRetn))
1200 10
В выход p-на-k factorLoading
каждый столбец является основным компонентом. Вектор возврата активов в каждом временном шаге разлагается до этих k размерных пространств, где k < < p. Выходные factorRetn
является размерностью trainingNum-by-k.
Оцените ковариационную матрицу фактора с возвратами фактора.
covarFactor = cov(factorRetn);
Вы можете восстановить возвраты p активов для каждого наблюдения, используя каждые k-факторные возвраты путем следующего .
Восстановите общие 1200 наблюдений за набором обучающих данных.
reconReturn = factorRetn*factorLoading' + mu; unexplainedRetn = stockReturns{training,:} - reconReturn;
Существуют необъяснимые возвраты активов поскольку оставшиеся (p-k) основные компоненты отбрасываются. Необъяснимые возвраты основных средств можно приписать специфическим для основных средств рискам, представленным как D.
unexplainedCovar = diag(cov(unexplainedRetn)); D = diag(unexplainedCovar);
Можно использовать основанную на проблеме среду определения из Optimization Toolbox™, чтобы создать переменные, цель и ограничения для задачи: , ,. Основанная на проблеме среда определения позволяет вам задавать переменные и выражать цель и ограничения символически. Можно добавить другие ограничения или использовать другую цель, основанную на вашей конкретной задаче. Для получения дополнительной информации смотрите Первый выбор Основанный на проблеме или Основанный на решателе подход.
targetRisk = 0.007; % Standard deviation of portfolio return tRisk = targetRisk*targetRisk; % Variance of portfolio return meanStockRetn = mean(stockReturns{training,:}); optimProb = optimproblem('Description','Portfolio with factor covariance matrix','ObjectiveSense','max'); wgtAsset = optimvar('asset_weight', p, 1, 'Type', 'continuous', 'LowerBound', 0, 'UpperBound', 1); wgtFactor = optimvar('factor_weight', k, 1, 'Type', 'continuous'); optimProb.Objective = sum(meanStockRetn'.*wgtAsset); optimProb.Constraints.asset_factor_weight = factorLoading'*wgtAsset - wgtFactor == 0; optimProb.Constraints.risk = wgtFactor'*covarFactor*wgtFactor + wgtAsset'*D*wgtAsset <= tRisk; optimProb.Constraints.budget = sum(wgtAsset) == 1; x0.asset_weight = ones(p, 1)/p; x0.factor_weight = zeros(k, 1); opt = optimoptions("fmincon", "Algorithm","sqp", "Display", "off", ... 'ConstraintTolerance', 1.0e-8, 'OptimalityTolerance', 1.0e-8, 'StepTolerance', 1.0e-8); x = solve(optimProb,x0, "Options",opt); assetWgt1 = x.asset_weight;
В этом примере вы максимизируете возврат портфеля для целевого риска. Это нелинейная задача программирования с квадратичным ограничением, и вы используете fmincon
чтобы решить эту проблему.
Проверяйте распределение активов более 5%, чтобы определить, какие активы имеют большие инвестиционные веса.
percentage = 0.05; AssetName = stockReturns.Properties.VariableNames(assetWgt1>=percentage)'; Weight = assetWgt1(assetWgt1>=percentage); T1 = table(AssetName, Weight)
T1=7×2 table
AssetName Weight
___________ ________
{'Asset9' } 0.080054
{'Asset32'} 0.22355
{'Asset47'} 0.11369
{'Asset57'} 0.088321
{'Asset61'} 0.068845
{'Asset75'} 0.063648
{'Asset94'} 0.22163
Portfolio
Класс с информацией о фактореЕсли у вас уже есть загрузка фактора и ковариационная матрица фактора от некоторого другого анализа или стороннего провайдера, можно использовать эту информацию для вычисления ковариационной матрицы актива и затем непосредственно запустить оптимизацию средних дисперсий с помощью Portfolio
класс. Напомним, портфельный риск , так что вы можете получить ковариацию возвратов активов .
Использование estimateFrontierByRisk
в Portfolio
класс для решения задачи оптимизации: ,. The Portfolio
Поддержки классов имеют множество встроенных ограничений, которые можно использовать, чтобы описать задачу портфеля и оценить риск и возвраты на эффективной границе. Для получения дополнительной информации смотрите Набор портфеля для оптимизации с использованием объекта портфеля.
covarAsset = factorLoading*covarFactor*factorLoading'+D; port = Portfolio("AssetMean", meanStockRetn, 'AssetCovar', covarAsset, 'LowerBound', 0, 'UpperBound', 1, ... 'Budget', 1); assetWgt2 = estimateFrontierByRisk(port, targetRisk); AssetName = stockReturns.Properties.VariableNames(assetWgt2>=percentage)'; Weight = assetWgt2(assetWgt2>=percentage); T2 = table(AssetName, Weight)
T2=7×2 table
AssetName Weight
___________ ________
{'Asset9' } 0.080061
{'Asset32'} 0.22355
{'Asset47'} 0.11369
{'Asset57'} 0.088314
{'Asset61'} 0.068847
{'Asset75'} 0.063644
{'Asset94'} 0.22163
Таблицы T1
и T2
показать идентичное распределение для распределений основных средств, которые превышают 5%. Поэтому в этом примере оба подхода к оптимизации портфеля с факторной моделью получают веса активов, которые идентичны.
Визуализация эффективности оптимизированного распределения за период проверки.
retn = stockReturns{test, :}*assetWgt1; plot(ret2tick(retn, 'method', 'simple')*100); hold off; xlabel('Timestep'); ylabel('Value'); title('Portfolio Equity Curve');
Этот пример демонстрирует, как вывести статистические факторы из возвратов активов с помощью PCA, а затем использовать эти факторы для оптимизации портфеля на основе факторов. Этот пример также показывает, как использовать эти статистические факторы с Portfolio
класс. На практике можно адаптировать этот пример, чтобы включить некоторые измеримые рыночные факторы, такие как промышленные факторы или возвраты ETF из различных секторов, чтобы описать случайность на рынке [1]. Вы можете задать пользовательские ограничения на веса факторов или активов с высокой гибкостью, используя основанную на проблеме среду определения из Optimization Toolbox™. Также можно работать непосредственно со Portfolio
класс, чтобы запустить оптимизацию портфеля с различными встроенными ограничениями.
Меуччи, А. «Моделирование рынка». Риск и распределение активов. Берлин: Спрингер, 2009.
addGroups
| estimateAssetMoments
| estimateBounds
| estimateFrontierByRisk
| estimateFrontierLimits
| estimatePortRisk
| plotFrontier
| Portfolio
| setAssetMoments
| setBounds