В этом примере показано, как использовать 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')
Визуализировать компромисс между средним процентом портфеля 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)
Вместо того, чтобы требовать определенного уровня для среднего процента портфеля 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)
Различия между этим подходом и тем, представленным в предыдущих разделах, довольно очевидны. Требование, чтобы все активы имели WoB
процент по крайней мере 35% дает границу эффективности, которая может достигнуть возврата самое большее вокруг . С другой стороны, требуя только, что средний процент портфеля WoB
36,57%, дает возможность достигнуть возврата приблизительно , почти 2,5 раза возврат, полученный, когда, исключая активы. Чтобы лучше показать diffences между этими двумя подходами, вычислите максимальный возврат, достигнутый для данного стандартного отклонения для двух способов включать процент WoB
требования к портфелю.
В первом подходе исключите все активы с 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 = [];
Для второго подхода гарантируйте что средний 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
Portfolio
| setBounds
| addGroups
| setAssetMoments
| estimateAssetMoments
| estimateBounds
| plotFrontier
| estimateFrontierLimits
| estimateFrontierByRisk
| estimatePortRisk