Примеры оптимизации портфеля

Следующая последовательность примеров подсвечивает функции Portfolio объект в Financial Toolbox™. А именно, примеры используют Portfolio возразите, чтобы показать, как настроить задачи оптимизации портфеля среднего отклонения, которые фокусируются на теореме 2D фонда, ударе операционных издержек и ограничениях оборота, как получить портфели, которые максимизируют отношение Шарпа, и как настроить две популярных стратегии хедж-фонда - нейтральный в отношении доллара и 130-30 портфелей.

Настройте Данные

Каждый пример работает с моментами для ежемесячных совокупных доходов вселенной 30 "престижных" запасов. Несмотря на то, что выведено из действительных данных, эти данные в иллюстративных целях и не предназначены, чтобы быть представительными для определенных активов или для производительности рынка. Данные содержатся в файле BlueChipStockMoments.mat со списком идентификаторов актива в переменной AssetList, среднее значение и ковариация актива возвращаются в переменных AssetMean и AssetCovar, и среднее значение и отклонение наличных денег и рынка возвращаются в переменных CashMean, CashVar, MarketMean, и MarketVar. Поскольку большая часть анализа требует, чтобы использование стандартного отклонения актива возвратилось как прокси для риска, наличных денег, и отклонения рынка преобразованы в стандартные отклонения.

load BlueChipStockMoments

mret = MarketMean;
mrsk = sqrt(MarketVar);
cret = CashMean;
crsk = sqrt(CashVar);

Создайте объект портфеля

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

p = Portfolio('AssetList',AssetList,'RiskFreeRate',CashMean);
p = setAssetMoments(p,AssetMean,AssetCovar);

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

p = setInitPort(p,1/p.NumAssets);
[ersk,eret] = estimatePortMoments(p,p.InitPort);

Специализированный "помощник" функционирует portfolioexamples_plot (см. раздел Utility Functions), позволяет построить все результаты, которые будут разработаны здесь. Этот первый график показывает распределение отдельных активов согласно их средним значениям и стандартным отклонениям возвратов. Кроме того, равный вес, рынок и наличные портфели построены на том же графике. Обратите внимание на то, что portfolioexamples_plot функция преобразует ежемесячные совокупные доходы в пересчитанные на год совокупные доходы.

clf;
portfolioexamples_plot('Asset Risks and Returns', ...
	{'scatter', mrsk, mret, {'Market'}}, ...
	{'scatter', crsk, cret, {'Cash'}}, ...
	{'scatter', ersk, eret, {'Equal'}}, ...
	{'scatter', sqrt(diag(p.AssetCovar)), p.AssetMean, p.AssetList, '.r'});

Настройте Задачу оптимизации Портфеля

Настройте "стандартную" или задачу оптимизации портфеля среднего отклонения по умолчанию с setDefaultConstraints функция, которая требует полностью инвестированных длинно-единственных портфелей (неотрицательные веса, которые должны суммировать к 1). Учитывая эту начальную проблему, оцените границу эффективности с функциями estimateFrontier и estimatePortMoments, где estimateFrontier оценочные эффективные портфели и estimatePortMoments оценки рискуют и возвращаются для портфелей. Следующая фигура накладывает границу эффективности на предыдущем графике.

p = setDefaultConstraints(p);

pwgt = estimateFrontier(p,20);
[prsk,pret] = estimatePortMoments(p,pwgt);

% Plot efficient frontier

clf;
portfolioexamples_plot('Efficient Frontier', ...
	{'line', prsk, pret}, ...
	{'scatter', [mrsk, crsk, ersk], [mret, cret, eret], {'Market', 'Cash', 'Equal'}}, ...
	{'scatter', sqrt(diag(p.AssetCovar)), p.AssetMean, p.AssetList, '.r'});

Проиллюстрируйте линию касательной к границе эффективности

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

