Choosing and Controlling the Solver for PortfolioMAD Optimizations
When solving portfolio optimizations for a PortfolioMAD object, you
are solving nonlinear optimization problems with either nonlinear objective or nonlinear
constraints. You can use 'TrustRegionCP' (default) or
'ExtendedCP' solvers that implement Kelley’s cutting plane method
(see Kelley [45] at Portfolio Optimization). Alternatively, you can use
fmincon and all variations of
fmincon from Optimization Toolbox™ are supported. When using fmincon as the solverType, 'sqp'
is the default algorithm for fmincon.
Using 'TrustRegionCP' and 'ExtendedCP' SolverTypes
The 'TrustRegionCP' and 'ExtendedCP' solvers
have options to control the number iterations and stopping tolerances. Moreover,
these solvers use linprog as the primary solver, and all
linprog options are supported using optimoptions structures. All these options are set using setSolver.
For example, you can use setSolver to increase the number of
iterations for 'TrustRegionCP':
p = PortfolioMAD; p = setSolver(p, 'TrustRegionCP', 'MaxIterations', 2000); display(p.solverType) display(p.solverOptions)
trustregioncp
MaxIterations: 2000
AbsoluteGapTolerance: 1.0000e-07
RelativeGapTolerance: 1.0000e-05
NonlinearScalingFactor: 1000
ObjectiveScalingFactor: 1000
MainSolverOptions: [1×1 optim.options.Linprog]
Display: 'off'
CutGeneration: 'basic'
MaxIterationsInactiveCut: 30
ActiveCutTolerance: 1.0000e-07
ShrinkRatio: 0.7500
TrustRegionStartIteration: 2
DeltaLimit: 1To change the primary solver algorithm to 'interior-point',
with no display, use setSolver to modify
'MainSolverOptions':
p = PortfolioMAD; options = optimoptions('linprog','Algorithm','interior-point','Display','off'); p = setSolver(p,'TrustRegionCP','MainSolverOptions',options); display(p.solverType) display(p.solverOptions) display(p.solverOptions.MainSolverOptions.Algorithm) display(p.solverOptions.MainSolverOptions.Display)
trustregioncp
MaxIterations: 1000
AbsoluteGapTolerance: 1.0000e-07
RelativeGapTolerance: 1.0000e-05
NonlinearScalingFactor: 1000
ObjectiveScalingFactor: 1000
MainSolverOptions: [1×1 optim.options.Linprog]
Display: 'off'
CutGeneration: 'basic'
MaxIterationsInactiveCut: 30
ActiveCutTolerance: 1.0000e-07
ShrinkRatio: 0.7500
TrustRegionStartIteration: 2
DeltaLimit: 1
interior-point
offUsing 'fmincon' SolverType
Unlike Optimization Toolbox which uses the 'interior-point' algorithm as the
default algorithm for fmincon, the portfolio optimization for
a PortfolioMAD object uses the 'sqp' algorithm
as the default. For details about fmincon and constrained nonlinear optimization algorithms and
options, see Constrained Nonlinear Optimization Algorithms.
To modify fmincon options for MAD portfolio
optimizations, use setSolver to set the hidden
properties solverType and solverOptions to
specify and control the solver. Since these solver properties are hidden, you cannot
set them using the PortfolioMAD object. The default for
the fmincon solver is the
'sqb' algorithm and no displayed output, so you do not need
to use setSolver to specify the
'sqp' algorithm for fmincon.
p = PortfolioMAD;
p = setSolver(p, 'fmincon');
display(p.solverOptions.Algorithm)
display(p.solverOptions.Display)sqp off
If you want to specify additional options associated with the fmincon solver, setSolver accepts these options as
name-value pair arguments. For example, if you want to use fmincon with the 'active-set' algorithm and with
displayed output, use setSolver
with:
p = PortfolioMAD; p = setSolver(p, 'fmincon', 'Algorithm', 'active-set', 'Display', 'final'); display(p.solverOptions)
fmincon options:
Options used by current Algorithm ('active-set'):
(Other available algorithms: 'interior-point', 'sqp', 'sqp-legacy', 'trust-region-reflective')
Set properties:
Algorithm: 'active-set'
Display: 'final'
Default properties:
ConstraintTolerance: 1.0000e-06
FiniteDifferenceStepSize: 'sqrt(eps)'
FiniteDifferenceType: 'forward'
FunctionTolerance: 1.0000e-06
MaxFunctionEvaluations: '100*numberOfVariables'
MaxIterations: 400
OptimalityTolerance: 1.0000e-06
OutputFcn: []
PlotFcn: []
SpecifyConstraintGradient: 0
SpecifyObjectiveGradient: 0
StepTolerance: 1.0000e-06
TypicalX: 'ones(numberOfVariables,1)'
UseParallel: 0Alternatively, the setSolver function accepts an
optimoptions object as the second
argument. For example, you can change the algorithm to
'active-set' with no displayed output as
follows:
p = PortfolioMAD; options = optimoptions('fmincon', 'Algorithm', 'active-set', 'Display', 'off'); p = setSolver(p, 'fmincon', options); display(p.solverOptions.Algorithm) display(p.solverOptions.Display)
active-set off
Using the Mixed Integer Nonlinear Programming (MINLP) Solver
The mixed integer nonlinear programming (MINLP) solver, configured using setSolverMINLP,
enables you to specify associated solver options for portfolio optimization for a
PortfolioMAD object. The MINLP solver
is used when any one, or any combination of 'Conditional'
BoundType, MinNumAssets, or
MaxNumAssets constraints are active, the portfolio problem is
formulated by adding NumAssets binary variables, where
0 indicates not invested, and 1 is
invested. For more information on using 'Conditional'
BoundType, see setBounds. For
more information on specifying MinNumAssets and
MaxNumAssets, see setMinMaxNumAssets.
When using the estimate functions with a
PortfolioMAD object where 'Conditional'
BoundType, MinNumAssets, or
MaxNumAssets constraints are active, the mixed integer
nonlinear programming (MINLP) solver is automatically used.
Solver Guidelines for PortfolioMAD Objects
The following table provides guidelines for using setSolver and setSolverMINLP.
| PortfolioMAD Problem | PortfolioMAD Function | Type of Optimization Problem | Main Solver | Helper Solver |
|---|---|---|---|---|
PortfolioMAD without active 'Conditional'
BoundType, MinNumAssets,
MaxNumAssets, or conditional budget
constraints | estimateFrontierByRisk | Optimizing a portfolio for a certain risk level introduces a nonlinear constraint. Therefore, this problem has a linear objective with linear and nonlinear constraints. | 'TrustRegionCP',
'ExtendedCP', or
'fmincon' using setSolver |
|
PortfolioMAD without active 'Conditional'
BoundType, MinNumAssets,
MaxNumAssets, or conditional budget
constraints | estimateFrontierByReturn | Nonlinear objective with linear constraints | 'TrustRegionCP',
'ExtendedCP', or
'fmincon' using setSolver |
|
PortfolioMAD without active 'Conditional'
BoundType, MinNumAssets,
MaxNumAssets, or conditional budget
constraints | estimateFrontierLimits | Nonlinear or linear objective with linear constraints | For For
| Not applicable |
PortfolioMAD with active 'Conditional'
BoundType, MinNumAssets,
MaxNumAssets, or conditional budget
constraints | estimateFrontierByRisk | The problem is formulated by introducing
NumAssets binary variables to indicate
whether the corresponding asset is invested or not. Therefore,
it requires a mixed integer nonlinear programming solver. Three
types of MINLP solvers are offered, see setSolverMINLP. | Mixed integer nonlinear programming solver (MINLP) using
setSolverMINLP | 'fmincon' is used when the
estimate functions reduce the problem
into NLP. This solver is configured through setSolver. |
PortfolioMAD with active 'Conditional'
BoundType, MinNumAssets,
MaxNumAssets, or conditional budget
constraints | estimateFrontierByReturn | The problem is formulated by introducing
NumAssets binary variables to indicate
whether the corresponding asset is invested or not. Therefore,
it requires a mixed integer nonlinear programming solver. Three
types of MINLP solvers are offered, see setSolverMINLP. | Mixed integer nonlinear programming solver (MINLP) using
setSolverMINLP | 'fmincon' is used when the
estimate functions reduce the problem
into NLP. This solver is configured through setSolver |
PortfolioMAD with active 'Conditional'
BoundType, MinNumAssets,
MaxNumAssets, or conditional budget
constraints | estimateFrontierLimits | The problem is formulated by introducing
NumAssets binary variables to indicate
whether the corresponding asset is invested or not. Therefore,
it requires a mixed integer nonlinear programming solver. Three
types of MINLP solvers are offered, see setSolverMINLP. | Mixed integer nonlinear programming solver (MINLP) using
setSolverMINLP | 'fmincon' is used when the
estimate functions reduce the problem
into NLP. This solver is configured through setSolver |
See Also
PortfolioMAD | estimateFrontier | estimateFrontierLimits | estimateFrontierByReturn | estimatePortReturn | estimateFrontierByRisk | estimatePortRisk | estimateFrontierByRisk | setSolver | setSolverMINLP
Topics
- Estimate Efficient Portfolios Along the Entire Frontier for PortfolioMAD Object
- Creating the PortfolioMAD Object
- Working with MAD Portfolio Constraints Using Defaults
- Estimate Efficient Frontiers for PortfolioMAD Object
- Asset Returns and Scenarios Using PortfolioMAD Object
- Portfolio Optimization with Semicontinuous and Cardinality Constraints
- Mixed-Integer MAD Portfolio Optimization Problem
- PortfolioMAD Object
- Portfolio Optimization Theory
- PortfolioMAD Object Workflow
- Working with 'Conditional' BoundType, MinNumAssets, and MaxNumAssets Constraints Using Portfolio Objects