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

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

Цель этого примера состоит в том, чтобы найти портфели, которые являются effcient в том смысле, что они минимизируют отклонение, максимизируют, возвращаются и максимизируют средний процент женщин на совете директоров. Найти средний процент женщин на плате компании (WoB) для данного портфеля этот пример использует взвешенную сумму процентов WoB для каждого отдельного актива, где веса даны суммой, которую инвестируют в каждый актив для портфеля. Путем определения среднего процента WoB этим путем, WoB функция линейна относительно весов.

Загрузите данные о портфеле

load CAPMuniverse
% Assume that the percentage of women on the board of directors per company
% are as follows:
WoB = [0.2857; 0.5; 0.3; 0.2857; 0.3077; 0.2727; ...
    0.4167; 0.2143; 0.3; 0.4167; 0.3077];
table(WoB,'VariableNames',{'WoB'},'RowNames',Assets(1:11))
ans=11×1 table
             WoB  
            ______

    AAPL    0.2857
    AMZN       0.5
    CSCO       0.3
    DELL    0.2857
    EBAY    0.3077
    GOOG    0.2727
    HPQ     0.4167
    IBM     0.2143
    INTC       0.3
    MSFT    0.4167
    ORCL    0.3077

Создайте Portfolio Объект

Создайте стандартный Portfolio возразите и включите список активов и оцените моменты возвратов активов из данных. Используйте setDefaultConstraints установить ограничения портфеля среднего отклонения по умолчанию. Эти ограничения требуют полностью инвестированных, длинно-единственных портфелей, где неотрицательные веса должны суммировать к 1.

p = Portfolio('AssetList',Assets(1:11));
p = estimateAssetMoments(p, Data(:,1:11));
p = setDefaultConstraints(p);

Установите ограничения группы

Используйте getGroups включать ограничения группы. Первое ограничение группы гарантирует, что веса, которые инвестируют в смешанную розничную продажу (Amazon и eBay), составляют по крайней мере 15%. Второе ограничение группы гарантирует, что веса, которые инвестируют в компьютерные фирмы (Apple, Dell и HP), между 25% и 50%.

% Group constraints
G = [0 1 0 0 1 0 0 0 0 0 0;
     1 0 0 1 0 0 1 0 0 0 0];
LowG = [0.15; 0.25];
UpG = [Inf; 0.5];
p = setGroups(p, G, LowG, UpG);

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

% Transform default contraints
lb = zeros(p.NumAssets,1); % Long-only constraint
ub = [];                   % No explicit weight upper bounds
Aeq = ones(1,p.NumAssets); % Weights must sum to 1
beq = 1;

%Transform group constraints
% GroupMatrix * x <= UpperGroup
% -GroupMatrix * x <= -LowerGroup
A = [G; -G];
b = [UpG; -LowG];

% Get rid of unbounded inequality constraints
ii = isfinite(b);
A = A(ii,:);
b = b(ii);

Найдите портфель с минимальным средним процентом WoB с ограничениями группы.

[wgt_minWoB,minWoB] = linprog(WoB,A,b,Aeq,beq,lb,ub);
Optimal solution found.

Найдите портфель с максимальным средним процентом WoB с ограничениями группы.

[wgt_maxWoB,fval] = linprog(-WoB,A,b,Aeq,beq,lb,ub);
Optimal solution found.
maxWoB = -fval;

Задайте сетку WoB проценты, таким образом, что minWoB = targetWoB(1) targetWoB(N) = maxWoB.

N = 20; % Size of grid
targetWoB = linspace(minWoB,maxWoB,N);

Используйте setInequality установить процент WoB как ограничение. Коэффициентами линейного ограничения должен быть WoB проценты, сопоставленные к каждому активу и правой стороне, должны быть целевым портфелем WoB. Соглашение неравенства . Поскольку цель состоит в том, чтобы максимизировать портфель WoB, затем целевой WoB должен быть нижней границей для портфеля WoB. Поэтому знаки коэффициентов и правая сторона добавленного неравенства должны быть инвертированы.