Учитывая, что Portfolio объект уже имеет безрисковый уровень, получите линию касательной путем создания копии Portfolio объект с ограничением бюджета, которое разрешает выделение между 0% и 100% наличными. Начиная с Portfolio объект является объектом значения, легко создать копию путем присвоения выхода любого Portfolio или "набор" функционирует к новому экземпляру Portfolio объект. График показывает границу эффективности с выделениями Тобина, которые формируют линию касательной к границе эффективности.

q = setBudget(p, 0, 1);

qwgt = estimateFrontier(q,20);
[qrsk,qret] = estimatePortMoments(q,qwgt);

% Plot efficient frontier with tangent line (0 to 1 cash)

clf;
portfolioexamples_plot('Efficient Frontier with Tangent Line', ...
	{'line', prsk, pret}, ...
	{'line', qrsk, qret, [], [], 1}, ...
	{'scatter', [mrsk, crsk, ersk], [mret, cret, eret], {'Market', 'Cash', 'Equal'}}, ...
	{'scatter', sqrt(diag(p.AssetCovar)), p.AssetMean, p.AssetList, '.r'});

Обратите внимание на то, что наличные деньги на самом деле имеют маленький риск так, чтобы линия касательной не проходила через наличный актив.

Получите область значений рисков, и возвращается

Чтобы получить эффективные портфели с целевыми значениями или риска или возвратиться, это необходимо получить область значений рисков и возвращается среди всех портфелей на границе эффективности. Это выполняется с estimateFrontierLimits функция.

[rsk,ret] = estimatePortMoments(p,estimateFrontierLimits(p));

display(rsk);
rsk = 2×1

    0.0348
    0.0903

display(ret);
ret = 2×1

    0.0094
    0.0179

Область значений ежемесячных возвратов портфеля между 0,9% и 1,8%, и область значений для портфельных рисков между 3,5% и 9,0%. В пересчитанных на год терминах область значений возвратов портфеля составляет 11,2% к 21,5%, и область значений портфельных рисков составляет 12,1% к 31,3%.

Найдите портфель с целенаправленным возвратом и целенаправленным риском

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

TargetReturn = 0.20;            % Input target annualized return and risk here
TargetRisk = 0.15;

% Obtain portfolios with targeted return and risk

awgt = estimateFrontierByReturn(p,TargetReturn/12);
[arsk,aret] = estimatePortMoments(p,awgt);

bwgt = estimateFrontierByRisk(p,TargetRisk/sqrt(12));
[brsk,bret] = estimatePortMoments(p,bwgt);

% Plot efficient frontier with targeted portfolios

clf;
portfolioexamples_plot('Efficient Frontier with Targeted Portfolios', ...
	{'line', prsk, pret}, ...
	{'scatter', [mrsk, crsk, ersk], [mret, cret, eret], {'Market', 'Cash', 'Equal'}}, ...
	{'scatter', arsk, aret, {sprintf('%g%% Return',100*TargetReturn)}}, ...
	{'scatter', brsk, bret, {sprintf('%g%% Risk',100*TargetRisk)}}, ...
	{'scatter', sqrt(diag(p.AssetCovar)), p.AssetMean, p.AssetList, '.r'});

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

aBlotter = dataset({100*awgt(awgt > 0),'Weight'}, 'obsnames', p.AssetList(awgt > 0));

displayPortfolio(sprintf('Portfolio with %g%% Target Return', 100*TargetReturn), aBlotter, false);
Portfolio with 20% Target Return
            Weight 
    CAT      1.1445
    INTC    0.17452
    MO       9.6521
    MSFT    0.85862
    UTX      56.918
    WMT      31.253
bBlotter = dataset({100*bwgt(bwgt > 0),'Weight'}, 'obsnames', p.AssetList(bwgt > 0));

displayPortfolio(sprintf('Portfolio with %g%% Target Risk', 100*TargetRisk), bBlotter, false);
Portfolio with 15% Target Risk
            Weight    
    AA      3.1928e-22
    AIG     5.5874e-21
    AXP     4.3836e-21
    BA       6.257e-22
    C       8.7778e-21
    GE      4.3302e-22
    GM      5.3508e-22
    HD      9.4473e-21
    HON     2.2103e-22
    IBM     3.8403e-20
    INTC        2.2585
    JNJ         9.2162
    MCD     3.7312e-22
    MMM         16.603
    MO          15.388
    MRK      1.641e-21
    MSFT        4.4467
    PFE     1.5991e-21
    PG           4.086
    UTX         10.281
    WMT         25.031
    XOM          12.69

