exponenta event banner

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' и неотрицательное целое число.

Примечание

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

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

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

Примечание

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

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

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

Примечание

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

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

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

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

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

свернуть все

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

Подробнее

свернуть все

Решатели MINLP

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

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

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

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

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

Совет

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

obj = obj.setSolverMINLP(Name,Value);

Примечание

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

Алгоритмы

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

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

minN≤∑i=1nυi≤ maxNminWgt∗υi≤xi≤maxWgt∗υi0≤υ≤1υi целые числа

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

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

minimizex  xTHxs.t.   mTx≥TargetReturnAx≤bAeqx=beqlb≤x≤ub

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

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

maximizex  mTxs.t.   xTHx≤TargetRiskAx≤bAeqx=beqlb≤x≤ub

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

minimizex  , xTHxs.t.   mTx≥TargetReturnA' [x; υ]  b'Aeqx=beqminN  i=1nυi≤maxNminWgt (υi) ≤xi≤maxWgt (υi)  lbxub0 υ  1υi являются целыми числами

maximizex  , mTxs.t.   xTHx≥TargetRiskA' [x; υ]  b'Aeqx=beqminN  i=1nυimaxNminWgt υi≤xi≤maxWgt (υi) 0 ≤υ  1υi являются целыми числами

Ссылки

[1] Бонами, П., Килинк, М. и Дж. Линдерот. «Алгоритмы и программное обеспечение для выпуклых смешанных целочисленных нелинейных программ». Технический отчет # 1664. Факультет компьютерных наук, Висконсинский университет, Мэдисон, 2009 год.

[2] Келли, Дж. Э. «Метод секущей плоскости для решения выпуклых программ». Журнал Общества промышленной и прикладной математики. Том 8, номер 4, 1960, стр. 703-712.

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

[4] Нокедал, Дж. и С. Райт. Численная оптимизация. Нью-Йорк: Спрингер-Верлаг, 1999.

Представлен в R2018b