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

Этот пример показывает два подхода для использования факторной модели, чтобы оптимизировать распределение активов под средой среднего отклонения. Мультифакторные модели часто используются в моделировании риска, управлении портфелем и приписывании производительности портфеля. Мультифакторная модель уменьшает размерность инвестиционной вселенной и ответственна за описание большей части случайности рынка [1]. Факторы могут быть статистическими, макроэкономическими, и основными. В первом подходе в этом примере вы создаете статистические факторы из актива, возвращается, и оптимизируйте выделение непосредственно против факторов. Во втором подходе вы используете данную факторную информацию, чтобы вычислить ковариационную матрицу актива, возвращается, и затем используйте Portfolio класс, чтобы оптимизировать распределение активов.

Загрузка данных

Загрузите симулированный набор данных, который включает актив, возвращает общее количество p = 100 активов и 2 000 ежедневных наблюдений.

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-фактора возвращается, 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-by-k.

rf факторный возврат.

εa особенный возврат, связанный с каждым активом.

wa вес актива.

wf факторный вес.

Σf ковариация фактора, возвращается.

D отклонение особенных возвратов.

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

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

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

В p мерном пространстве, сформированном p активом, возвращается, PCA находит самые важные k направления, которые получают самые важные изменения данных возвратов p активов. Обычно, k меньше p. Поэтому при помощи PCA можно разложиться, p актив возвращается в 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-by-k factorLoading, каждый столбец является основным компонентом. Актив возвращается, вектор в каждый такт анализируется к этим k мерным пространствам, где k <<p. Выход factorRetn trainingNum-by-k размерность.

Оцените, что факторная ковариационная матрица с фактором возвращается.

covarFactor = cov(factorRetn);

Можно восстановить p актив, возвращается для каждого наблюдения с помощью каждого k-фактора, возвращается следующим ra=μa+Frf+εa.

Восстановите общие 1 200 наблюдений для набора обучающих данных.

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. Основанная на проблеме среда определения позволяет вам задать переменные и выразить цель и ограничения символически. Можно добавить другие ограничения или использовать различную цель на основе определенной проблемы. Для получения дополнительной информации смотрите, Сначала Выбирают Problem-Based or Solver-Based Approach (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.080052
    {'Asset32'}     0.22355
    {'Asset47'}     0.11369
    {'Asset57'}    0.088323
    {'Asset61'}    0.068845
    {'Asset75'}     0.06365
    {'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. 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 класс, чтобы запустить оптимизацию портфеля с различными встроенными ограничениями.

Ссылка

  1. Меуччи, A. "Моделируя рынок". Риск и распределение активов. Berlin:Springer, 2009.

Для просмотра документации необходимо авторизоваться на сайте