Затраты транзакций

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

BuyCost = 0.0020;
SellCost = 0.0020;

q = setCosts(p,BuyCost,SellCost);

qwgt = estimateFrontier(q,20);
[qrsk,qret] = estimatePortMoments(q,qwgt);

% Plot efficient frontiers with gross and net returns

clf;
portfolioexamples_plot('Efficient Frontier with and without Transaction Costs', ...
	{'line', prsk, pret, {'Gross'}, ':b'}, ...
	{'line', qrsk, qret, {'Net'}}, ...
	{'scatter', [mrsk, crsk, ersk], [mret, cret, eret], {'Market', 'Cash', 'Equal'}}, ...
	{'scatter', sqrt(diag(p.AssetCovar)), p.AssetMean, p.AssetList, '.r'});

Ограничение оборота

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

BuyCost = 0.0020;
SellCost = 0.0020;
Turnover = 0.2;

q = setCosts(p, BuyCost,SellCost);
q = setTurnover(q,Turnover);

[qwgt,qbuy,qsell] = estimateFrontier(q,20);
[qrsk,qret] = estimatePortMoments(q,qwgt);

% Plot efficient frontier with turnover constraint

clf;
portfolioexamples_plot('Efficient Frontier with Turnover Constraint', ...
	{'line', prsk, pret, {'Unconstrained'}, ':b'}, ...
	{'line', qrsk, qret, {sprintf('%g%% Turnover', 100*Turnover)}}, ...
	{'scatter', [mrsk, crsk, ersk], [mret, cret, eret], {'Market', 'Cash', 'Equal'}}, ...
	{'scatter', sqrt(diag(p.AssetCovar)), p.AssetMean, p.AssetList, '.r'});

displaySumOfTransactions(Turnover, qbuy, qsell)
Sum of Purchases by Portfolio along Efficient Frontier (Max. Turnover 20%)
20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 
Sum of Sales by Portfolio along Efficient Frontier (Max. Turnover 20%)
20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 

Ограничение ошибки отслеживания

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

ii = [15, 16, 20, 21, 23, 25, 27, 29, 30];	% Indexes of assets to include in tracking portfolio

TrackingError = 0.05/sqrt(12);
TrackingPort = zeros(30, 1);
TrackingPort(ii) = 1;
TrackingPort = (1/sum(TrackingPort))*TrackingPort;

q = setTrackingError(p,TrackingError,TrackingPort);

qwgt = estimateFrontier(q,20);
[qrsk,qret] = estimatePortMoments(q,qwgt);

[trsk,tret] = estimatePortMoments(q,TrackingPort);

% Plot efficient frontier with tracking-error constraint

clf;
portfolioexamples_plot('Efficient Frontier with 5% Tracking-Error Constraint', ...
	{'line', prsk, pret, {'Unconstrained'}, ':b'}, ...
	{'line', qrsk, qret, {'Tracking'}}, ...
	{'scatter', [mrsk, crsk], [mret, cret], {'Market', 'Cash'}}, ...
	{'scatter', trsk, tret, {'Tracking'}, 'r'});

Объединенные ограничения оборота и ошибки отслеживания

Этот пример иллюстрирует взаимодействия, которые могут произойти при объединенных ограничениях. В этом случае и ограничению оборота относительно начального портфеля равного веса и ограничению ошибки отслеживания относительно портфеля отслеживания нужно удовлетворить. Ограничение оборота имеет максимум 30%-го оборота, и ограничение ошибки отслеживания имеет максимум 5%, отслеживающих ошибку. Обратите внимание на то, что оборот, чтобы добраться от начального портфеля до портфеля отслеживания составляет 70% так, чтобы верхняя граница 30% оборота означала, что граница эффективности будет находиться где-нибудь между начальным портфелем и портфелем отслеживания.

