Результаты оптимизации портфеля Поиска и устранения проблем

Объект портфеля, уничтоженный при изменении

Если 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 + x3 = 0 или 0.1 <= x 1 + x 3 <= 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.9000

Общее количество Весов Портфеля со Значением> 0 Больше MaxNumAssets Заданный

При использовании Portfolio, PortfolioCVaR, или PortfolioMAD объект, оптимальное выделение w может содержать некоторые очень маленькие значения, который приводит к sumW>0) больше, чем MaxNumAssets, даже при том, что MaxNumAssets ограничение задано с помощью setMinMaxNumAssets. Например, в следующем коде, когда setMinMaxNumAssets используется, чтобы установить MaxNumAssets к 15, sumW>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

Смотрите также

| | | |

Связанные примеры

Больше о

Внешние веб-сайты