Этот пример показывает три метода диверсификации актива в портфеле. Цель диверсификации актива состоит в том, чтобы сбалансировать воздействие портфеля к любому данному активу для того, чтобы уменьшать энергозависимость в течение времени. Учитывая чувствительность минимального портфеля отклонения к оценке ковариационной матрицы, некоторые практики добавили методы диверсификации в выбор портфеля с надеждой на минимизацию мер по риску кроме мер по отклонению, таких как оборот, максимальная просадка, и так далее.
Этот пример представляет эти общие методы диверсификации:
Портфель одинаково взвешенного (EW)
Равный вклад риска (ERC)
Самый разнообразный портфель (MDP)
Кроме того, этот пример демонстрирует методы штрафа, которые могут использоваться, чтобы достигнуть различных степеней диверсификации. В тех методах термин штрафа добавляется к целевой функции, чтобы сбалансировать уровень сокращения отклонения и диверсификации портфеля.
Начните путем загрузки и вычисления ожидаемых доходов и их ковариационной матрицы.
% Load data load('port5.mat'); % Store returns and covariance mu = mean_return; Sigma = Correlation .* (stdDev_return * stdDev_return');
Задайте портфель среднего отклонения с помощью Portfolio
объект с ограничениями по умолчанию, чтобы создать полностью инвестированный, длинно-единственный портфель.
% Create a mean-variance Portfolio object with default constraints p = Portfolio('AssetMean',mu,'AssetCovar',Sigma); p = setDefaultConstraints(p);
Одна из многих функций Portfolio
объект состоит в том, что это может получить границу эффективности проблемы портфеля. Граница эффективности вычисляется путем решения серии задач оптимизации для который уровень возврата портфеля, , изменяется, чтобы получить различные точки на границе эффективности. Эти проблемы заданы как
Преимущество использования Portfolio
объект вычислить границу эффективности состоит в том, что она получена, не имея необходимость вручную формулировать и решать несколько задач оптимизации, показанных выше.
plotFrontier(p);
Portfolio
объект может также вычислить веса, сопоставленные к минимальному портфелю отклонения, который задан следующей проблемой.
Минимальные веса отклонения рассматриваются сравнительным тестом, с которым сравнены все веса стратегий диверсификации.
wMinVar = estimateFrontierLimits(p,'min');
Portfolio
объект может вычислить минимальный портфель отклонения. Однако стратегии диверсификации добавляют модификации в целевую функцию проблемы портфеля, которые не поддерживаются Portfolio
объект. Таким образом необходимо использовать Optimization Toolbox™, чтобы решить следующие задачи. Узнать больше о задачах, которые могут быть решены Portfolio
возразите, смотрите, Когда Использовать Объекты Портфеля По Optimization Toolbox.
Этот раздел представляет три методики диверсификации. Каждый из трех методов диверсификации сопоставлен с мерой по диверсификации, и та мера по диверсификации используется, чтобы задать термин штрафа, чтобы достигнуть различных уровней диверсификации. Диверсификация, полученная путем добавления штрафа, называет к целевой функции, диапазонам от поведения достигнутый минимальным портфелем отклонения к поведению EW, ECR и MDP, соответственно.
Запустите путем инициализации optimproblem
возразите и задайте его ограничения. Все следующие проблемы портфеля имеют те же ограничения и только изменения целевой функции. Поэтому следующий optimproblem
может быть снова использован, в то время как целевая функция переопределена соответственно.
% Define an optimization problem to adjust portfolio diversification diverseProb = optimproblem('ObjectiveSense','minimize');
Портфель по умолчанию имеет только одно ограничение равенства и нижнюю границу для весов активов. Веса должны быть неотрицательными, и они должны суммировать к 1
. Выполнимый набор представлен как:
% Variables nX = p.NumAssets; % Porfolio weights [nX-by-1 vector] x = optimvar('x',nX,1,'LowerBound',0); % x >= 0 (long-only portfolio) % Equality constraint % Sum of weights equal to one diverseProb.Constraints.fullyInvested = sum(x) == 1;
Первая часть примера показывает, как вычислить минимальное отклонение porftolio использование Portfolio
объект. Однако минимальные веса отклонения могут также быть получены со следующей частью кода, который представляет минимальную проблему отклонения:
% Minimize variance diverseProb.Objective = x'*p.AssetCovar*x; % Solution of minimum variance portfolio opts = optimoptions('quadprog','Display','none'); % No output display [wMinVar2,fMinVar,c,d,e] = solve(diverseProb,'options',opts);
Решение выше и то получены Portfolio
объект не является точно тем же самым.
norm(wMinVar-wMinVar2.x,inf)
ans = 0.0032
Этот результат происходит, потому что минимальная проблема отклонения плохо масштабируется, учитывая размер собственных значений ковариационной матрицы. Если целевая функция перемасштабируется большой константой (например, 1e4
), затем оба решения совпадают в числовой точности. Эта возможность является другим преимуществом использования Portfolio
объект. Portfolio
объект перемасштабирует проблему по умолчанию, чтобы решить числовые вопросы, таким образом, это получает портфель с меньшим отклонением, чем то, полученное, не масштабируя проблему.
Поскольку цель примера состоит в том, чтобы показать различные стратегии диверсификации, этот пример доходы, не перемасштабируя задачи оптимизации. Однако имейте в виду что термин отклонения () может быть перемасштабирован в любой из следующих проблем.
Одной из мер по диверсификации является Херфиндаль-Хиршман (HH) индекс, заданный как:
Этот индекс минимизирован, когда портфель одинаково взвешивается. Портфели, полученные из использования этого индекса как штраф, имеют веса, которые удовлетворяют ограничениям портфеля и которые более равномерно взвешиваются.
Портфель, который минимизирует индекс HH, . Начиная с ограничений в ограничения по умолчанию, решение этой проблемы является портфелем EW. Если имел дополнительные ограничения, решение будет портфелем, который удовлетворяет всем ограничениям и в то же время сохраняет веса максимально равными.
% Maximize the HH diversification (by minimizing the HH index) diverseProb.Objective = x'*x; % Solution that minimizes the HH index [wHH,fHH] = solve(diverseProb,'options',opts);
Портфель, который минимизирует отклонение со штрафом HH, .
% HH penalty parameter lambdaHH = 1e-2; % Variance + Herfindahl-Hirschman (HH) index diverseProb.Objective = x'*p.AssetCovar*x + lambdaHH*(x'*x); % Solution that accounts for risk and HH diversification [wHHMix,fHHMix] = solve(diverseProb,'options',opts);
Постройте распределение весов для минимального портфеля отклонения, равного портфеля веса и оштрафованной стратегии.
% Plot different strategies
plotAssetAllocationChanges(wMinVar,wHHMix.x,wHH.x)
Этот график показывает, как оштрафованная стратегия возвращает веса, которые являются между минимальным портфелем отклонения и портфелем EW. На самом деле, выбор возвращает минимальное решение для отклонения, и как решение приближается к портфелю EW.
Индекс диверсификации, сопоставленный к самому разнообразному портфелю (MDP), задан как
где представляет стандартное отклонение актива .
MDP является портфелем, который максимизирует отношение диверсификации:
Отношение диверсификации равно 1
если портфель полностью инвестируют в один актив или если все активы отлично коррелируются. Для всех других случаев, . Если , нет никакой диверсификации, таким образом, цель состоит в том, чтобы найти portolio, который максимизирует :
Вместо того, чтобы решить нелинейную, невыпуклую задачу оптимизации выше, проблема переписана как эквивалентная выпуклая квадратичная проблема. Переформулировка следует, та же идея раньше максимизировала отношение Шарпа (Cornuejols & Tütüncü [3]). Эквивалентная квадратичная проблема приводит к следующему:
где отрицание индекса MDP появляется как ограничение к проблеме. Здесь, весами MDP дают .
В отличие от индекса HH, цель MDP не состоит в том, чтобы получить портфель, веса которого равномерно распределяются среди всех активов, но получить портфель, выбранные (ненулевые) активы которого имеют ту же корреляцию к портфелю в целом.
% MDP problem MDPprob = optimproblem('ObjectiveSense','minimize'); % Variables % Surrogate portfolio weights y = optimvar('y',nX,1,'LowerBound',0); % y >= 0 (long-only portfolio) % Auxiliary variable tau = optimvar('tau',1,1,'LowerBound',0); % tau >= 0 % Constraints % Sum of stds equal to one sigma = sqrt(diag(p.AssetCovar)); MDPprob.Constraints.sigmaSumToOne = sigma'*y == 1; % Sum of weights equal to tau MDPprob.Constraints.sumToTau = sum(y) == tau; % Objective % min y'*Sigma*y MDPprob.Objective = y'*p.AssetCovar*y; % Solve for the MDP [wMDP,fMDP] = solve(MDPprob,'options',opts); xMDP = wMDP.y/wMDP.tau;
Следующий код показывает, что там существует значение таким образом то, что проблемой MDP и проблемой с ее оштрафованной версией является equivalent.The портфель, который минимизирует отклонение со штрафом MDP,.
Задайте параметр штрафа MDP и решите для MDP.
% MDP penalty parameter lambdaMDP = 1e-2; % Variance + Most Diversified Portfolio (MDP) diverseProb.Objective = x'*p.AssetCovar*x - lambdaMDP*(sigma'*x); % Solution that accounts for risk and MDP diversification [wMDPMix,fMDPMix] = solve(diverseProb,'options',opts);
Постройте распределение весов для минимального портфеля отклонения, MDP и оштрафованной стратегии.
% Plot different strategies
plotAssetAllocationChanges(wMinVar,wMDPMix.x,xMDP)
В этом графике оштрафованные веса стратегии между минимальным портфелем отклонения и MDP. Этот результат эквивалентен со штрафом HH где выбор возвращает минимальное решение для отклонения и значения возвратите веса актива, которые лежат в диапазоне от минимального поведения отклонения до поведения MDP.
Индекс диверсификации, сопоставленный с портфелем равного вклада риска (ERC), задан как
Этот индекс связан с выпуклой переформулировкой, показанной Майяром [1], который используется для расчета портфель ERC. Авторы показывают, что портфель ERC может быть получен путем решения следующей задачи оптимизации
и определение , портфель ERC с ограничениями по умолчанию, как , где может быть любая константа.
Цель портфеля ERC состоит в том, чтобы выбрать веса активов таким способом, которым вклад риска каждого актива к энергозависимости портфеля является тем же самым для всех активов.
% ERC portfolio ERCprob = optimproblem('ObjectiveSense','minimize'); % Variables % Surrogate portfolio weights y = optimvar('y',nX,1,'LowerBound',0); % y >= 0 (long-only portfolio) % Constraints % Log constraint ERCprob.Constraints.logSumIneq = sum(log(y)) >= 1; % Objective % min y'*Sigma*y ERCprob.Objective = y'*p.AssetCovar*y; % Solve a nonlinear problem for the ERC portfolio opts = optimoptions('fmincon','Display','none'); % No output display w0.y = wMinVar; % Define starting point for fmincon [wERC,fERC] = solve(ERCprob,w0,'options',opts); xERC = wERC.y/sum(wERC.y);
Портфель, который минимизирует отклонение со штрафом ERC, .
Подобно случаю для оштрафованной формулировки MDP, там существует a таким образом, что проблема ERC и ее оштрафованная версия эквивалентны.
% ERC penalty parameter lambdaERC = 3e-6; % lambdaERC is so small because the log of a number % close to zero (the portfolio weights) is large. % Variance + Equal Risk Contribution (ERC) diverseProb.Objective = x'*p.AssetCovar*x - lambdaERC*sum(log(x)); % Solution that accounts for risk and ERC diversification [wERCMix,fERCMix] = solve(diverseProb,wHH,'options',opts);
Постройте распределение весов для минимального портфеля отклонения, ERC и оштрафованной стратегии.
% Plot different strategies
plotAssetAllocationChanges(wMinVar,wERCMix.x,xERC)
Сопоставимый с двумя мерами по диверсификации выше, здесь оштрафованные веса стратегии между минимальным портфелем отклонения и портфелем ERC. Выбор возвращает минимальное решение для отклонения и значения возвратите веса актива, которые лежат в диапазоне от минимального поведения отклонения до поведения портфеля ERC.
Вычислите количество активов, которые выбраны в каждом портфеле. Примите, что актив выбран, если вес, сопоставленный к тому активу, выше определенного порога.
% Build a weights table varNames = {'MinVariance','MixedHH','HH','MixedMDP','MDP', ... 'MixedERC','ERC'}; weightsTable = table(wMinVar,wHHMix.x,wHH.x,wMDPMix.x,xMDP, ... wERCMix.x,xERC,'VariableNames',varNames); % Number of assets with nonzero weights cutOff = 1e-3; % Weights below cut-off point are considered zero. [reweightedTable,TnonZero] = tableWithNonZeroWeights(weightsTable, ... cutOff,varNames); display(TnonZero)
TnonZero=1×7 table
MinVariance MixedHH HH MixedMDP MDP MixedERC ERC
___________ _______ ___ ________ ___ ________ ___
Nonzero weights 11 104 225 23 29 225 225
Как уже отмечалось выше, цель штрафа HH состоит в том, чтобы получить более равномерно взвешенные портфели. Портфель, который максимизирует разнообразие HH (и соответствует портфелю EW, когда только ограничения по умолчанию выбраны) имеет наибольшее число выбранных активов, и веса этих активов ближе вместе. Это последнее качество наблюдается в следующем boxchart
. Кроме того, стратегия, которая добавляет индекс HH как функцию штрафа к цели, имеет большее число активов, чем минимальный портфель отклонения, но меньше, чем портфель, который максимизирует разнообразие HH. Портфель ERC также выбирает все активы, потому что все веса должны быть ненулевыми для того, чтобы иметь некоторый вклад риска.
% Boxchart of portfolio's weights figure; matBoxPlot = reweightedTable.Variables; matBoxPlot(matBoxPlot == 0) = NaN; boxchart(matBoxPlot) xticklabels(varNames) title('Weights Distribution') xlabel('Strategies') ylabel('Weight')
Этот boxchart
показывает распространение положительных весов активов для различных портфелей. Как ранее обсуждено, веса портфеля, которые максимизируют разнообразие HH, являются всеми одинаковыми. Если бы портфель имел другие типы ограничений, веса все не были бы тем же самым, но у них было бы самое низкое отклонение. Веса портфеля ERC также имеют небольшое отклонение. На самом деле можно наблюдать как количество увеличений активов, отклонение весов портфеля ERC становится меньшим.
Изменчивость весов MDP меньше, чем изменчивость минимальных весов отклонения. Однако это не обязательно верно, что веса MDP будут иметь меньше изменчивости, чем минимальные веса отклонения, потому что цель MDP не состоит в том, чтобы получить одинаково взвешенные активы, но распределить корреляцию каждого актива с его портфелем равномерно.
% Compute and plot the risk contribution of each individual % asset to the portfolio riskContribution = portfolioRiskContribution(p.AssetCovar,... weightsTable.Variables); % Remove small contributions riskContribution(riskContribution < 1e-3) = NaN; % Compare percent contribution to portofolio risk boxchart(riskContribution) xticklabels(varNames) title('Percent Contributions to Portfolio Risk') xlabel('Strategies') ylabel('PCRs')
Этот boxchart
показывает вклад риска процента каждого актива к общему портфельному риску. Вклад риска процента вычисляется как
Как ожидалось все активы портфеля ERC имеют тот же вклад риска в портфель. Как обсуждено после графика распределения весов, если бы проблема имела другие типы ограничений, вклад риска портфеля ERC не был бы тем же самым для всех активов, но у них будет самое низкое отклонение. Кроме того, поведение, показанное в этом изображении, похоже на поведение, показанное распределением весов.
% Compute and plot the correlation of each individual asset to its % portfolio corrAsset2Port = correlationInfo(p.AssetCovar,... weightsTable.Variables); % Boxplot of assets to portfolio correlations figure boxchart(corrAsset2Port) xticklabels(varNames) title('Correlation of Invdividual Assets to Their Portfolio') xlabel('Strategies') ylabel('Correlation')
Этот boxchart
показывает распределение корреляций каждого актива с его соответствующим портфелем. Корреляция актива к его портфелю вычисляется со следующей формулой:
MDP является портфелем, корреляции которого ближе вместе, и это сопровождается стратегией, которая использует термин штрафа MDP. На самом деле, если бы проблема портфеля позволила отрицательные веса, то все активы MDP имели бы ту же корреляцию к ее портфелю. Кроме того, и HH (EW) и портфели ERC имеют почти ту же изменчивость корреляции.
Майяр, S., Ронкалли, T. & Teïletche, J. "Свойства Одинаково Взвешенных Портфелей Вклада Риска". Журнал Управления портфелем, 36 (4), 2010, стр 60-70.
Ричард, J. C., & Ронкалли, T. "Умная Бета: Диверсификация Управления Минимальных Портфелей Отклонения". Основанное на риске и Факторное Инвестирование. Elsevier, 2015, стр 31-63.
Tütüncü, R., Пенья, J., Cornuéjols, G. Методы оптимизации в финансах. Соединенное Королевство: Издательство Кембриджского университета, 2018.
function [] = plotAssetAllocationChanges(wMinVar,wMix,wMaxDiv) % Plots the weights' allocation from the strategies shown before figure t = tiledlayout(1,3); nexttile bar(wMinVar') axis([0 225 0 0.203]) title('Min Variance') nexttile bar(wMix') axis([0 225 0 0.203]) title('Mixed Strategy') nexttile bar(wMaxDiv') axis([0 225 0 0.203]) title('Max Diversity') ylabel(t,'Asset Weight') xlabel(t,'Asset Number') end function [weightsTable,TnonZero] = ... tableWithNonZeroWeights(weightsTable,cutOff,varNames) % Creates a table with the number of nonzero weights for each strategy % Select only meaningful weights funSelect = @(x) (x >= cutOff).*x./sum(x(x >= cutOff)); weightsTable = varfun(funSelect,weightsTable); % Number of assets with positive weights funSum = @(x) sum(x > 0); TnonZero = varfun(funSum,weightsTable); TnonZero.Properties.VariableNames = varNames; TnonZero.Properties.RowNames = {'Nonzero weights'}; end function [corrAsset2Port] = correlationInfo(Sigma,portWeights) % Returns a matrix with the correlation of each individual asset to its % portfolio nX = size(portWeights,1); % Number of assets nP = size(portWeights,2); % Number of portfolios auxM = eye(nX); corrAsset2Port = zeros(nX,nP); for j = 1:nP % Portfolio's standard deviation sigmaPortfolio = sqrt(portWeights(:,j)'*Sigma*portWeights(:,j)); for i = 1:nX % Assets's standard deviation sigmaAsset = sqrt(Sigma(i,i)); % Asset to portfolio correlation corrAsset2Port(i,j) = (auxM(:,i)'*Sigma*portWeights(:,j))/... (sigmaAsset*sigmaPortfolio); end end end function [riskContribution] = portfolioRiskContribution(Sigma,... portWeights) % Returns a matrix with the risk contribution of each asset to % the underlying portfolio. nX = size(portWeights,1); % Number of assets nP = size(portWeights,2); % Number of portfolios riskContribution = zeros(nX,nP); for i = 1:nP weights = portWeights(:,i); % Portfolio variance portVar = weights'*Sigma*weights; % Marginal constribution to portfoli risk (MCR) margRiskCont = weights.*(Sigma*weights)/sqrt(portVar); % Percent contribution to portfolio risk riskContribution(:,i) = margRiskCont/sqrt(portVar); end end
Portfolio
| setBounds
| addGroups
| setAssetMoments
| estimateAssetMoments
| estimateBounds
| plotFrontier
| estimateFrontierLimits
| estimateFrontierByRisk
| estimatePortRisk