Turnover = 0.3;
InitPort = (1/q.NumAssets)*ones(q.NumAssets, 1);

ii = [15, 16, 20, 21, 23, 25, 27, 29, 30];	% Indexes of assets to include in tracking portfolio

TrackingError = 0.05/sqrt(12);
TrackingPort = zeros(30, 1);
TrackingPort(ii) = 1;
TrackingPort = (1/sum(TrackingPort))*TrackingPort;

q = setTurnover(q,Turnover,InitPort);

qwgt = estimateFrontier(q,20);
[qrsk,qret] = estimatePortMoments(q,qwgt);

[trsk,tret] = estimatePortMoments(q,TrackingPort);
[ersk,eret] = estimatePortMoments(q,InitPort);

% Plot efficient frontier with combined turnover and tracking-error constraint

clf;
portfolioexamples_plot('Efficient Frontier with Turnover and Tracking-Error Constraint', ...
	{'line', prsk, pret, {'Unconstrained'}, ':b'}, ...
	{'line', qrsk, qret, {'Turnover & Tracking'}}, ...
	{'scatter', [mrsk, crsk], [mret, cret], {'Market', 'Cash'}}, ...
	{'scatter', trsk, tret, {'Tracking'}, 'r'}, ...
	{'scatter', ersk, eret, {'Initial'}, 'b'});

Максимизируйте отношение Шарпа

Отношение Шарпа (Шарп 1966) является мерой возврата к риску, который играет важную роль в анализе портфеля. А именно, портфель, который максимизирует отношение Шарпа, является также портфелем касания на границе эффективности от теоремы взаимного фонда. Максимум портфель отношения Шарпа расположен на границе эффективности с функциональным estimateMaxSharpeRatio и dataset объект используется, чтобы перечислить активы в этом портфеле.

p = setInitPort(p, 0);

swgt = estimateMaxSharpeRatio(p);
[srsk,sret] = estimatePortMoments(p,swgt);

% Plot efficient frontier with portfolio that attains maximum Sharpe ratio

clf;
portfolioexamples_plot('Efficient Frontier with Maximum Sharpe Ratio Portfolio', ...
	{'line', prsk, pret}, ...
	{'scatter', srsk, sret, {'Sharpe'}}, ...
	{'scatter', [mrsk, crsk, ersk], [mret, cret, eret], {'Market', 'Cash', 'Equal'}}, ...
	{'scatter', sqrt(diag(p.AssetCovar)), p.AssetMean, p.AssetList, '.r'});

% Set up a dataset object that contains the portfolio that maximizes the Sharpe ratio

Blotter = dataset({100*swgt(swgt > 0),'Weight'}, 'obsnames', AssetList(swgt > 0));

displayPortfolio('Portfolio with Maximum Sharpe Ratio', Blotter, false);
Portfolio with Maximum Sharpe Ratio
            Weight    
    AA      1.9674e-15
    AIG     1.9059e-15
    AXP     1.0567e-15
    BA      5.6013e-16
    C       2.0055e-15
    CAT     2.9716e-15
    DD      3.1346e-16
    DIS     5.9556e-16
    GE      5.6145e-15
    GM      7.3246e-16
    HD      2.0342e-11
    HON      3.309e-16
    HPQ     2.0307e-15
    IBM     8.8746e-15
    INTC        2.6638
    JNJ         9.0044
    JPM     5.4026e-16
    KO      2.4602e-16
    MCD     8.7472e-16
    MMM         15.502
    MO          13.996
    MRK     3.2239e-16
    MSFT        4.4777
    PFE     7.3425e-16
    PG          7.4588
    SBC     3.8329e-16
    UTX         6.0056
    VZ      3.9079e-16
    WMT         22.051
    XOM         18.841

Подтвердите, что Максимумом Отношение Шарпа является Максимум

Следующий график демонстрирует, что этот портфель (который расположен в точке на графиках) действительно максимизирует отношение Шарпа среди всех портфелей на границе эффективности.

