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

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

Если объект 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

Общее количество Весов Портфеля со Значением> 0 Больше, Чем Заданный 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

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

| | | |

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

Больше о

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