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

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

Если a Portfolio объект уничтожается при изменении, не забудьте передать существующий объект в Portfolio объект, если вы хотите изменить его, в противном случае он создает новый объект. Для получения дополнительной информации см. раздел Создание объекта портфеля.

Ошибка оптимизации с сообщением «Bad Pivot»

Если оптимизация прекращается с сообщением «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 + x3 = 0 или 0.1 <= <reservedrangesplaceholder2> 1 + <reservedrangesplaceholder1> 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 может содержать некоторые очень маленькие значения, которые приводят к 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

См. также

| | | |

Похожие примеры

Подробнее о

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

Для просмотра документации необходимо авторизоваться на сайте