psratio = (pret - p.RiskFreeRate) ./ prsk;
ssratio = (sret - p.RiskFreeRate) / srsk;

clf;
subplot(2,1,1);
plot(prsk, pret, 'LineWidth', 2);
hold on
scatter(srsk, sret, 'g', 'filled');
title('\bfEfficient Frontier');
xlabel('Portfolio Risk');
ylabel('Portfolio Return');
hold off

subplot(2,1,2);
plot(prsk, psratio, 'LineWidth', 2);
hold on
scatter(srsk, ssratio, 'g', 'filled');
title('\bfSharpe Ratio');
xlabel('Portfolio Risk');
ylabel('Sharpe Ratio');
hold off

Проиллюстрируйте, что Шарп является Портфелем Касательной

Следующий график демонстрирует, что портфель, который максимизирует отношение Шарпа, является также портфелем касания (в этом случае, ограничение бюджета открыто, чтобы разрешить между 0% и 100% наличными).

q = setBudget(p, 0, 1);

qwgt = estimateFrontier(q,20);
[qrsk,qret] = estimatePortMoments(q,qwgt);

% Plot that shows Sharpe ratio portfolio is the tangency portfolio

clf;
portfolioexamples_plot('Efficient Frontier with Maximum Sharpe Ratio Portfolio', ...
	{'line', prsk, pret}, ...
	{'line', qrsk, qret, [], [], 1}, ...
	{'scatter', srsk, sret, {'Sharpe'}}, ...
	{'scatter', [mrsk, crsk, ersk], [mret, cret, eret], {'Market', 'Cash', 'Equal'}}, ...
	{'scatter', sqrt(diag(p.AssetCovar)), p.AssetMean, p.AssetList, '.r'});

Нейтральная в отношении доллара структура хедж-фонда

Чтобы проиллюстрировать, как использовать инструменты оптимизации портфеля в управлении хедж-фонда, две популярных стратегии с нейтральным в отношении доллара и 130-30 портфелей исследованы. Нейтральная в отношении доллара стратегия вкладывает капитал одинаково в длинные и короткие позиции, таким образом, что сетевым положением портфеля является 0. Такой портфель, как говорят, "нейтрален в отношении доллара".

Чтобы настроить нейтральный в отношении доллара портфель, начните со "стандартной" проблемы портфеля и установите максимальное воздействие в длинных и коротких позициях в переменной Exposure. Границы для отдельных весов актива плюс или минус Exposure. Поскольку сетевое положение должно быть нейтральным в отношении доллара, ограничением бюджета является 0 и начальным портфелем должен быть 0. Наконец, односторонние ограничения оборота обеспечивают необходимые долгие и короткие ограничения, чтобы предотвратить "двойной подсчет" длинных и коротких позиций. Промокательная бумага показывает веса портфеля для нейтрального в отношении доллара портфеля, который максимизирует отношение Шарпа. Длинные и короткие позиции получены из покупки и продают отрасли относительно начального портфеля.

Exposure = 1;

q = setBounds(p, -Exposure, Exposure);
q = setBudget(q, 0, 0);
q = setOneWayTurnover(q, Exposure, Exposure, 0);

[qwgt,qlong,qshort] = estimateFrontier(q,20);
[qrsk,qret] = estimatePortMoments(q,qwgt);

[qswgt,qslong,qsshort] = estimateMaxSharpeRatio(q);
[qsrsk,qsret] = estimatePortMoments(q,qswgt);

% Plot efficient frontier for a dollar-neutral fund structure with tangency portfolio

clf;
portfolioexamples_plot('Efficient Frontier with Dollar-Neutral Portfolio', ...
	{'line', prsk, pret, {'Standard'}, 'b:'}, ...
	{'line', qrsk, qret, {'Dollar-Neutral'}, 'b'}, ...
	{'scatter', qsrsk, qsret, {'Sharpe'}}, ...
	{'scatter', [mrsk, crsk, ersk], [mret, cret, eret], {'Market', 'Cash', 'Equal'}}, ...
	{'scatter', sqrt(diag(p.AssetCovar)), p.AssetMean, p.AssetList, '.r'});

