setSolverMINLP

Выберите целое число смешанного решателя нелинейного программирования (MINLP) для оптимизации портфеля

Описание

пример

obj = setSolverMINLP(obj,solverTypeMINLP) выбирает решение смешанного целочисленного нелинейного программирования (MINLP) и позволяет вам задать связанные опции решателя для оптимизации портфеля для Portfolio, PortfolioCVaR, или PortfolioMAD объект.

Когда любая одна или любая комбинация 'Conditional' BoundType, MinNumAssets, или MaxNumAssets ограничения активны, задача портфеля сформулирована путем добавления NumAssets двоичные переменные. Двоичная переменная 0 указывает, что актив не инвестирован, а двоичная переменная 1 указывает, что актив инвестирован. Для получения дополнительной информации об использовании 'Conditional' BoundType, см. setBounds. Для получения дополнительной информации об указании MinNumAssets и MaxNumAssets, см. setMinMaxNumAssets.

Если вы используете estimate функции со Portfolio, PortfolioCVaR, или PortfolioMAD объект, для которого любое из 'Conditional' BoundType, MinNumAssets, или MaxNumAssets ограничения активны, автоматически используется решатель MINLP. Для получения дополнительной информации о MINLP, смотрите Алгоритмы.

пример

obj = setSolverMINLP(___,Name,Value) задает опции, использующие один или несколько аргументы пары "имя-значение" в дополнение к входным параметрам в предыдущем синтаксисе.

Примеры

свернуть все

Сконфигурируйте решатель MINLP для портфеля с тремя активами, для которого у вас есть среднее и ковариационное значения возвратов активов.

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);

При работе с Portfolio объект, использование setBounds с 'Conditional'BoundType ограничение для задания xi = 0 или 0.02 <= xi <= 0.5 для всех i = 1... NumAssets.

p = setBounds(p, 0.02, 0.5,'BoundType', 'Conditional', 'NumAssets', 3); 

При работе с Portfolio объект, использование setMinMaxNumAssets функция для настройки MinNumAssets и MaxNumAssets ограничения для портфеля. Это устанавливает предельные ограничения для Portfolio объект, где общее количество выделенных активов, удовлетворяющих ограничениям, находится между MinNumAssets и MaxNumAssets. Настройка MinNumAssets = MaxNumAssets = 2, указывает, что только два из трех активов инвестируются в портфель.

p = setMinMaxNumAssets(p, 2, 2); 

Три различных решателя MINLP (OuterApproximation, ExtendedCP, TrustRegionCP) использовать метод секущей плоскости. Используйте setSolverMINLP функция для конфигурирования OuterApproximation решатель и опции.

pint = setSolverMINLP(p,'OuterApproximation', 'NonlinearScalingFactor', 1e4, 'Display', 'iter', 'CutGeneration', 'basic');
pint.solverTypeMINLP
ans = 
'OuterApproximation'
pint.solverOptionsMINLP
ans = struct with fields:
                           MaxIterations: 1000
                    AbsoluteGapTolerance: 1.0000e-07
                    RelativeGapTolerance: 1.0000e-05
                  NonlinearScalingFactor: 10000
                  ObjectiveScalingFactor: 1000
                                 Display: 'iter'
                           CutGeneration: 'basic'
                MaxIterationsInactiveCut: 30
                      ActiveCutTolerance: 1.0000e-07
                  IntMasterSolverOptions: [1x1 optim.options.Intlinprog]
    NumIterationsEarlyIntegerConvergence: 30

Можно также сконфигурировать опции для intlinprog, который является Главным решателем для смешанных целочисленных задач линейного программирования в решателе MINLP.

