Диверсификация портфелей

Этот пример показывает три метода диверсификации актива в портфеле. Цель диверсификации актива состоит в том, чтобы сбалансировать воздействие портфеля к любому данному активу для того, чтобы уменьшать энергозависимость в течение времени. Учитывая чувствительность минимального портфеля отклонения к оценке ковариационной матрицы, некоторые практики добавили методы диверсификации в выбор портфеля с надеждой на минимизацию мер по риску кроме мер по отклонению, таких как оборот, максимальная просадка, и так далее.

Этот пример представляет эти общие методы диверсификации:

  • Портфель одинаково взвешенного (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 объект состоит в том, что это может получить границу эффективности проблемы портфеля. Граница эффективности вычисляется путем решения серии задач оптимизации для который уровень возврата портфеля, μ0, изменяется, чтобы получить различные точки на границе эффективности. Эти проблемы заданы как

min   xTΣxst.    i=1nxi=1          xTμμ0          x0

Преимущество использования Portfolio объект вычислить границу эффективности состоит в том, что она получена, не имея необходимость вручную формулировать и решать несколько задач оптимизации, показанных выше.

plotFrontier(p);

Figure contains an axes object. The axes object with title E f f i c i e n t blank F r o n t i e r contains an object of type line.

Portfolio объект может также вычислить веса, сопоставленные к минимальному портфелю отклонения, который задан следующей проблемой.

min   xTΣxst.    i=1nxi=1          x0

Минимальные веса отклонения рассматриваются сравнительным тестом, с которым сравнены все веса стратегий диверсификации.

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. Выполнимый набор представлен какX:

X={x|x0,i=1nxi=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 объект. Однако минимальные веса отклонения могут также быть получены со следующей частью кода, который представляет минимальную проблему отклонения:

minxX   xTΣx

% 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 объект перемасштабирует проблему по умолчанию, чтобы решить числовые вопросы, таким образом, это получает портфель с меньшим отклонением, чем то, полученное, не масштабируя проблему.

Поскольку цель примера состоит в том, чтобы показать различные стратегии диверсификации, этот пример доходы, не перемасштабируя задачи оптимизации. Однако имейте в виду что термин отклонения (xTΣx) может быть перемасштабирован в любой из следующих проблем.

Портфель Одинаково взвешенного (EW)

Одной из мер по диверсификации является Херфиндаль-Хиршман (HH) индекс, заданный как:

HH(x)=i=1nxi2

Этот индекс минимизирован, когда портфель одинаково взвешивается. Портфели, полученные из использования этого индекса как штраф, имеют веса, которые удовлетворяют ограничениям портфеля и которые более равномерно взвешиваются.

Портфель, который минимизирует индекс HH, minxX   xTx. Начиная с ограничений в X ограничения по умолчанию, решение этой проблемы является портфелем EW. Если X имел дополнительные ограничения, решение будет портфелем, который удовлетворяет всем ограничениям и в то же время сохраняет веса максимально равными.

% 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, minxX   xTΣx+λHHxTx.

% 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)

Figure contains 3 axes objects. Axes object 1 with title Min Variance contains an object of type bar. Axes object 2 with title Mixed Strategy contains an object of type bar. Axes object 3 with title Max Diversity contains an object of type bar.

Этот график показывает, как оштрафованная стратегия возвращает веса, которые являются между минимальным портфелем отклонения и портфелем EW. На самом деле, выбор λHH=0 возвращает минимальное решение для отклонения, и как λHH, решение приближается к портфелю EW.

Самый разнообразный портфель (MDP)

Индекс диверсификации, сопоставленный к самому разнообразному портфелю (MDP), задан как

MDP(x)=-i=1nσixi

где σi представляет стандартное отклонение актива i.

MDP является портфелем, который максимизирует отношение диверсификации:

φ(x)=xTσxTΣx

Отношение диверсификации φ(x) равно 1 если портфель полностью инвестируют в один актив или если все активы отлично коррелируются. Для всех других случаев, φ(x)>1. Если φ(x)1, нет никакой диверсификации, таким образом, цель состоит в том, чтобы найти portolio, который максимизирует φ(x):

maxxX   σTxxTΣx

Вместо того, чтобы решить нелинейную, невыпуклую задачу оптимизации выше, проблема переписана как эквивалентная выпуклая квадратичная проблема. Переформулировка следует, та же идея раньше максимизировала отношение Шарпа (Cornuejols & Tütüncü [3]). Эквивалентная квадратичная проблема приводит к следующему:

miny0,τ0yTΣys.t     σTy=1               i=1nyi=τ

где отрицание индекса MDP появляется как ограничение к проблеме. Здесь, весами MDP дают yτ.

В отличие от индекса 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>0 таким образом то, что проблемой MDP и проблемой с ее оштрафованной версией является equivalent.The портфель, который минимизирует отклонение со штрафом MDP,minxX   xTΣx-λMDPσTx.

Задайте параметр штрафа 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)

