Этот пример показывает два подхода для использования факторной модели, чтобы оптимизировать распределение активов под средой среднего отклонения. Мультифакторные модели часто используются в моделировании риска, управлении портфелем и приписывании производительности портфеля. Мультифакторная модель уменьшает размерность инвестиционной вселенной и ответственна за описание большей части случайности рынка [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-фактора возвращается, , где k <<p. В среде среднего отклонения портфельный риск
, с ,
где:
портфель, возвращаются (скаляр).
актив, возвращаются.
среднее значение актива, возвращаются.
факторная нагрузка, с размерностями p-by-k.
факторный возврат.
особенный возврат, связанный с каждым активом.
вес актива.
факторный вес.
ковариация фактора, возвращается.
отклонение особенных возвратов.
Параметры , , , p-by-1
вектор-столбцы, и k-by-1
вектор-столбцы, p-by-p матрица, k-by-k матрица, и p-by-p диагональная матрица.
Поэтому задача оптимизации среднего отклонения формулируется как
, ,.
В 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-фактора, возвращается следующим .
Восстановите общие 1 200 наблюдений для набора обучающих данных.
reconReturn = factorRetn*factorLoading' + mu; unexplainedRetn = stockReturns{training,:} - reconReturn;
Существует необъясненный актив, возвращается потому что остающиеся (p - k) основные компоненты пропущены. Можно приписать необъясненный актив, возвращается к специфичным для актива рискам, представленным как D.
unexplainedCovar = diag(cov(unexplainedRetn)); D = diag(unexplainedCovar);
Можно использовать основанную на проблеме среду определения от Optimization Toolbox™, чтобы создать переменные, цель и ограничения для проблемы: , ,. Основанная на проблеме среда определения позволяет вам задать переменные и выразить цель и ограничения символически. Можно добавить другие ограничения или использовать различную цель на основе определенной проблемы. Для получения дополнительной информации смотрите, Сначала Выбирают 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
класс. Вспомните, что портфельный риск , таким образом, можно получить ковариацию актива, возвращается .
Используйте estimateFrontierByRisk
в Portfolio
класс, чтобы решить задачу оптимизации: ,. 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
класс, чтобы запустить оптимизацию портфеля с различными встроенными ограничениями.
Меуччи, A. "Моделируя рынок". Риск и распределение активов. Berlin:Springer, 2009.