Если 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.BoundTypep =
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. Это задает ограничение равенства для x1 + x3 = 0.04. В то же время, setBounds также установите полунепрерывные ограничения, чтобы иметь xi = 0 или 0.1 < = xi < =2.5, что приводит к x1 + x3 = 0 или 0.1 <= x1 + x3 <= 5. Полунепрерывные ограничения несовместимы с ограничением равенства, потому что нет возможности получить x1 + x3 равняться 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.9000MaxNumAssets УказанныйПри использовании 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
checkFeasibility | estimateAssetMoments | Portfolio | setBounds | setMinMaxNumAssets