Figure contains 3 axes objects. Axes object 1 with title Min Variance contains an object of type bar. Axes object 2 with title Mixed Strategy contains an object of type bar. Axes object 3 with title Max Diversity contains an object of type bar.

В этом графике оштрафованные веса стратегии между минимальным портфелем отклонения и MDP. Этот результат эквивалентен со штрафом HH где выбор λMDP=0 возвращает минимальное решение для отклонения и значения λMDP[0,λˆMDP] возвратите веса актива, которые лежат в диапазоне от минимального поведения отклонения до поведения MDP.

Портфель Равного вклада риска (ERC)

Индекс диверсификации, сопоставленный с портфелем равного вклада риска (ERC), задан как

ERC(x)=-i=1nln(xi)

Этот индекс связан с выпуклой переформулировкой, показанной Майяром [1], который используется для расчета портфель ERC. Авторы показывают, что портфель ERC может быть получен путем решения следующей задачи оптимизации

miny0yTΣyst.  i=1nln(xi)c

и определение x, портфель ERC с ограничениями по умолчанию, как x=yiyi, где c>0 может быть любая константа.

Цель портфеля 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, minxX   xTΣx-λERCi=1nln(xi).

Подобно случаю для оштрафованной формулировки MDP, там существует a λˆERC таким образом, что проблема 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)

Figure contains 3 axes objects. Axes object 1 with title Min Variance contains an object of type bar. Axes object 2 with title Mixed Strategy contains an object of type bar. Axes object 3 with title Max Diversity contains an object of type bar.

Сопоставимый с двумя мерами по диверсификации выше, здесь оштрафованные веса стратегии между минимальным портфелем отклонения и портфелем ERC. Выбор λERC=0 возвращает минимальное решение для отклонения и значения λERC[0,λˆ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')

Figure contains an axes object. The axes object with title Weights Distribution contains an object of type boxchart.

Этот 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')

Figure contains an axes object. The axes object with title Percent Contributions to Portfolio Risk contains an object of type boxchart.

Этот boxchart показывает вклад риска процента каждого актива к общему портфельному риску. Вклад риска процента вычисляется как

(PRC)i=xi(Σx)ixTΣx

Как ожидалось все активы портфеля 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')

Figure contains an axes object. The axes object with title Correlation of Invdividual Assets to Their Portfolio contains an object of type boxchart.

Этот boxchart показывает распределение корреляций каждого актива с его соответствующим портфелем. Корреляция актива i к его портфелю вычисляется со следующей формулой:

ρiP=(Σx)iσixTΣx

MDP является портфелем, корреляции которого ближе вместе, и это сопровождается стратегией, которая использует термин штрафа MDP. На самом деле, если бы проблема портфеля позволила отрицательные веса, то все активы MDP имели бы ту же корреляцию к ее портфелю. Кроме того, и HH (EW) и портфели ERC имеют почти ту же изменчивость корреляции.

Ссылки

  1. Майяр, S., Ронкалли, T. & Teïletche, J. "Свойства Одинаково Взвешенных Портфелей Вклада Риска". Журнал Управления портфелем, 36 (4), 2010, стр 60-70.

  2. Ричард, J. C., & Ронкалли, T. "Умная Бета: Диверсификация Управления Минимальных Портфелей Отклонения". Основанное на риске и Факторное Инвестирование. Elsevier, 2015, стр 31-63.

  3. 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

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

| | | | | | | | |

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

Больше о

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