В этом примере показано, как использовать Portfolio объект для непосредственной обработки полунепрерывных и кардинальных ограничений при выполнении оптимизации портфеля. Оптимизация портфеля определяет распределение активов, которое максимизирует доходность или минимизирует риск с учетом ряда инвестиционных ограничений. Portfolio класс в финансовой Toolbox™ разработан и реализован на основе системы оптимизации средних отклонений Марковица. Структура оптимизации средних отклонений обрабатывает проблемы, в которых доходность является ожидаемой доходностью портфеля, а риск - дисперсией доходности портфеля. Использование Portfolio класс, можно минимизировать риск на эффективной границе (EF), максимизировать возврат на EF, максимизировать возврат для данного риска и минимизировать риск для данного возврата. Также можно использовать PortfolioCVaR или PortfolioMAD классы в Financial Toolbox™ для указания ограничений полунепрерывности и количества элементов. Такие проблемы оптимизации интегрируются с такими ограничениями, как групповое, линейное неравенство, оборачиваемость и ограничения ошибок отслеживания. Эти ограничения формулируются как проблемы нелинейного программирования (NLP) с непрерывными переменными, представленными как веса активов .
Полунепрерывные и кардинальные ограничения - это две другие общие категории портфельных ограничений, которые формулируются математически путем добавления двоичных переменных .
Полунепрерывное ограничение ограничивает распределение актива. Например, это ограничение можно использовать для ограничения распределенного веса распределенного актива 5- 50%%. Используя это ограничение, можно избежать очень малых или больших позиций, чтобы минимизировать отток и операционные затраты. Чтобы математически сформулировать этот тип ограничения, необходима двоичная переменная vi, где является 0 или 1. Стоимость 0 указывает, что основное средство i не распределено, и значение 1 указывает, что основное средство i распределено. Математическая форма - , где 0 или 1. Укажите этот тип ограничения как 'Conditional' BoundType в Portfolio с использованием setBounds функция.
Ограничение количества основных средств ограничивает количество основных средств при оптимальном распределении. Например, для портфеля с совокупностью из 100 основных средств можно указать оптимальное распределение портфеля между 20 и 40 основными средствами. Эта возможность позволяет ограничить количество позиций и, таким образом, снизить эксплуатационные расходы. Чтобы математически сформулировать этот тип ограничения, необходимы двоичные переменные, представленные как vi, где является 0 или 1. Стоимость 0 указывает, что основное средство i не распределено, и значение 1 указывает, что основное средство i распределено. Математическая форма - , где 0 или 1. Укажите этот тип ограничения, задав 'MinNumAssets' и 'MaxNumAssets'зависимости в Portfolio с использованием setMinMaxNumAssets функция.
Дополнительные сведения о полунепрерывных ограничениях и ограничениях количества элементов см. в разделе Алгоритмы.
Когда для оптимизации портфеля используются полунепрерывные и кардинальные ограничения, это приводит к смешанным целочисленным нелинейным проблемам программирования (MINLP). Portfolio класс позволяет настроить эти два ограничения, в частности, полунепрерывные ограничения, используя setBounds с 'Conditional' BoundTypeи ограничения по кардинальности с использованием setMinMaxNumAssets. Portfolio класс автоматически формулирует математические задачи и проверяет указанные ограничения. Portfolio класс также предоставляет встроенные решатели MINLP и гибкие опции решателя для настройки производительности решателя с помощью setSolverMINLP функция.
В этом примере демонстрируется Portfolio объект с полунепрерывными ограничениями и ограничениями по кардинальности и использует BlueChipStockMoments набор данных, который имеет вселенную из 30 активов.
load BlueChipStockMoments
numAssets = numel(AssetList)numAssets = 30
Создайте полностью инвестированный портфель с только длинными позициями: 1. Они сконфигурированы сsetDefaultConstraints.
p = Portfolio('AssetList', AssetList,'AssetCovar', AssetCovar, 'AssetMean', AssetMean); p = setDefaultConstraints(p);
Предположим, что вы хотите избежать очень небольших позиций, чтобы минимизировать отток и операционные затраты. Добавьте другое ограничение, чтобы ограничить назначенные позиции не менее 5%, установив ограничения xi≥0.05 с помощьюsetBounds с 'Conditional' BoundType.
pWithMinWeight = setBounds(p, 0.05, 'BoundType', 'Conditional');
Постройте графики эффективных границ для обоих Portfolio объекты.
wgt = estimateFrontier(p); wgtWithMinWeight = estimateFrontier(pWithMinWeight); figure(1); plotFrontier(p, wgt); hold on; plotFrontier(pWithMinWeight, wgtWithMinWeight); hold off; legend('Baseline portfolio', 'With minWeight constraint', 'location', 'best');
![]()
Рисунок показывает, что два Portfolio объекты имеют почти идентичные эффективные границы. Тем не менее, тот, который имеет требование минимального веса, является более практичным, поскольку он предотвращает близкие к нулю положения.
Проверьте оптимальные веса для портфеля с ограничениями по умолчанию, чтобы увидеть, сколько активов ниже 5% предела для каждого оптимального распределения.
toler = eps; sum(wgt>toler & wgt<0.05)
ans = 1×10
5 7 5 4 2 3 4 2 0 0
Использовать estimateFrontierByReturn исследовать составы портфеля для целевого возврата на границе для обоих случаев.
targetRetn = 0.011; pwgt = estimateFrontierByReturn(p, targetRetn); pwgtWithMinWeight = estimateFrontierByReturn(pWithMinWeight, targetRetn);
Постройте график композиции двух Portfolio объекты для вселенной из 30 активов.
figure(2); barh([pwgt, pwgtWithMinWeight]); grid on xlabel('Proportion of Investment') yticks(1:p.NumAssets); yticklabels(p.AssetList); title('Asset Allocation'); legend('Without min weight limit', 'With min weight limit', 'location', 'best');
![]()
Показывать только выделенные ресурсы.
idx = (pwgt>toler) | (pwgtWithMinWeight>toler); barh([pwgt(idx), pwgtWithMinWeight(idx)]); grid on xlabel('Proportion of Investment') yticks(1:sum(idx)); yticklabels(p.AssetList(idx)); title('Asset Allocation'); legend('Without min weight limit', 'With min weight limit', 'location', 'best');
![]()
Использовать setMinMaxNumAssets для установки максимального количества выделенных активов для Portfolio объект. Предположим, что в оптимальный портфель нужно вложить не более восьми активов. Чтобы сделать это с помощью Portfolio объект, использование setMinMaxNumAssets.
pWithMaxNumAssets = setMinMaxNumAssets(p, [], 8); wgt = estimateFrontier(p); wgtWithMaxNumAssets = estimateFrontier(pWithMaxNumAssets); plotFrontier(p, wgt); hold on; plotFrontier(pWithMaxNumAssets, wgtWithMaxNumAssets); hold off; legend('Baseline portfolio', 'With MaxNumAssets constraint', 'location', 'best');
![]()
Использовать estimateFrontierByReturn найти распределение, которое минимизирует риск на границе для данного целевого возврата.
pwgtWithMaxNum = estimateFrontierByReturn(pWithMaxNumAssets, targetRetn);
Постройте график композиции двух Portfolio объекты для вселенной из 30 активов.
idx = (pwgt>toler) | (pwgtWithMaxNum>toler); barh([pwgt(idx), pwgtWithMaxNum(idx)]); grid on xlabel('Proportion of Investment') yticks(1:sum(idx)); yticklabels(p.AssetList(idx)); title('Asset Allocation'); legend('Baseline portfolio', 'With MaxNumAssets constraint', 'location', 'best');
![]()
sum(abs(pwgt)>toler)
ans = 11
Подсчитайте общее количество выделенных активов, чтобы убедиться, что распределено не более восьми активов.
sum(abs(pwgtWithMaxNum)>toler)
ans = 8
Предположим, что необходимо установить как нижнюю, так и верхнюю границы для количества активов, распределяемых в портфеле, учитывая совокупность активов. Использовать setBounds указать разрешенное количество распределяемых активов от 5 до 10 и распределенный вес не менее 5%.
p1 = setMinMaxNumAssets(p, 5, 10); p1 = setBounds(p1, 0.05, 'BoundType', 'conditional');
При присвоении основного средства необходимо четко определить требование к минимальному весу для этого основного средства. Это делается с помощью setBounds с 'Conditional' BoundType. В противном случае оптимизатор не может оценить, какие основные средства присвоены, и не может сформулировать MinNumAssets ограничение. Дополнительные сведения см. в разделе Условные границы с LowerBound, определенными как пустые или нулевые.
Постройте график эффективной границы для сравнения этого портфеля с базовым портфелем, который имеет только ограничения по умолчанию.
wgt = estimateFrontier(p); wgt1 = estimateFrontier(p1); plotFrontier(p, wgt); hold on; plotFrontier(p1, wgt1); hold off; legend('Baseline portfolio', 'With MaxNumAssets constraint', 'location', 'best');
![]()
Создание портфеля с равными весами с использованием обоих вариантов setBounds и setMinMaxNumAssets функции.
numAssetsAllocated = 8; weight= 1/numAssetsAllocated; p2 = setBounds(p, weight, weight, 'BoundType', 'conditional'); p2 = setMinMaxNumAssets(p2, numAssetsAllocated, numAssetsAllocated);
Когда какой-либо, или любая комбинация 'Conditional' BoundType, MinNumAssets, или MaxNumAssets являются активными, задача оптимизации формулируется как задача смешанного целочисленного нелинейного программирования (MINLP). Portfolio класс автоматически создает проблему MINLP на основе указанных ограничений.
При работе с Portfolio , можно выбрать один из трех решателей с помощью setSolverMINLP функция. В этом примере вместо использования опций решателя MINLP по умолчанию настройте опции решателя для решения проблемы сходимости. Используйте большое число (50) для 'MaxIterationsInactiveCut' с setSolverMINLP, вместо значения по умолчанию 30 для "MaxIterationsInactiveCut'. Стоимость 50 хорошо работает в поиске эффективной границы оптимального распределения активов.
p2 = setSolverMINLP(p2, 'OuterApproximation', 'MaxIterationsInactiveCut', 50);
Постройте графики эффективных границ для базовых и равных по весу портфелей.
wgt = estimateFrontier(p); wgt2 = estimateFrontier(p2); plotFrontier(p, wgt); hold on; plotFrontier(p2, wgt2); hold off; legend('Baseline portfolio', 'Equal Weighted portfolio', 'location', 'best');
![]()
Использовать estimateFrontierByRisk для оптимизации для определенного уровня риска, в данном случае .05, чтобы определить, какое распределение максимизирует доходность портфеля.
targetRisk = 0.05; pwgt = estimateFrontierByRisk(p, targetRisk); pwgt2 = estimateFrontierByRisk(p2, targetRisk); idx = (pwgt>toler) | (pwgt2>toler); barh([pwgt(idx), pwgt2(idx)]); grid on xlabel('Proportion of investment') yticks(1:sum(idx)); yticklabels(p.AssetList(idx)); title('Asset Allocation'); legend('Baseline portfolio', 'Equal weighted portfolio', 'location', 'best');
![]()
'Conditional' BoundType, MinNumAssets, и MaxNumAssets Зависимости с другими ограничениямиМожно определить другие ограничения для Portfolio с использованием set функции. Эти другие ограничения для Portfolio объект, такой как группа, линейное неравенство, оборот и ошибка отслеживания, может использоваться вместе с 'Conditional' BoundType, 'MinNumAssets', и 'MaxNumAssets' ограничения. Например, укажите ограничение ошибки отслеживания с помощью setTrackingError.
ii = [15, 16, 20, 21, 23, 25, 27, 29, 30]; % indexes of assets to include in tracking portfolio
trackingPort(ii) = 1/numel(ii);
q = setTrackingError(p, 0.5, trackingPort);Затем использовать setMinMaxNumAssets добавление ограничения для ограничения максимального количества инвестируемых активов.
q = setMinMaxNumAssets(q, [], 8);
Поверх этих ранее заданных ограничений используйте setBounds добавление ограничения для ограничения веса выделенных активов. Можно использовать ограничения со смешанными BoundType значения, где 'Simple' означает и 'Conditional' означает lb≤xi≤ub .
Разрешить активы в trackingPort чтобы иметь BoundType стоимость 'Conditional' в оптимальном распределении.
lb = zeros(q.NumAssets, 1); ub = zeros(q.NumAssets, 1)*0.5; lb(ii) = 0.1; ub(ii) = 0.3; boundType = repmat("simple",q.NumAssets,1); boundType(ii) = "conditional"; q = setBounds(q, lb, ub, 'BoundType',boundType);
Постройте график эффективной границы:
plotFrontier(q);
![]()
Использовать estimateFrontierByReturn найти распределение, которое минимизирует риск для данного возврата на 0.125.
targetRetn = 0.0125; pwgt = estimateFrontierByReturn(q, targetRetn);
Показать распределение основных средств по весу.
idx = abs(pwgt)>eps; assetnames = q.AssetList'; Asset = assetnames(idx); Weight = pwgt(idx); resultAlloc = table(Asset, Weight)
resultAlloc=7×2 table
Asset Weight
________ _______
{'JNJ' } 0.1
{'MMM' } 0.19503
{'MO' } 0.1485
{'MSFT'} 0.1
{'PG' } 0.1
{'WMT' } 0.2212
{'XOM' } 0.13527
Portfolio | setBounds | setMinMaxNumAssets | setSolverMINLP