% Set up a dataset object that contains the portfolio that maximizes the Sharpe ratio

Blotter = dataset({100*qswgt(abs(qswgt) > 1.0e-4), 'Weight'}, ...
	{100*qslong(abs(qswgt) > 1.0e-4), 'Long'}, ...
	{100*qsshort(abs(qswgt) > 1.0e-4), 'Short'}, ...
	'obsnames', AssetList(abs(qswgt) > 1.0e-4));

displayPortfolio('Dollar-Neutral Portfolio with Maximum Sharpe Ratio', Blotter, true, 'Dollar-Neutral');
Dollar-Neutral Portfolio with Maximum Sharpe Ratio
            Weight     Long       Short 
    AA       0.5088     0.5088         0
    AIG      3.0394     3.0394         0
    AXP     0.92797    0.92797         0
    BA      -3.4952          0    3.4952
    C        14.003     14.003         0
    CAT      3.7261     3.7261         0
    DD      -18.063          0    18.063
    DIS     -4.8236          0    4.8236
    GE      -3.6178          0    3.6178
    GM      -3.7211          0    3.7211
    HD        1.101      1.101         0
    HON     -1.4349          0    1.4349
    HPQ     0.09909    0.09909         0
    IBM     -8.0585          0    8.0585
    INTC     1.7693     1.7693         0
    JNJ      1.3696     1.3696         0
    JPM     -2.5271          0    2.5271
    KO      -14.205          0    14.205
    MCD        3.91       3.91         0
    MMM      7.5995     7.5995         0
    MO       4.0856     4.0856         0
    MRK       3.747      3.747         0
    MSFT     4.0769     4.0769         0
    PFE      -9.096          0     9.096
    PG       1.6493     1.6493         0
    SBC     -5.2547          0    5.2547
    UTX      5.7454     5.7454         0
    VZ       -2.438          0     2.438
    WMT     0.84844    0.84844         0
    XOM      18.529     18.529         0

Confirm Dollar-Neutral Portfolio
  (Net, Long, Short)
-0.0000 76.7350 76.7350 

Структура Фонда 130/30

Наконец, ограничения оборота могут использоваться, чтобы настроить структуру портфеля 130-30, которая является структурой с сетевой длинной позицией, но разрешает рычаги с длинными и короткими позициями до максимальной суммы рычагов. В случае портфеля 130-30 рычаги составляют 30%.

Чтобы настроить портфель 130-30, начните со "стандартной" проблемы портфеля и установите максимальное значение для рычагов в переменной Leverage. Границы для отдельных весов актива располагаются между -Leverage и 1 + Leverage. Поскольку сетевое положение должно быть долгим, ограничением бюджета является 1 и еще раз начальным портфелем является 0. Наконец, односторонние ограничения оборота обеспечивают необходимые долгие и короткие ограничения, чтобы предотвратить "двойной подсчет" длинных и коротких позиций. Промокательная бумага показывает веса портфеля для портфеля 130-30, который максимизирует отношение Шарпа. Длинные и короткие позиции получены из покупки и продают отрасли относительно начального портфеля.

Leverage = 0.3;

q = setBounds(p, -Leverage, 1 + Leverage);
q = setBudget(q, 1, 1);
q = setOneWayTurnover(q, 1 + Leverage, Leverage);

[qwgt,qbuy,qsell] = estimateFrontier(q,20);
[qrsk,qret] = estimatePortMoments(q,qwgt);

[qswgt,qslong,qsshort] = estimateMaxSharpeRatio(q);
[qsrsk,qsret] = estimatePortMoments(q,qswgt);

% Plot efficient frontier for a 130-30 fund structure with tangency portfolio

