Если объект 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
, но со значениями, которые неактивны. Таким образом,
BoundType
'Conditional'
имеет 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
требуется, чтобы осуществлять ограничения MaxNumAssets
и MinNumAssets
.
Оптимизатор сначала пытается оценить верхнюю границу каждого актива, на основе всех заданных ограничений. Если 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