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

Следующая последовательность примеров подсвечивает функции объекта 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") позволяет построить все результаты, которые будут разработаны здесь. Этот первый график показывает распределение отдельных активов согласно их средним значениям и стандартным отклонениям возвратов. Кроме того, равный вес, рынок и наличные портфели построены на том же графике. Обратите внимание на то, что функция построения графика преобразовывает ежемесячные совокупные доходы в пересчитанные на год совокупные доходы.

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.5034e-21
    C       6.3706e-21
    CAT     5.9752e-21
    DD      1.4915e-21
    DIS     2.4617e-21
    GE      2.7216e-21
    GM      4.9615e-22
    IBM     2.1018e-20
    INTC        2.2585
    JNJ         9.2162
    JPM     2.0519e-21
    KO      6.4318e-23
    MMM         16.603
    MO          15.388
    MSFT        4.4467
    PG           4.086
    UTX         10.281
    VZ      2.9279e-21
    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. Р. К. Гринолд и Р. Н. Кан (2000). Активное Управление портфелем. 2-й редактор.

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

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

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

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

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

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

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

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