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

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

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

Оптимизируйте распределение активов непосредственно против факторов с основанной на проблеме средой определения

Для факторов можно использовать статистические факторы, извлеченные из актива, возвращают ряд. В этом примере вы используете анализ главных компонентов (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.

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. 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 object. The axes object with title Portfolio Equity Curve contains an object of type line.

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

Ссылка

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

Смотрите также

| | | | | | | | |

Связанные примеры

Больше о

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