Ain = -WoB';
bin = -minWoB; % Start with the smallest WoB
p = setInequality(p,Ain,bin);

Вычислите и постройте границу эффективности

Для каждого целевого WoB, targetWoB(i), найдите границу отклонения действенного средства с помощью estimateFrontier. В каждой итерации, правой стороне WoB ограничение портфеля должно быть изменено, чтобы гарантировать, что возвращенные портфели достигают, по крайней мере, целевого WoB. Этот метод возвращает веса портфелей на границе эффективности среднего отклонения, которые имеют WoB по крайней мере, из targetWoB(i). Используя веса, полученные для каждого целевого WoB, вычислите ожидаемый доход портфелей, риск и процент WoB.

prsk = cell(N,1);
pret = cell(N,1);
pWoB = cell(N,1);
for i = 1:N
    p.bInequality = -targetWoB(i);
    pwgt = estimateFrontier(p,N);
    [prsk{i},pret{i}] = estimatePortMoments(p,pwgt);
    pWoB{i} = pwgt'*WoB;
end

Постройте эффективные портфели.

scatter3(cell2mat(prsk),cell2mat(pret),cell2mat(pWoB))
title('Efficient Portfolios')
xlabel('Risk Level')
ylabel('Expected Return')
zlabel('Percentage of WoB')

Figure contains an axes object. The axes object with title Efficient Portfolios contains an object of type scatter.

Визуализировать компромисс между средним процентом портфеля WoB и традиционная граница эффективности среднего отклонения, набор контурных графиков вычисляется для некоторого целевого WoB проценты с помощью plotContours функция в Локальных функциях.

nC = 5; % Number of contour plots
minContour = max(pWoB{1}); % WoB values lower than this
                           % return overlapped contours.

% Plot contours
plotContours(p,minContour,maxWoB,nC,N)

Figure contains an axes object. The axes object with title Efficient Frontiers contains 6 objects of type line. These objects represent 36.57% WoB, 38.84% WoB, 41.11% WoB, 43.38% WoB, 45.65% WoB, No WoB restriction.

Примеры исключения

Вместо того, чтобы требовать определенного уровня для среднего процента портфеля WoB, цель состоит в том, чтобы найти традиционные границы эффективности среднего отклонения, в то время как, исключая активы, которые имеют процент WoB ниже, чем заданный порог. Можно построить исключение с помощью plotExclusionExample функция в Локальных функциях.

% Remove the average percetage of WoB constraint
p.AInequality = []; p.bInequality = [];

% Set of thresholds for excluding assets
thresholdWoB = 0.25:0.05:0.40;

% Plot exclusion example
plotExclusionExample(p,WoB,thresholdWoB,N)

Figure contains an axes object. The axes object with title Efficient Frontiers contains 5 objects of type line. These objects represent 25.00% WoB, 30.00% WoB, 35.00% WoB, 40.00% WoB, No WoB restriction.

Различия между этим подходом и тем, представленным в предыдущих разделах, довольно очевидны. Требование, чтобы все активы имели WoB процент по крайней мере 35% дает границу эффективности, которая может достигнуть возврата самое большее вокруг 1.2(10)-3. С другой стороны, требуя только, что средний процент портфеля WoB 36,57%, дает возможность достигнуть возврата приблизительно 3.2(10)-3, почти 2,5 раза возврат, полученный, когда, исключая активы. Чтобы лучше показать diffences между этими двумя подходами, вычислите максимальный возврат, достигнутый для данного стандартного отклонения для двух способов включать процент WoB требования к портфелю.

Приблизьтесь 1

В первом подходе исключите все активы с WoB процент ниже, чем 33% и находит портфель максимального возврата, который имеет стандартное отклонение в большей части 0.012.

