Choosing and Controlling the Solver for PortfolioCVaR Optimizations
When solving portfolio optimizations for a PortfolioCVaR object,
you are solving nonlinear optimization problems with either nonlinear objective or
nonlinear constraints. You can use 'TrustRegionCP' (default),
'ExtendedCP', or 'cuttingplane' 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', 'ExtendedCP', and 'cuttingplane' SolverTypes
The 'TrustRegionCP', 'ExtendedCP', and
'cuttingplane' solvers have options to control the number
iterations and stopping tolerances. Moreover, these solvers use linprog as the master 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 = PortfolioCVaR; 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 main solver algorithm to 'interior-point', with
no display, use setSolver to modify
'MainSolverOptions':
p = PortfolioCVaR; 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
MaainSolverOptions: [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 PortfolioCVaR object uses the sqp algorithm.
For details about fmincon and constrained nonlinear
optimization algorithms and options, see Constrained Nonlinear Optimization Algorithms.
To modify fmincon options for CVaR portfolio
optimizations, use setSolver to set the hidden
properties solverType and solverOptions to
specify and control the solver. (Note that you can see the default options by
creating a dummy PortfolioCVaR object, using p =
PortfolioCVaR and then type p.solverOptions.) Since
these solver properties are hidden, you cannot set them using the PortfolioCVaR object. The default for
the fmincon solver is to use the
sqp algorithm objective function, gradients turned on, and no
displayed output, so you do not need to use setSolver to specify the
sqp
algorithm.
p = PortfolioCVaR;
p = setSolver(p, 'fmincon');
display(p.solverOptions)fmincon options:
Options used by current Algorithm ('sqp'):
(Other available algorithms: 'active-set', 'interior-point', 'sqp-legacy', 'trust-region-reflective')
Set properties:
Algorithm: 'sqp'
ConstraintTolerance: 1.0000e-08
Display: 'off'
OptimalityTolerance: 1.0000e-08
SpecifyConstraintGradient: 1
SpecifyObjectiveGradient: 1
StepTolerance: 1.0000e-08
Default properties:
FiniteDifferenceStepSize: 'sqrt(eps)'
FiniteDifferenceType: 'forward'
MaxFunctionEvaluations: '100*numberOfVariables'
MaxIterations: 400
ObjectiveLimit: -1.0000e+20
OutputFcn: []
PlotFcn: []
ScaleProblem: 0
TypicalX: 'ones(numberOfVariables,1)'
UseParallel: 0 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
no displayed output, use setSolver
with:
p = PortfolioCVaR; p = setSolver(p, 'fmincon','Algorithm','active-set','Display','off'); display(p.solverOptions.Algorithm) display(p.solverOptions.Display)
active-set off
Alternatively, setSolver accepts an optimoptions object from Optimization Toolbox as the second argument. For example, you can change the algorithm to
'trust-region-reflective' with no displayed output as
follows:
p = PortfolioCVaR; options = optimoptions('fmincon','Algorithm','trust-region-reflective', 'Display', 'off'); p = setSolver(p, 'fmincon', options); display(p.solverOptions.Algorithm) display(p.solverOptions.Display)
trust-region-reflective 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
PortfolioCVaR object. The MINLP
solver is used when any one, or any combination of 'Conditional'
BoundType, MinNumAssets, or
MaxNumAssets constraints are active. In this case, 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
PortfolioCVaR object where 'Conditional'
BoundType, MinNumAssets, or
MaxNumAssets constraints are active, the mixed integer
nonlinear programming (MINLP) solver is automatically used.
Solver Guidelines for PortfolioCVaR Objects
The following table provides guidelines for using setSolver and setSolverMINLP.
| PortfolioCVaR Problem | PortfolioCVaR Function | Type of Optimization Problem | Main Solver | Helper Solver |
|---|---|---|---|---|
PortfolioCVaR without active 'Conditional'
BoundType, MinNumAssets,
and MaxNumAssets | 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',
'fmincon', or
'cuttingplane' using setSolver |
|
PortfolioCVaR without active 'Conditional'
BoundType, MinNumAssets,
and MaxNumAssets | estimateFrontierByReturn | Nonlinear objective with linear constraints | 'TrustRegionCP',
'ExtendedCP',
'fmincon', or
'cuttingplane' using setSolver |
|
PortfolioCVaR without active 'Conditional'
BoundType, MinNumAssets,
and MaxNumAssets | estimateFrontierLimits | Nonlinear or linear objective with linear constraints | For For
| Not applicable |
PortfolioCVaR 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. |
PortfolioCVaR 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 |
PortfolioCVaR 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
PortfolioCVaR | estimateFrontier | estimateFrontierLimits | estimateFrontierByReturn | estimatePortReturn | estimateFrontierByRisk | estimatePortRisk | estimateFrontierByRisk | setConditionalBudget | setSolver | setSolverMINLP
Topics
- Estimate Efficient Portfolios for Entire Frontier for PortfolioCVaR Object
- Creating the PortfolioCVaR Object
- Working with CVaR Portfolio Constraints Using Defaults
- Estimate Efficient Frontiers for PortfolioCVaR Object
- Asset Returns and Scenarios Using PortfolioCVaR Object
- Troubleshooting CVaR Portfolio Optimization Results
- Portfolio Optimization with Semicontinuous and Cardinality Constraints
- Hedging Using CVaR Portfolio Optimization
- Compute Maximum Reward-to-Risk Ratio for CVaR Portfolio
- Mixed-Integer CVaR Portfolio Optimization Problem
- Adding Constraints to Satisfy UCITS Directive
- PortfolioCVaR Object
- Portfolio Optimization Theory
- PortfolioCVaR Object Workflow
- Working with 'Conditional' BoundType, MinNumAssets, and MaxNumAssets Constraints Using Portfolio Objects