Оптимизация портфеля с использованием факторных моделей

В этом примере показаны два подхода к использованию факторной модели для оптимизации распределения активов в среде средних отклонений. Многофакторные модели часто используются в моделировании рисков, управлении портфелем и атрибуции эффективности портфеля. Многофакторная модель уменьшает размерность инвестиционной вселенной и отвечает за описание большей части случайности рынка [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');

Figure contains an axes. The axes with title Equity Curve contains 5 objects of type line. These objects represent Asset1, Asset2, Asset3, Asset4, Asset5.

Оптимизация распределения активов непосредственно по факторам с помощью основанной на проблеме среды определения

Для коэффициентов можно использовать статистические коэффициенты, извлеченные из ряда возврата основных средств. В этом примере для извлечения статистических факторов [1] используется анализ основных компонентов (PCA). Затем можно использовать эту модель фактора, чтобы решить задачу оптимизации портфеля.

С помощью модели фактора p возврат активов может быть выражен как линейная комбинация k-факторных возвратов, ra=μa+Frf+εa, где k < < p. В среде средних дисперсий портфельный риск

Var(Rp)=Var(raTwa)=Var((μa+Frf+εa)Twa)=waT(FΣfFT+D)wa=wfTΣfwf+waTDwa, с wf=FTwa,

где:

Rp - возврат портфеля (скаляр).

ra - возврат активов.

μa - среднее значение возврата активов.

F - коэффициент загрузки с размерностями p-на-k.

rf - коэффициент возврата.

εa - идиосинкратический возврат, относящийся к каждому активу.

wa - вес актива.

wf - вес фактора.

Σf - ковариация факторных возвратов.

D - отклонение идиосинкратических возвратов.

Параметры ra, wa, μa, εaявляются p-by- 1 Векторы-столбцы, rfи wf являются k-by- 1 Векторы-столбцы, Σa - матрица p-на-p, Σk является k-на-k матрицей, и D является p-на-p диагонали матрицей.

Поэтому задача оптимизации средних дисперсий сформулирована как

maxμaTwa,s.t. FTwa=wf, wfTΣfwf+waTDwatrisk,0w1,eTwa=1.

В размерном пространстве 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-факторные возвраты путем следующего ra=μa+Frf+εa.

Восстановите общие 1200 наблюдений за набором обучающих данных.

reconReturn = factorRetn*factorLoading' + mu;
unexplainedRetn = stockReturns{training,:} - reconReturn;

Существуют необъяснимые возвраты активов εa поскольку оставшиеся (p-k) основные компоненты отбрасываются. Необъяснимые возвраты основных средств можно приписать специфическим для основных средств рискам, представленным как D.

unexplainedCovar = diag(cov(unexplainedRetn));
D = diag(unexplainedCovar);

Можно использовать основанную на проблеме среду определения из Optimization Toolbox™, чтобы создать переменные, цель и ограничения для задачи: maxμaTwa,s.t. FTwa=wf, wfTΣfwf+waTDwatrisk,eTwa=1,0w1. Основанная на проблеме среда определения позволяет вам задавать переменные и выражать цель и ограничения символически. Можно добавить другие ограничения или использовать другую цель, основанную на вашей конкретной задаче. Для получения дополнительной информации смотрите Первый выбор Основанный на проблеме или Основанный на решателе подход.

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 класс. Напомним, портфельный риск Var(Rp)=Var((μa+Frf+εa)Twa)=waT(FΣfFT+D)wa , так что вы можете получить ковариацию возвратов активов Σa=FΣfFT+D.

Использование estimateFrontierByRisk в Portfolio класс для решения задачи оптимизации: maxμaTwa,s.t. waTΣawatrisk,0wa1,eTwa=1. 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');

Figure contains an axes. The axes with title Portfolio Equity Curve contains an object of type line.

Этот пример демонстрирует, как вывести статистические факторы из возвратов активов с помощью PCA, а затем использовать эти факторы для оптимизации портфеля на основе факторов. Этот пример также показывает, как использовать эти статистические факторы с Portfolio класс. На практике можно адаптировать этот пример, чтобы включить некоторые измеримые рыночные факторы, такие как промышленные факторы или возвраты ETF из различных секторов, чтобы описать случайность на рынке [1]. Вы можете задать пользовательские ограничения на веса факторов или активов с высокой гибкостью, используя основанную на проблеме среду определения из Optimization Toolbox™. Также можно работать непосредственно со Portfolio класс, чтобы запустить оптимизацию портфеля с различными встроенными ограничениями.

Ссылка

  1. Меуччи, А. «Моделирование рынка». Риск и распределение активов. Берлин: Спрингер, 2009.

См. также

| | | | | | | | |

Похожие примеры

Подробнее о

Внешние веб-сайты