В этом примере показаны два подхода к использованию факторной модели для оптимизации распределения активов в рамках структуры средних отклонений. Многофакторные модели часто используются в моделировании рисков, управлении портфелем и атрибуции эффективности портфеля. Многофакторная модель уменьшает масштабы инвестиционной вселенной и отвечает за описание большей части случайности рынка [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');
Для коэффициентов можно использовать статистические коэффициенты, извлеченные из ряда возврата основного средства. В этом примере для извлечения статистических факторов используется анализ основных компонентов (PCA) [1]. Затем эту факторную модель можно использовать для решения задачи оптимизации портфеля.
В факторной модели p-доходность актива может быть выражена как линейная комбинация k-доходности коэффициента, + δ a, где k < < p. В системе средних отклонений портфельный риск
wa=wfT Σf wf+waT D wa wf=FTwa,
где:
- возврат портфеля (скаляр).
- возврат основных средств.
- среднее значение доходности основных средств.
- факторная нагрузка с размерами p-by-k.
- коэффициент возврата.
- это идиосинкратический возврат, связанный с каждым активом.
- вес основных средств.
- вес фактора.
- ковариация возвращаемых множителей.
- дисперсия идиосинкратических возвращений.
Параметры , , , являются p-by-1 векторы столбцов, rfand являются k-by-1 векторы-столбцы, является p-by-p матрицей, - k-by-k матрицей, а - p-by-p диагональной матрицей.
Поэтому задача оптимизации средней дисперсии формулируется как
FTwa , wa≤trisk,0≤w≤1 = 1.
В p-мерном пространстве, образованном p-доходами активов, PCA находит наиболее важные k-направления, которые фиксируют наиболее важные вариации в данных доходах p-активов. Обычно k меньше p. Поэтому, используя PCA, можно разложить p доходность актива на k факторов, что значительно уменьшает размерность задачи. K основных направлений интерпретируются как факторные нагрузки, а оценки из разложения интерпретируются как факторные возвраты. Дополнительные сведения см. в разделе pca (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-by-k factorLoading, каждый столбец является основным компонентом. Вектор возврата актива на каждом шаге времени разлагается на эти k размерных пространств, где k < < p. factorRetn является измерением trainingNum by-k.
Оценка ковариационной матрицы коэффициента с возвращениями коэффициента.
covarFactor = cov(factorRetn);
Можно реконструировать p доходности актива для каждого наблюдения, используя каждую k доходность коэффициента, следуя за
Выполните реконструкцию всего 1200 наблюдений для обучающего набора.
reconReturn = factorRetn*factorLoading' + mu;
unexplainedRetn = stockReturns{training,:} - reconReturn;Есть необъяснимые возвраты (a) активов, потому что оставшиеся (p-k) основные компоненты отбрасываются. Необъяснимые возвраты основных средств можно отнести к специфическим для основных средств рискам, представленным как D.
unexplainedCovar = diag(cov(unexplainedRetn)); D = diag(unexplainedCovar);
Для построения переменных, цели и ограничений для задачи можно использовать основанную на задачах структуру определений из 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 класс. Напомним, что портфельный риск - F, ffFT + D) wa, так что можно получить ковариацию актива
Использовать estimateFrontierByRisk в Portfolio класс для решения задачи оптимизации: wa≤trisk,0≤wa≤1. 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]. Можно определить пользовательские ограничения для весов факторов или активов с высокой гибкостью, используя структуру определения на основе проблем из Toolbox™ Оптимизация. Кроме того, можно работать непосредственно с Portfolio для выполнения оптимизации портфеля с различными встроенными ограничениями.
Меуччи, А. «Моделирование рынка». Распределение рисков и основных средств. Берлин: Спрингер, 2009.
addGroups | estimateAssetMoments | estimateBounds | estimateFrontierByRisk | estimateFrontierLimits | estimatePortRisk | plotFrontier | Portfolio | setAssetMoments | setBounds