Если a Portfolio
объект уничтожается при изменении, не забудьте передать существующий объект в Portfolio
объект, если вы хотите изменить его, в противном случае он создает новый объект. Для получения дополнительной информации см. раздел Создание объекта портфеля.
Если оптимизация прекращается с сообщением «bad pivot» от 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)
Чтобы обойти эту задачу, задайте скрытое свойство объекта Portfolio для 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
или пустой, не четко определяет минимальное распределение для распределенного актива. Поэтому a 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'
The Portfolio
, PortfolioCVaR
, или PortfolioMAD
объект выполняет валидации всех ограничений, которые вы задаете перед решением каких-либо конкретных задач оптимизации. The 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
<= <reservedrangesplaceholder2> 1 + <reservedrangesplaceholder1> 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
УказанныйПри использовании 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. The 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
checkFeasibility
| estimateAssetMoments
| Portfolio
| setBounds
| setMinMaxNumAssets