pint = setSolverMINLP(p,'OuterApproximation', 'IntMasterSolverOptions', optimoptions('intlinprog','Display','off'));
pint.solverOptionsMINLP.IntMasterSolverOptions
ans = 
  intlinprog options:

   Set properties:
                          Display: 'off'

   Default properties:
             AbsoluteGapTolerance: 0
                       BranchRule: 'reliability'
              ConstraintTolerance: 1.0000e-04
                    CutGeneration: 'basic'
                 CutMaxIterations: 10
                       Heuristics: 'basic'
               HeuristicsMaxNodes: 50
                IntegerPreprocess: 'basic'
                 IntegerTolerance: 1.0000e-05
                  LPMaxIterations: 'max(30000,10*(numberOfEqualities+numberOfInequalities+numberOfVariables))'
            LPOptimalityTolerance: 1.0000e-07
                MaxFeasiblePoints: Inf
                         MaxNodes: 10000000
                          MaxTime: 7200
                    NodeSelection: 'simplebestproj'
                  ObjectiveCutOff: Inf
    ObjectiveImprovementThreshold: 0
                        OutputFcn: []
                          PlotFcn: []
             RelativeGapTolerance: 1.0000e-04
                  RootLPAlgorithm: 'dual-simplex'
              RootLPMaxIterations: 'max(30000,10*(numberOfEqualities+numberOfInequalities+numberOfVariables))'

Сконфигурируйте решатель MINLP для 12 портфеля активов, который использует полунепрерывные ограничения и ограничения кардинальности.

load CAPMuniverse
p = PortfolioCVaR('AssetList',Assets(1:12));
p = simulateNormalScenariosByData(p, Data(:,1:12), 20000 ,'missingdata',true);
p = setProbabilityLevel(p, 0.95);

При работе с PortfolioCVaR объект, setMinMaxNumAssets функция позволяет вам установить пределы на количество вложенных активов. В следующем примере указывается, что как минимум пять активов и как минимум 10 активов должны быть инвестированы с помощью setMinMaxNumAssets и инвестиции должны быть более 4% и менее 45% с использованием setBounds.

p = setMinMaxNumAssets(p, 5, 10);  
p = setBounds(p, 0.04, 0.45, 'BoundType', 'conditional');  

Три различных решателя MINLP (OuterApproximation, ExtendedCP, TrustRegionCP) использовать метод секущей плоскости. Используйте setSolverMINLP функция для конфигурирования OuterApproximation решатель и опции.

pint = setSolverMINLP(p,'OuterApproximation', 'NonlinearScalingFactor', 1e4, 'Display', 'iter', 'CutGeneration', 'basic');
pint.solverTypeMINLP
ans = 
'OuterApproximation'
pint.solverOptionsMINLP
ans = struct with fields:
                           MaxIterations: 1000
                    AbsoluteGapTolerance: 1.0000e-07
                    RelativeGapTolerance: 1.0000e-05
                  NonlinearScalingFactor: 10000
                  ObjectiveScalingFactor: 1000
                                 Display: 'iter'
                           CutGeneration: 'basic'
                MaxIterationsInactiveCut: 30
                      ActiveCutTolerance: 1.0000e-07
                  IntMasterSolverOptions: [1x1 optim.options.Intlinprog]
    NumIterationsEarlyIntegerConvergence: 30

Можно также сконфигурировать опции для intlinprog, который является Главным решателем для смешанных целочисленных задач линейного программирования в решателе MINLP.

pint = setSolverMINLP(p,'OuterApproximation', 'IntMasterSolverOptions', optimoptions('intlinprog','Display','off'));
pint.solverOptionsMINLP.IntMasterSolverOptions
ans = 
  intlinprog options:

   Set properties:
                          Display: 'off'

   Default properties:
             AbsoluteGapTolerance: 0
                       BranchRule: 'reliability'
              ConstraintTolerance: 1.0000e-04
                    CutGeneration: 'basic'
                 CutMaxIterations: 10
                       Heuristics: 'basic'
               HeuristicsMaxNodes: 50
                IntegerPreprocess: 'basic'
                 IntegerTolerance: 1.0000e-05
                  LPMaxIterations: 'max(30000,10*(numberOfEqualities+numberOfInequalities+numberOfVariables))'
            LPOptimalityTolerance: 1.0000e-07
                MaxFeasiblePoints: Inf
                         MaxNodes: 10000000
                          MaxTime: 7200
                    NodeSelection: 'simplebestproj'
                  ObjectiveCutOff: Inf
    ObjectiveImprovementThreshold: 0
                        OutputFcn: []
                          PlotFcn: []
             RelativeGapTolerance: 1.0000e-04
                  RootLPAlgorithm: 'dual-simplex'
              RootLPMaxIterations: 'max(30000,10*(numberOfEqualities+numberOfInequalities+numberOfVariables))'