clf;
portfolioexamples_plot(sprintf('Efficient Frontier with %g-%g Portfolio', ...
    100*(1 + Leverage),100*Leverage), ...
	{'line', prsk, pret, {'Standard'}, 'b:'}, ...
	{'line', qrsk, qret, {'130-30'}, 'b'}, ...
	{'scatter', qsrsk, qsret, {'Sharpe'}}, ...
	{'scatter', [mrsk, crsk, ersk], [mret, cret, eret], {'Market', 'Cash', 'Equal'}}, ...
	{'scatter', sqrt(diag(p.AssetCovar)), p.AssetMean, p.AssetList, '.r'});

% Set up a dataset object that contains the portfolio that maximizes the Sharpe ratio

Blotter = dataset({100*qswgt(abs(qswgt) > 1.0e-4), 'Weight'}, ...
	{100*qslong(abs(qswgt) > 1.0e-4), 'Long'}, ...
	{100*qsshort(abs(qswgt) > 1.0e-4), 'Short'}, ...
	'obsnames', AssetList(abs(qswgt) > 1.0e-4));

displayPortfolio(sprintf('%g-%g Portfolio with Maximum Sharpe Ratio', 100*(1 + Leverage), 100*Leverage), Blotter, true, sprintf('%g-%g', 100*(1 + Leverage), 100*Leverage));
130-30 Portfolio with Maximum Sharpe Ratio
            Weight      Long      Short  
    DD       -9.5565         0     9.5565
    HON      -6.0244         0     6.0244
    INTC      4.0335    4.0335          0
    JNJ       7.1234    7.1234          0
    JPM     -0.44583         0    0.44583
    KO       -13.646         0     13.646
    MMM       20.908    20.908          0
    MO        14.433    14.433          0
    MSFT      4.5592    4.5592          0
    PG        17.243    17.243          0
    SBC     -0.32712         0    0.32712
    UTX       5.3584    5.3584          0
    WMT       21.018    21.018          0
    XOM       35.323    35.323          0

Confirm 130-30 Portfolio
  (Net, Long, Short)
100.0000 130.0000 30.0000 

Ссылки

  1. Р. К. Гринолд и Р. Н. Кан. Активное Управление портфелем. 2-й редактор., 2000.

  2. Х. М. Марковиц. "Выбор портфеля". Журнал Финансов. Издание 1, № 1, стр 77-91, 1952.

  3. Дж. Линтнер. "Оценка Активов Риска и Выбор Risky Investments в Портфелях Запаса и Капитальных бюджетах". Анализ Экономики и Статистики. Издание 47, № 1, стр 13-37, 1965.

  4. Х. М. Марковиц. Выбор портфеля: эффективная диверсификация инвестиций. John Wiley & Sons, Inc., 1959.

  5. В. Ф. Шарп. "Производительность Взаимного фонда". Журнал Бизнеса. Издание 39, № 1, Часть 2, стр 119-138, 1966.

  6. Дж. Тобин. "Настройка ликвидности как Поведение К Риску". Анализ Экономических Исследований. Издание 25, № 1, стр 65-86, 1958.

  7. Дж. Л. Треинор и Ф. Блэк. "Как Использовать Анализ безопасности, чтобы Улучшить Выбор Портфеля". Журнал Бизнеса. Издание 46, № 1, стр 68-86, 1973.

Служебные функции

function displaySumOfTransactions(Turnover, qbuy, qsell)
fprintf('Sum of Purchases by Portfolio along Efficient Frontier (Max. Turnover %g%%)\n', ...
    100*Turnover);
fprintf('%.4f ', 100*sum(qbuy)), sprintf('\n\n');
fprintf('\n')
fprintf('Sum of Sales by Portfolio along Efficient Frontier (Max. Turnover %g%%)\n', ...
    100*Turnover);
fprintf('%.4f ', 100*sum(qsell));
end

function displayPortfolio(Description, Blotter, LongShortFlag, portfolioType)
fprintf('%s\n', Description);
disp(Blotter);
if (LongShortFlag)
    fprintf('Confirm %s Portfolio\n', portfolioType);
    fprintf('  (Net, Long, Short)\n');
    fprintf('%.4f ' , [ sum(Blotter.Weight), sum(Blotter.Long), sum(Blotter.Short) ]);
end
end