Если Portfolio
объект уничтожается при изменении не забудьте передавать существующий объект в Portfolio
возразите, хотите ли вы изменить его, в противном случае это создает новый объект. Смотрите Создание Объекта Портфеля для деталей.
Если оптимизация приводит к сбою с "плохим центром" сообщение от lcprog
, попробуйте большее значение за tolpiv
который является допуском к выбору центра в lcprog
алгоритм (пробуют 1.0e-7
, например) или попытка interior-point-convex
версия quadprog
. Для получения дополнительной информации смотрите Выбор и Управление Решателем для Оптимизации Портфеля Среднего Отклонения, заголовком справки для lcprog
, и quadprog
.
Несмотря на то, что это затрудняет, чтобы охарактеризовать, когда один алгоритм быстрее, чем другой, решатель по умолчанию, lcprog
быстрее для меньших проблем и quadprog
решатель быстрее для больших проблем. Если один решатель, кажется, занимает слишком много времени, попробуйте другой решатель. Чтобы изменить решатели, используйте setSolver
.
Если вы получаете матричную несовместимость или "несоответствующие" ошибки, представление данных в инструментах следует за определенным набором основных правил, описанных в Соглашениях для Представления Данных.
Если актив возвращается, данные имеют пропавших без вести или NaN
значения, estimateAssetMoments
функция с 'missingdata'
отметьте набор к true
может перестать работать или со слишком многими итерациями или с сингулярной ковариацией. Чтобы откорректировать эту проблему, рассмотрите это:
Если у вас есть актив, возвращают данные без пропавших без вести или NaN
значения, можно вычислить ковариационную матрицу, которая может быть сингулярной без трудностей. Если у вас есть пропавшие без вести или NaN
значения в ваших данных, поддерживавшая недостающая функция данных требует, чтобы ваша ковариационная матрица была положительно-определенной, то есть, несингулярной.
estimateAssetMoments
настройки по умолчанию использования для недостающей процедуры оценки данных, которая не может подходить для всех проблем.
В любом случае вы можете хотеть оценить, что моменты актива возвращают отдельно с любым функции оценки ECM, такие как ecmnmle
или с вашими собственными функциями.
mv_optim_transform
ОшибкиЕсли вы получаете ошибки оптимизации, такие как:
Error using mv_optim_transform (line 233) Portfolio set appears to be either empty or unbounded. Check constraints. Error in Portfolio/estimateFrontier (line 63) [A, b, f0, f, H, g, lb] = mv_optim_transform(obj);
Error using mv_optim_transform (line 238) Cannot obtain finite lower bounds for specified portfolio set. Error in Portfolio/estimateFrontier (line 63) [A, b, f0, f, H, g, lb] = mv_optim_transform(obj);
estimateBounds
исследовать ваш набор портфеля и использовать checkFeasibility
гарантировать, что ваш начальный портфель любой выполним и, если неосуществимый, что у вас есть достаточный оборот, чтобы добраться от вашего начального портфеля до набора портфеля.
Чтобы откорректировать эту проблему, попытайтесь решить свою задачу с большими значениями для оборота или ошибки отслеживания и постепенно уменьшайте до значения, которое вы хотите.
Если вы получаете эффективные портфели, которые, кажется, не целесообразны, это может произойти, если вы забываете устанавливать определенные ограничения, или вы устанавливаете неправильные ограничения. Например, если вы позволяете весам портфеля падать между 0
и 1
и не устанавливайте ограничение бюджета, можно получить портфели, которые составляют 100%, которые инвестируют в каждый актив. Несмотря на то, что может быть трудно обнаружить, лучшая вещь сделать состоит в том, чтобы рассмотреть ограничения, которые вы установили с отображением объекта. Если вы получаете портфели с 100%, которые инвестируют в каждый актив, можно рассмотреть отображение объекта и быстро видеть, что никакое ограничение бюджета не установлено. Кроме того, можно использовать estimateBounds
и checkFeasibility
чтобы определить, целесообразны ли границы для вашего набора портфеля и определить, получили ли портфели вы, выполнимы относительно независимой формулировки вашего набора портфеля.
Если вы получаете границы эффективности, которые, кажется, не целесообразны, это может произойти для некоторых случаев среднего значения, и ковариация актива возвращается. Для некоторых задач оптимизации портфеля среднего отклонения возможно испытать затруднения в конечных точках границы эффективности. Это редко для стандартных проблем портфеля, но это может произойти. Например, это может произойти при использовании необычных комбинаций ограничений оборота и операционных издержек. Обычно, обходное решение установки скрытого свойства enforcePareto
производит один портфель для целой границы эффективности, где любые другие решения не Оптимальны по Парето (который является тем, чем эффективные портфели должны быть).
Примером задачи оптимизации портфеля, которая испытывает затруднения в конечных точках границы эффективности, является эта стандартная проблема портфеля среднего отклонения (длинно-единственный с ограничением бюджета) со следующим средним значением, и ковариация актива возвращается:
m = [ 1; 2; 3 ]; C = [ 1 1 0; 1 1 0; 0 0 1 ]; p = Portfolio; p = Portfolio(p, 'assetmean', m, 'assetcovar', C); p = Portfolio(p, 'lowerbudget', 1, 'upperbudget', 1); p = Portfolio(p, 'lowerbound', 0); plotFrontier(p);
Чтобы работать вокруг этой проблемы, установите скрытое свойство объекта Портфеля для enforcePareto
. Это свойство дает оптимизатору команду выполнять дополнительные шаги, чтобы гарантировать Оптимальное по Парето решение. Это замедляет решатель, но гарантирует Оптимальное по Парето решение.
p.enforcePareto = true; plotFrontier(p);
'Conditional'
BoundType
, MinNumAssets
, и MaxNumAssets
ОграниченияПри конфигурировании Portfolio
, PortfolioCVaR
, или PortfolioMAD
объект включать 'Conditional'
BoundType
(полунепрерывные) ограничения с помощью setBounds
или MinNumAssets
и MaxNumAssets
(кардинальность) ограничения с помощью setMinMaxNumAssets
, значения входных сигналов, которые вы подаете, могут привести к предупреждающим сообщениям.
LowerBound
Заданный как пустой или нульПри использовании setBounds
с BoundType
установите на 'Conditional'
и LowerBound
входной параметр пуст ([ ]
) или 0
, Conditional
связанный не является эффективным и является эквивалентным Simple
связанный.
AssetMean = [ 0.0101110; 0.0043532; 0.0137058 ]; AssetCovar = [ 0.00324625 0.00022983 0.00420395; 0.00022983 0.00049937 0.00019247; 0.00420395 0.00019247 0.00764097 ]; p = Portfolio('AssetMean', AssetMean, 'AssetCovar', AssetCovar, 'Budget', 1); p = setBounds(p, 0, 0.5, 'BoundType', 'Conditional'); p = setMinMaxNumAssets(p, 3, 3); estimateFrontier(p, 10)
Warning: Conditional bounds with 'LowerBound' as zero are equivalent to simple bounds. Consider either using strictly positive 'LowerBound' or 'simple' as the 'BoundType' instead. > In internal.finance.PortfolioMixedInteger/checkBoundType (line 46) In Portfolio/checkarguments (line 204) In Portfolio/setBounds (line 80) Warning: The solution may have less than 'MinNumAssets' assets with nonzero weight. To enforce 'MinNumAssets' requirement, set strictly positive lower conditional bounds. > In internal.finance.PortfolioMixedInteger/hasIntegerConstraints (line 44) In Portfolio/estimateFrontier (line 51) ans = Columns 1 through 8 0.5000 0.3555 0.3011 0.3299 0.3585 0.3873 0.4160 0.4448 0.5000 0.5000 0.4653 0.3987 0.3322 0.2655 0.1989 0.1323 0.0000 0.1445 0.2335 0.2714 0.3093 0.3472 0.3850 0.4229 Columns 9 through 10 0.4735 0.5000 0.0657 0 0.4608 0.5000
Во всех 10 оптимальных выделениях существуют выделения (первые и последние единицы), которые только имеют два актива, который находится в конфликте с MinNumAssets
ограничение, что должны быть выделены три актива. Также существует два предупреждения, которые на самом деле объясняют, что происходит. В этом случае, 'Conditional'
связанные ограничения заданы как xi
= 0 или
0
<= xi
<= 0.5 , которые внутренне моделируются как
0
*vi <=xi <=0.5
*vi, где vi является 0
или 1
, где 0
указывает не выделенный, и 1
указывает выделенный. Здесь, vi =1
, который все еще позволяет активу иметь вес 0
. Другими словами, установка LowerBound
как 0
или пустой, ясно не задает минимальное выделение для выделенного актива. Поэтому 0
взвешенный актив также рассматривается как выделенный актив. Чтобы зафиксировать это предупреждение, следуйте инструкциям в предупреждающем сообщении и установите LowerBound
значение, которое строго положительно.
AssetMean = [ 0.0101110; 0.0043532; 0.0137058 ]; AssetCovar = [ 0.00324625 0.00022983 0.00420395; 0.00022983 0.00049937 0.00019247; 0.00420395 0.00019247 0.00764097 ]; p = Portfolio('AssetMean', AssetMean, 'AssetCovar', AssetCovar, 'Budget', 1); p = setBounds(p, 0.3, 0.5, 'BoundType', 'Conditional'); p = setMinMaxNumAssets(p, 3, 3); estimateFrontier(p, 10)
ans = Columns 1 through 8 0.3000 0.3180 0.3353 0.3489 0.3580 0.3638 0.3694 0.3576 0.4000 0.3820 0.3642 0.3479 0.3333 0.3199 0.3067 0.3001 0.3000 0.3000 0.3005 0.3032 0.3088 0.3163 0.3240 0.3423 Columns 9 through 10 0.3289 0.3000 0.3000 0.3000 0.3711 0.4000
'BoundType'
Должно быть соответствующим с NumAssets
setBounds
дополнительный аргумент значения имени для 'BoundType'
должен быть задан для всех активов в Portfolio
, PortfolioCVaR
, или PortfolioMAD
объект. По умолчанию, 'BoundType'
'Simple'
и применяется ко всем активам. Используя setBounds
, можно принять решение задать 'BoundType'
для каждого актива. В этом случае, количество 'BoundType'
технические требования должны совпадать с количеством активов (NumAssets
) в Portfolio
, PortfolioCVaR
, или PortfolioMAD
объект. Следующий пример демонстрирует ошибку когда количество 'BoundType'
технические требования не совпадают с количеством активов в Portfolio
объект.
AssetMean = [ 0.0101110; 0.0043532; 0.0137058 ]; AssetCovar = [ 0.00324625 0.00022983 0.00420395; 0.00022983 0.00049937 0.00019247; 0.00420395 0.00019247 0.00764097 ]; p = Portfolio('AssetMean', AssetMean, 'AssetCovar', AssetCovar, 'Budget', 1); p = setBounds(p, 0.1, 0.5, 'BoundType',["simple"; "conditional"])
Cannot create bound constraints. Caused by: Error using internal.finance.PortfolioMixedInteger/checkBoundType (line 28) Length of 'BoundType' must be conformable with 'NumAssets'=3.
Чтобы откорректировать это, измените BoundType
включать три технических требований потому что Portfolio
объект имеет три актива.
AssetMean = [ 0.0101110; 0.0043532; 0.0137058 ]; AssetCovar = [ 0.00324625 0.00022983 0.00420395; 0.00022983 0.00049937 0.00019247; 0.00420395 0.00019247 0.00764097 ]; p = Portfolio('AssetMean', AssetMean, 'AssetCovar', AssetCovar, 'Budget', 1); p = setBounds(p, 0.1, 0.5, 'BoundType',["simple"; "conditional";"conditional"]) p.BoundType
p = Portfolio with properties: BuyCost: [] SellCost: [] RiskFreeRate: [] AssetMean: [3×1 double] AssetCovar: [3×3 double] TrackingError: [] TrackingPort: [] Turnover: [] BuyTurnover: [] SellTurnover: [] Name: [] NumAssets: 3 AssetList: [] InitPort: [] AInequality: [] bInequality: [] AEquality: [] bEquality: [] LowerBound: [3×1 double] UpperBound: [3×1 double] LowerBudget: 1 UpperBudget: 1 GroupMatrix: [] LowerGroup: [] UpperGroup: [] GroupA: [] GroupB: [] LowerRatio: [] UpperRatio: [] BoundType: [3×1 categorical] MinNumAssets: [] MaxNumAssets: [] ans = 3×1 categorical array simple conditional conditional
'BoundType'
, 'MinNumAssets'
, 'MaxNumAssets'
ОграниченияКогда ни одно из ограничений от 'BoundType'
, 'MinNumAssets'
, или 'MaxNumAssets'
активны, избыточные ограничения от 'BoundType'
, 'MinNumAssets'
, 'MaxNumAssets'
предупреждение происходит. Это происходит, когда вы явным образом используете setBounds
и setMinMaxNumAssets
но со значениями, которые неактивны. Таким образом, 'Conditional'
BoundType
имеет LowerBound
= [ ]
или 0
, 'MinNumAssets'
0
, или 'MaxNumAssets'
то же значение как NumAssets
. Другими словами, если какой-либо из этих трех будет активен, предупреждение не обнаружится при использовании estimate
функции или plotFrontier
. Следующий двум примерам показывает объяснение.
Первый пример когда BoundType
явным образом установлен как 'Conditional'
но LowerBound
0
, и никакой 'MinNumAssets'
и 'MaxNumAssets'
ограничения заданы с помощью setMinMaxNumAssets
.
AssetMean = [ 0.0101110; 0.0043532; 0.0137058 ]; AssetCovar = [ 0.00324625 0.00022983 0.00420395; 0.00022983 0.00049937 0.00019247; 0.00420395 0.00019247 0.00764097 ]; p = Portfolio('AssetMean', AssetMean, 'AssetCovar', AssetCovar, 'Budget', 1); p = setBounds(p, 0, 0.5, 'BoundType', 'Conditional'); estimateFrontier(p, 10)
Warning: Redundant constraints from 'BoundType', 'MinNumAssets', 'MaxNumAssets'. > In internal.finance.PortfolioMixedInteger/hasIntegerConstraints (line 24) In Portfolio/estimateFrontier (line 51) ans = Columns 1 through 8 0.5000 0.3555 0.3011 0.3299 0.3586 0.3873 0.4160 0.4448 0.5000 0.5000 0.4653 0.3987 0.3321 0.2655 0.1989 0.1323 0 0.1445 0.2335 0.2714 0.3093 0.3471 0.3850 0.4229 Columns 9 through 10 0.4735 0.5000 0.0657 0 0.4608 0.5000
Второй пример - когда вы явным образом устанавливаете эти три ограничения, но все с неактивными значениями. В этом примере, BoundType
'Conditional'
и LowerBound
0
, таким образом определение неэффективного 'Conditional'
BoundType
ограничения и 'MinNumAssets'
и 'MaxNumAssets'
значениями является 0
и 3
, соответственно. setMinMaxNumAssets
функция задает неэффективный 'MinNumAssets'
и 'MaxNumAssets'
ограничения.
AssetMean = [ 0.0101110; 0.0043532; 0.0137058 ]; AssetCovar = [ 0.00324625 0.00022983 0.00420395; 0.00022983 0.00049937 0.00019247; 0.00420395 0.00019247 0.00764097 ]; p = Portfolio('AssetMean', AssetMean, 'AssetCovar', AssetCovar, 'Budget', 1); p = setBounds(p, 0, 0.5, 'BoundType', 'Conditional'); p = setMinMaxNumAssets(p, 0, 3); estimateFrontier(p, 10)
Warning: Redundant constraints from 'BoundType', 'MinNumAssets', 'MaxNumAssets'. > In internal.finance.PortfolioMixedInteger/hasIntegerConstraints (line 24) In Portfolio/estimateFrontier (line 51) ans = Columns 1 through 8 0.5000 0.3555 0.3011 0.3299 0.3586 0.3873 0.4160 0.4448 0.5000 0.5000 0.4653 0.3987 0.3321 0.2655 0.1989 0.1323 0 0.1445 0.2335 0.2714 0.3093 0.3471 0.3850 0.4229 Columns 9 through 10 0.4735 0.5000 0.0657 0 0.4608 0.5000
'BoundType'
, 'MinNumAssets'
, 'MaxNumAssets'
Portfolio
, PortfolioCVaR
, или PortfolioMAD
объект выполняет валидации всех ограничений, которые вы устанавливаете прежде, чем решить любые определенные задачи оптимизации. Portfolio
, PortfolioCVaR
, или PortfolioMAD
объект сначала рассматривает все ограничения кроме 'Conditional'
BoundType
, 'MinNumAssets'
, и 'MaxNumAssets'
и выдает ошибку сообщение, если они не совместимы. Затем Portfolio
, PortfolioCVaR
, или PortfolioMAD
объект добавляет эти три ограничения, чтобы проверять, совместимы ли они с уже проверенными ограничениями. Это разделение является естественным потому что 'Conditional'
BoundType
, 'MinNumAssets'
, и 'MaxNumAssets'
потребуйте дополнительных бинарных переменных в математической формулировке, которая приводит к MINLP, в то время как для других ограничений только нужны непрерывные переменные. Можно следовать сообщениям об ошибке, чтобы проверять, когда неосуществимая проблема происходит, и примите меры, чтобы зафиксировать ограничения.
Один возможный сценарий когда BoundType
'Conditional'
и Группы заданы для Portfolio
объект. В этом случае определения Группы находятся самостоятельно в конфликте. Следовательно, 'Conditional'
связанное ограничение не может быть применено при выполнении estimateFrontierLimits
.
AssetMean = [ 0.0101110; 0.0043532; 0.0137058 ]; AssetCovar = [ 0.00324625 0.00022983 0.00420395; 0.00022983 0.00049937 0.00019247; 0.00420395 0.00019247 0.00764097 ]; p = Portfolio('AssetMean', AssetMean, 'AssetCovar', AssetCovar, 'Budget', 1); p = setBounds(p, 0.1, 0.5, 'BoundType','Conditional'); p = setGroups(p, [1,1,0], 0.3, 0.5); p = addGroups(p, [0,1,0], 0.6, 0.7); pwgt = estimateFrontierLimits(p)
Error using Portfolio/buildMixedIntegerProblem (line 31) Infeasible portfolio problem prior to considering 'BoundType', 'MinNumAssets', 'MaxNumAssets'. Verify if constraints from groups, bounds, group ratios, inequality, equality, etc. are compatible. Error in Portfolio/estimateFrontierLimits>int_frontierLimits (line 93) ProbStruct = buildMixedIntegerProblem(obj); Error in Portfolio/estimateFrontierLimits (line 73) pwgt = int_frontierLimits(obj, minsolution, maxsolution);
Чтобы откорректировать эту ошибку, измените LowerGroup
в addGroups
функционируйте, чтобы также быть 0.3
совпадать с GroupMatrix
введите от setGroups
.
AssetMean = [ 0.0101110; 0.0043532; 0.0137058 ]; AssetCovar = [ 0.00324625 0.00022983 0.00420395; 0.00022983 0.00049937 0.00019247; 0.00420395 0.00019247 0.00764097 ]; p = Portfolio('AssetMean', AssetMean, 'AssetCovar', AssetCovar, 'Budget', 1); p = setBounds(p, 0.1, 0.5, 'BoundType','Conditional'); p = setGroups(p, [1,1,0], 0.3, 0.5); p = addGroups(p, [0,1,0], 0.3, 0.7); pwgt = estimateFrontierLimits(p)
pwgt = 0 0.2000 0.5000 0.3000 0.5000 0.5000
Второй возможный сценарий когда BoundType
'Conditional'
и setEquality
функция используется с bEquality
набор параметра к 0.04
. Это устанавливает ограничение равенства иметь x 1 + x 3 = 0.04
. В то же время, setBounds
также установите полунепрерывные ограничения иметь xi = 0
или 0.1
<= xi <= 2.5
, которые приводят к x 1 + x
3 = 0 или
0.1
<= x 1 + x 3 <= 5
. Полунепрерывные ограничения не совместимы с ограничением равенства, потому что нет никакого способа получить x
1 + x
3, чтобы равняться 0.04
. Поэтому сообщение об ошибке отображено.
AssetMean = [ 0.05; 0.1; 0.12; 0.18 ]; AssetCovar = [ 0.0064 0.00408 0.00192 0; 0.00408 0.0289 0.0204 0.0119; 0.00192 0.0204 0.0576 0.0336; 0 0.0119 0.0336 0.1225 ]; p = Portfolio('AssetMean', AssetMean, 'AssetCovar', AssetCovar, 'Budget', 1); A = [ 1 0 1 0 ]; b = 0.04; p = setEquality(p, A, b); p = setBounds(p, 0.1, 2.5, 'BoundType','Conditional'); p = setMinMaxNumAssets(p, 2, 2); pwgt = estimateFrontierLimits(p)
Error using Portfolio/buildMixedIntegerProblem (line 109) Infeasible portfolio problem when considering 'BoundType', 'MinNumAssets', 'MaxNumAssets'. Verify if these are compatible with constraints from groups, bounds, group ratios, inequality, equality, etc. Error in Portfolio/estimateFrontierLimits>int_frontierLimits (line 93) ProbStruct = buildMixedIntegerProblem(obj); Error in Portfolio/estimateFrontierLimits (line 73) pwgt = int_frontierLimits(obj, minsolution, maxsolution);
Чтобы откорректировать эту ошибку, измените bEquality
параметр от 0.04
к .4
.
AssetMean = [ 0.05; 0.1; 0.12; 0.18 ]; AssetCovar = [ 0.0064 0.00408 0.00192 0; 0.00408 0.0289 0.0204 0.0119; 0.00192 0.0204 0.0576 0.0336; 0 0.0119 0.0336 0.1225 ]; p = Portfolio('AssetMean', AssetMean, 'AssetCovar', AssetCovar, 'Budget', 1); A = [ 1 0 1 0 ]; b = 0.4; p = setEquality(p, A, b); p = setBounds(p, 0.1, 2.5, 'BoundType','Conditional'); p = setMinMaxNumAssets(p, 2, 2); pwgt = estimateFrontierLimits(p)
pwgt = 0.4000 0 0.6000 0 0 0.4000 0 0.6000
Эта ошибка происходит, когда вы используете Portfolio
, PortfolioCVaR
, или PortfolioMAD
возразите и нет никакого UpperBound
заданный в setBounds
и вы используете setMinMaxNumAssets
. В этом случае это формулируется как проблема частично-целочисленного программирования и UpperBound
требуется, чтобы осуществлять MinNumAssets
и MaxNumAssets
ограничения.
Оптимизатор сначала пытается оценить верхнюю границу каждого актива, на основе всех заданных ограничений. Если UpperBound
не может быть найден, сообщение об ошибке происходит, который дает вам команду устанавливать явный UpperBound
. В большинстве случаев пока вы устанавливаете некоторые верхние границы на проблему с помощью любого set
функция, оптимизатор может успешно найти хорошую оценку.
AssetMean = [ 0.05; 0.1; 0.12; 0.18 ]; AssetCovar = [ 0.0064 0.00408 0.00192 0; 0.00408 0.0289 0.0204 0.0119; 0.00192 0.0204 0.0576 0.0336; 0 0.0119 0.0336 0.1225 ]; p = Portfolio('AssetMean', AssetMean, 'AssetCovar', AssetCovar); p = setBounds(p, 0.1, 'BoundType','Conditional'); p = setGroups(p, [1,1,1,0], 0.3, 0.5); p = setMinMaxNumAssets(p, 3, 3); pwgt = estimateFrontierLimits(p)
Error using Portfolio/buildMixedIntegerProblem (line 42) Unbounded portfolio problem. Upper bounds cannot be inferred from the existing constraints. Set finite upper bounds using 'setBounds'. Error in Portfolio/estimateFrontierLimits>int_frontierLimits (line 93) ProbStruct = buildMixedIntegerProblem(obj); Error in Portfolio/estimateFrontierLimits (line 73) pwgt = int_frontierLimits(obj, minsolution, maxsolution);
Чтобы откорректировать эту ошибку, задайте UpperBound
значение для setBounds
.
AssetMean = [ 0.05; 0.1; 0.12; 0.18 ]; AssetCovar = [ 0.0064 0.00408 0.00192 0; 0.00408 0.0289 0.0204 0.0119; 0.00192 0.0204 0.0576 0.0336; 0 0.0119 0.0336 0.1225 ]; p = Portfolio('AssetMean', AssetMean, 'AssetCovar', AssetCovar); p = setBounds(p, 0.1, .9, 'BoundType','Conditional'); p = setGroups(p, [1,1,1,0], 0.3, 0.5); p = setMinMaxNumAssets(p, 3, 3); pwgt = estimateFrontierLimits(p)
pwgt = 0.1000 0 0.1000 0.1000 0.1000 0.4000 0 0.9000
MaxNumAssets
ЗаданныйПри использовании Portfolio
, PortfolioCVaR
, или PortfolioMAD
объект, оптимальное выделение w
может содержать некоторые очень маленькие значения, который приводит к sum
W
>0) больше, чем
MaxNumAssets
, даже при том, что MaxNumAssets
ограничение задано с помощью setMinMaxNumAssets
. Например, в следующем коде, когда setMinMaxNumAssets
используется, чтобы установить MaxNumAssets
к 15
, sum
W
>0) указывает, что существует
19
активы. Тщательное изучение весов показывает, что веса чрезвычайно малы и на самом деле 0.
T = readtable('dowPortfolio.xlsx'); symbol = T.Properties.VariableNames(3:end); assetReturn = tick2ret(T{:,3:end}); p = Portfolio('AssetList', symbol, 'budget', 1); p = setMinMaxNumAssets(p, 10, 15); p = estimateAssetMoments(p,assetReturn); p = setBounds(p,0.01,0.5,'BoundType','Conditional','NumAssets',30); p = setTrackingError(p,0.05,ones(1, p.NumAssets)/p.NumAssets); w = estimateFrontierLimits(p,'min'); % minimum risk portfolio sum(w>0) % Number of assets that are allocated in the optimal portfolio w(w<eps) % Check the weights of the very small weighted assets
ans = 19 ans = 1.0e-20 * -0.0000 0 0 0.0293 0 0.3626 0.2494 0 0.0926 -0.0000 0 0.0020 0 0 0 0
Эта ситуация только происходит когда OuterApproximation
алгоритм используется с setSolverMINLP
решить задачу оптимизации портфеля MINLP. OuterApproximation
внутренне фиксирует последние решенные целочисленные переменные и запускает NLP с quadprog
или fmincon
, который вводит числовые проблемы и приводит к весам, которые являются очень близко к 0.
Если вы не хотите иметь дело с очень маленькими значениями, можно использовать setSolverMINLP
выбрать различный алгоритм. В этом примере, 'TrustRegionCP'
алгоритм задан.
T = readtable('dowPortfolio.xlsx'); symbol = T.Properties.VariableNames(3:end); assetReturn = tick2ret(T{:,3:end}); p = Portfolio('AssetList', symbol, 'budget', 1); p = setMinMaxNumAssets(p, 10, 15); p = estimateAssetMoments(p,assetReturn); p = setBounds(p,0.01,0.5,'BoundType','Conditional','NumAssets',30); p = setTrackingError(p,0.05,ones(1, p.NumAssets)/p.NumAssets); p = setSolverMINLP(p,'TrustRegionCP'); w = estimateFrontierLimits(p,'min'); % minimum risk portfolio sum(w>0) % Number of assets that are allocated in the optimal portfolio w(w<eps) % The weights of the very small weighted assets are strictly zeros
ans = 14 ans = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Portfolio
| checkFeasibility
| estimateAssetMoments
| setBounds
| setMinMaxNumAssets