Сконфигурируйте решатель MINLP для 12 портфеля активов, который использует полунепрерывные ограничения и ограничения кардинальности.

load CAPMuniverse
p = PortfolioMAD('AssetList',Assets(1:12));
p = simulateNormalScenariosByData(p, Data(:,1:12), 20000 ,'missingdata',true);

При работе с PortfolioMAD объект, setMinMaxNumAssets функция позволяет вам установить пределы на количество вложенных активов. В следующем примере указывается, что как минимум пять активов и как минимум 10 активов должны быть инвестированы с помощью setMinMaxNumAssets и инвестиции должны быть более 4% и менее 45% с использованием setBounds.

p = setMinMaxNumAssets(p, 5, 10);  
p = setBounds(p, 0.04, 0.45, 'BoundType', 'conditional');  

Три различных решателя MINLP (OuterApproximation, ExtendedCP, TrustRegionCP) использовать метод секущей плоскости. Используйте setSolverMINLP функция для конфигурирования OuterApproximation решатель и опции.

pint = setSolverMINLP(p,'OuterApproximation', 'NonlinearScalingFactor', 1e4, 'Display', 'iter', 'CutGeneration', 'basic');
pint.solverTypeMINLP
ans = 
'OuterApproximation'
pint.solverOptionsMINLP
ans = struct with fields:
                           MaxIterations: 1000
                    AbsoluteGapTolerance: 1.0000e-07
                    RelativeGapTolerance: 1.0000e-05
                  NonlinearScalingFactor: 10000
                  ObjectiveScalingFactor: 1000
                                 Display: 'iter'
                           CutGeneration: 'basic'
                MaxIterationsInactiveCut: 30
                      ActiveCutTolerance: 1.0000e-07
                  IntMasterSolverOptions: [1x1 optim.options.Intlinprog]
    NumIterationsEarlyIntegerConvergence: 30

Можно также сконфигурировать опции для intlinprog, который является Главным решателем для смешанных целочисленных задач линейного программирования в решателе MINLP.

pint = setSolverMINLP(p,'OuterApproximation', 'IntMasterSolverOptions', optimoptions('intlinprog','Display','off'));
pint.solverOptionsMINLP.IntMasterSolverOptions
ans = 
  intlinprog options:

   Set properties:
                          Display: 'off'

   Default properties:
             AbsoluteGapTolerance: 0
                       BranchRule: 'reliability'
              ConstraintTolerance: 1.0000e-04
                    CutGeneration: 'basic'
                 CutMaxIterations: 10
                       Heuristics: 'basic'
               HeuristicsMaxNodes: 50
                IntegerPreprocess: 'basic'
                 IntegerTolerance: 1.0000e-05
                  LPMaxIterations: 'max(30000,10*(numberOfEqualities+numberOfInequalities+numberOfVariables))'
            LPOptimalityTolerance: 1.0000e-07
                MaxFeasiblePoints: Inf
                         MaxNodes: 10000000
                          MaxTime: 7200
                    NodeSelection: 'simplebestproj'
                  ObjectiveCutOff: Inf
    ObjectiveImprovementThreshold: 0
                        OutputFcn: []
                          PlotFcn: []
             RelativeGapTolerance: 1.0000e-04
                  RootLPAlgorithm: 'dual-simplex'
              RootLPMaxIterations: 'max(30000,10*(numberOfEqualities+numberOfInequalities+numberOfVariables))'

Входные параметры

свернуть все

Объект для портфеля, заданный с помощью Portfolio, PortfolioCVaR, или PortfolioMAD объект. Для получения дополнительной информации о создании объекта портфеля см.