% Select assets to exclude
ub = zeros(p.NumAssets,1);
ub(WoB >= 0.33) = 1;
p.UpperBound = ub;
% Estimate the return for a risk level of 0.012
pwgt_exclude = estimateFrontierByRisk(p,0.012);
ret_exclude = estimatePortReturn(p,pwgt_exclude)
ret_exclude = 0.0011
% Return constraints to the original portfolio
p.UpperBound = [];

Приблизьтесь 2

Для второго подхода гарантируйте что средний WoB процент имеет по крайней мере 33%, и найдите портфель максимального возврата, который имеет стандартное отклонение в большей части 0.012.

% Include WoB constraint into the portfolio
p = addInequality(p,-WoB',-0.33);
% Estimate the return for a risk level of 0.012
pwgt_avgWoB = estimateFrontierByRisk(p,0.012);
ret_avgWoB = estimatePortReturn(p,pwgt_avgWoB)
ret_avgWoB = 0.0028
% Return constraints to the original portfolio
p.AInequality = []; p.bInequality = [];

Вычислите увеличение в ответ между этими двумя подходами.

ret_increase = (ret_avgWoB-ret_exclude)/ret_exclude
ret_increase = 1.5202

Этот ret_increase значение показывает, что возврат из подхода, который только ограничивает средний процент WoB портфеля вместо исключения определенных активов, имеет возврат на 152% выше (для того же уровня риска). Следовательно, при занятии проблемами больше чем с двумя целями, исключая активы, которые не встречаются, определенные критерии не могут быть наилучшим вариантом. Вместо этого взвешенная сумма критериев интереса может показать лучшие результаты.

Локальные функции

function [] = plotContours(p,minWoB,maxWoB,nContour,nPort)

% Set of WoB levels for contour plot
contourWoB = linspace(minWoB,maxWoB,nContour+1);

% Compute and plot efficient frontier for each value in
% contourWoB.
figure;
hold on
labels = strings(nContour+1,1);
for i = 1:nContour
    p.bInequality = -contourWoB(i);
    pwgt = estimateFrontier(p,nPort);
    [prsk,pret] = estimatePortMoments(p,pwgt);
    plot(prsk,pret,'LineWidth',2);
    labels(i) = sprintf("%6.2f%% WoB",contourWoB(i)*100);
end
% Plot the "original" mean-variance frontier, i.e., the
% frontier without WoB requierements
p.AInequality = []; p.bInequality = [];
pwgt = estimateFrontier(p,nPort);
[prsk,pret] = estimatePortMoments(p,pwgt);
plot(prsk,pret,'LineWidth',2);
labels(i+1) = "No WoB restriction";
title('Efficient Frontiers')
xlabel('Standard Deviation of Portfolio Returns')
ylabel('Mean of Portfolio Returns')
legend(labels,'Location','northwest')
grid on
hold off

end

function [] = plotExclusionExample(p,WoB,thresholdWoB, ...
    nPort)

% Compute and plot efficient frontier excluding assets
% that are below the WoB threshold
nT = length(thresholdWoB);
figure;
hold on
labels = strings(nT+1,1);
for i=1:nT
    ub = zeros(p.NumAssets,1);
    % Only select assets above WoB threshold
    ub(WoB >= thresholdWoB(i)) = 1;
    p.UpperBound = ub;
    pwgt = estimateFrontier(p,nPort);
    [prsk,pret] = estimatePortMoments(p,pwgt);
    plot(prsk,pret,'LineWidth',2);
    labels(i) = sprintf("%6.2f%% WoB",thresholdWoB(i)*100);
end
% Plot the "original" mean-variance frontier, i.e., the
% frontier without the WoB threshold
p.UpperBound = [];
pwgt = estimateFrontier(p,nPort);
[prsk,pret] = estimatePortMoments(p,pwgt);
plot(prsk,pret,'LineWidth',2);
labels(i+1) = "No WoB restriction";
title('Efficient Frontiers')
xlabel('Standard Deviation of Portfolio Returns')
ylabel('Mean of Portfolio Returns')
legend(labels,'Location','northwest')
grid on
hold off

end

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

| | | | | | | | |

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

Больше о

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