Типы данных: object

Решатель MINLP для оптимизации портфеля, когда любая одна или любая комбинация 'Conditional' BoundType, MinNumAssets, или MaxNumAssets ограничения активны. Задайте solverTypeMINLP использование вектора символов или строки со значением 'OuterApproximation', 'ExtendedCP', или 'TrustRegionCP'.

Для Portfolio объект, значение по умолчанию solverTypeMINLP является 'OuterApproximation' со следующими настройками по умолчанию для пар "имя-значение" для setSolverMINLP:

Для PortfolioCVaR и PortfolioMAD объект, значение по умолчанию solverTypeMINLP является 'TrustRegionCP' со следующими настройками по умолчанию для пар "имя-значение" для setSolverMINLP:

  • MaxIterations1000

  • AbsoluteGapTolerance1.0000e-07

  • RelativeGapTolerance1.0000e-05

  • Display'off'

  • NonlinearScalingFactor1000

  • ObjectiveScalingFactor1000

  • CutGeneration'basic'

  • MaxIterationsInactiveCut30

  • NumIterationsEarlyIntegerConvergence30

  • ActiveCutTolerance1.0000e-07

  • TrustRegionStartIteration - 2

  • ShrinkRatio0.75

  • DeltaLimit1

  • IntMasterSolverOptionsoptimoptions('intlinprog','Algorithm','Dual-Simplex','Display','off')

Типы данных: char | string

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: p = setSolverMINLP(p,'ExtendedCP','MaxIterations',10000,'NonlinearScalingFactor',1000)

Максимальное количество итераций, заданное как разделенная разделенными запятой парами, состоящая из 'MaxIterations' и неотрицательное целое значение.

Типы данных: double

Масштабный коэффициент для нелинейной функции и градиента, заданный как разделенная разделенными запятой парами, состоящая из 'NonlinearScalingFactor' и неотрицательное действительное значение.

Типы данных: double

Масштабирует целевую функцию, используемую MasterSolver, на множитель, заданный как разделенная разделенными запятой парами, состоящая из 'ObjectiveScalingFactor' и неотрицательное действительное значение.

Типы данных: double

Решатель останавливается, если абсолютное различие между аппроксимированным значением нелинейной функции и ее истинным значением меньше или равна AbsoluteGapTolerance. AbsoluteGapTolerance задается как разделенная разделенными запятой парами, состоящая из 'AbsoluteGapTolerance' и неотрицательное действительное значение.

Типы данных: double

Решатель останавливается, если относительное различие между аппроксимированным значением нелинейной функции и ее истинным значением меньше или равна RelativeGapTolerance. RelativeGapTolerance задается как разделенная разделенными запятой парами, состоящая из 'AbsoluteGapTolerance' и неотрицательное действительное значение.

Типы данных: double

Отобразите формат вывода, заданный как разделенная разделенными запятой парами, состоящая из 'Display' и вектор символов со значением:

  • 'off' - Не отображать выход

  • 'iter' - Отображаемый вывод при каждой итерации и техническом выходном сообщении

  • 'final' - Отображать только окончательный выход и окончательное техническое выходное сообщение

Типы данных: char

Спецификация реза, заданная как разделенная разделенными запятой парами, состоящая из 'CutGeneration' и вектор символов с одним из следующих значений:

  • 'midway' - Добавьте новый вырез в середине между последними и предыдущими найденными решениями.

  • 'basic' - Добавьте новую вырезку в самое последнее найденное решение.

Типы данных: char

Удаляет ограничения, которые не активны для последнего MaxIterationsInactiveCut итерации, заданные как разделенная разделенными запятой парами, состоящая из 'MaxIterationsInactiveCut' и неотрицательное целое значение. Как правило, MaxIterationsInactiveCut значение больше 10.

Типы данных: double

Когда целое число переменной стабильно для последнего NumIterationsEarlyIntegerConvergence итерации, решатель вычисляет конечную NLP с помощью последнего целочисленного решения переменной в MILP. NumIterationsEarlyIntegerConvergence задается как разделенная разделенными запятой парами, состоящая из 'NumIterationsEarlyIntegerConvergence' и неотрицательное целое значение.

Типы данных: double

Определяет, активны ли вырезы, задается как разделенная разделенными запятой парами, состоящая из 'ActiveCutTolerance' и неотрицательное действительное значение. ActiveCutTolerance используется вместе с MaxIterationsInactiveCut для принятия решения о том, какие вырезы следует удалить из подпрограммы MILP.

Типы данных: double

Решатель начинает применять эвристическую область доверия в TrustRegionStartIteration, заданная как разделенная разделенными запятой парами, состоящая из 'TrustRegionStartIteration' и неотрицательное целое число.

Примечание

The TrustRegionStartIteration аргумент пары "имя-значение" может использоваться только с solverTypeMINLP от 'TrustRegionCP'.

Типы данных: double

Отношение к размеру усадки доверительной области, заданное как разделенная разделенными запятой парами, состоящая из 'ShrinkRatio' и неотрицательное действительное значение между 0 и 1. Если приближенные функции не имеют хорошего согласия в предыдущих итерациях, алгоритм использует это отношение, чтобы уменьшить размер доверительной области.

Примечание

The ShrinkRatio аргумент пары "имя-значение" может использоваться только с solverTypeMINLP от 'TrustRegionCP'.

Типы данных: double

Доверительная область аппроксимированных функций ограничена DeltaLimit во время итераций, заданных как разделенная разделенными запятой парами, состоящая из 'DeltaLimit' и неотрицательное действительное значение. Для задач портфеля, 1 обычно является хорошим значением для DeltaLimit, поскольку веса портфеля находятся между 0 и 1.

Примечание

The DeltaLimit аргумент пары "имя-значение" может использоваться только с solverTypeMINLP от 'TrustRegionCP'.

Типы данных: double

Опции для главного решателя intlinprog, заданная как разделенная разделенными запятой парами, состоящая из 'IntMasterSolverOptions' и optimoptions объект.

Пример: 'IntMasterSolverOptions', optimoptions('intlinprog','Display','off')

Выходные аргументы

свернуть все

Обновленный объект портфеля, возвращенный как Portfolio, PortfolioCVaR, или PortfolioMAD объект.

Подробнее о

свернуть все

Решатели MINLP

Все три решателя MINLP ('OuterApproximation', 'ExtendedCP', и 'TrustRegionCP') определяется solverTypeMINLP полагаться на концепцию секущей плоскости.

Эти решатели MINLP аппроксимируют нелинейную выпуклую функцию f (x) кусочно-линейным приближением, которое является последовательностью линейных разрезов вокруг исходной функции. Таким образом, исходная МИНЛП сводится к последовательности подпрограмм MILP, каждая из которых с более уточненным приближением к f (x), чем предыдущие MILP, и приводит к более оптимальному решению. Процесс продолжается до тех пор, пока решение, найденное из MILP, не сходится к значению истинной функции в определенном допуске.

  • The 'ExtendedCP' решатель итеративно добавляет линейный разрез в последнем решении, найденном для аппроксимации f (x).

  • The 'OuterApproximation' решатель похож на 'ExtendedCP'но они отличаются тем, куда добавить разрез. Вместо использования решения из последней версии MILP, OuterApproximation использует значения целочисленных переменных из последнего решения MILP и исправляет их, чтобы уменьшить MINLP до нелинейной задачи программирования (NLP). Вырез добавляется в решении этой задачи NLP.

  • The 'TrustRegionCP' решатель является версией 'ExtendedCP' который изменяется для ускорения процесса оптимизации. В целом метод доверительной области использует модель, чтобы аппроксимировать истинную функцию в области при каждой итерации. В контексте решателя MINLP, модель является максимальным из всех добавленных сокращений. Истинная функция является нелинейной функцией f (x) в задаче оптимизации. Область модели обновляется на основе того, насколько хорошо модель аппроксимирует истинную функцию для итерации. Это приближение является сравнением предсказанного сокращения целевой функции с помощью модели и истинного сокращения.

Совет

Вы также можете использовать запись через точку, чтобы задать связанные опции пары "имя-значение".

obj = obj.setSolverMINLP(Name,Value);

Примечание

The solverTypeMINLP и solverOptionsMINLP невозможно задать свойства с помощью записи через точку, поскольку они являются скрытыми свойствами. Чтобы задать solverTypeMINLP и solverOptionsMINLP свойства, используйте setSolverMINLP функция непосредственно.

Алгоритмы

Когда любой, или любая комбинация 'Conditional' BoundType, MinNumAssets, или MaxNumAssets ограничения активны, задача портфеля сформулирована путем добавления NumAssets двоичные переменные. Двоичная переменная 0 указывает, что актив не инвестирован, а двоичная переменная 1 указывает, что актив инвестирован.

The MinNumAssets и MaxNumAssets ограничения сужают количество активных позиций в портфеле до области значений [minN, maxN]. В сложение, 'Conditional' BoundType ограничение состоит в том, чтобы установить нижнюю и верхнюю границы так, чтобы положение было либо 0 или лежит в области значений [minWgt, maxWgt]. Эти два типа ограничений включены в модель оптимизации портфеля путем введения n переменных, ν i, которые берут только двоичные значения 0 и 1 чтобы указать, инвестирован ли соответствующий актив (1) или не инвестировано (0). Здесь n общее количество активов, и ограничения могут быть сформулированы как следующие линейные ограничения неравенства:

minNi=1nυi maxNminWgtυiximaxWgtυi0υ1υi являются целыми числами

В этом уравнении minN и maxN являются представлениями для MinNumAsset и MaxNumAsset которые заданы с помощью setMinMaxNumAssets. Кроме того, minWgt и maxWgt являются представлениями для LowerBound и UpperBound которые заданы с помощью setBounds.

Задача оптимизации портфеля для минимизации отклонения портфеля, при условии достижения целевой ожидаемого возврата и некоторых дополнительных линейных ограничений на веса портфеля, сформулирована как

minimizex  xTHxs.t.  mTxTargetReturnAxbAeqx=beqlbxub

В этом уравнении H представляет ковариацию, а m представляет возвраты активов.

Задача оптимизации портфеля для максимизации возврата, удовлетворяющая верхнему пределу отклонения возврата портфеля и некоторым дополнительным линейным ограничениям весов портфеля, сформулирована как

maximizex  mTxs.t.  xTHxTargetRiskAxbAeqx=beqlbxub

Когда 'Conditional' BoundType, MinNumAssets, и MaxNumAssets к двум задачам оптимизации добавляются ограничения, задачи становятся:

minimizexυ  xTHxs.t.  mTxTargetReturnA'[x;υ]b'Aeqx=beqminNi=1nυimaxNminWgt(υi)ximaxWgt(υi)lbxub0υ1υi являются целыми числами

maximizexυ  mTxs.t.  xTHxTargetRiskA'[x;υ]b'Aeqx=beqminNi=1nυimaxNminWgtυiximaxWgt(υi)0υ1υi являются целыми числами

Ссылки

[1] Bonami, P., Kilinc, M., and J. Linderoth. «Алгоритмы и программное обеспечение для выпуклых смешанных целочисленных нелинейных программ». Технический отчет № 1664. Факультет компьютерных наук, Университет Висконсина-Мэдисона, 2009.

[2] Kelley, J. E. «The Cutting-Plane Method for Solving Convex Programs». Журнал Общества промышленной и прикладной математики. Том 8, № 4, 1960, с. 703-712.

[3] Линдерот, Дж. И С. Райт. Алгоритмы разложения для стохастического программирования на вычислительной сетке. Вычислительная оптимизация и приложения. Том 24, Выпуск 2-3, 2003, стр. 207-250.

[4] Nocedal, J., and S. Wright. Численная оптимизация. Нью-Йорк: Springer-Verlag, 1999.

Введенный в R2018b