Class MarkowitzModel
- All Implemented Interfaces:
Comparable<FinancePortfolio>
,FinancePortfolio.Context
The Markowitz model, in this class, is defined as:
min (RAF/2) [w]T[C][w] - [w]T[r]
subject to |[w]| = 1
RAF stands for Risk Aversion Factor. Instead of specifying a desired risk or return level you specify a level of risk aversion that is used to balance the risk and return.
The expected returns for each of the assets must be excess returns. Otherwise this formulation is wrong.
The total weights of all assets will always be 100%, but shorting can be allowed or not according to your preference. ( OptimisedPortfolio.setShortingAllowed(boolean) ) In addition you may set lower and upper limits on any individual asset. ( setLowerLimit(int, BigDecimal) and setUpperLimit(int, BigDecimal) )
Risk-free asset: That means there is no excess return and zero variance. Don't (try to) include a risk-free asset here.
Do not worry about the minus sign in front of the return part of the objective function - it is handled/negated for you. When you're asked to supply the expected excess returns you should supply precisely that.
Basic usage instructions
After you've instantiated the MarkowitzModel you need to do one of three different things:-
invalid reference
#setRiskAversion(Number)
MarketEquilibrium
orFinancePortfolio.Context
used to instantiate the MarkowitzModel setTargetReturn(BigDecimal)
setTargetVariance(BigDecimal)
Optionally you may setLowerLimit(int, BigDecimal), setUpperLimit(int, BigDecimal) or OptimisedPortfolio.setShortingAllowed(boolean).
To get the optimal asset weighs you simply call EquilibriumModel.getWeights()
or EquilibriumModel.getAssetWeights()
.
If the results are not what you expect the first thing you should try is to turn on optimisation model
validation: model.optimisation().validate(true);
-
Nested Class Summary
Nested classes/interfaces inherited from class org.ojalgo.data.domain.finance.portfolio.OptimisedPortfolio
OptimisedPortfolio.Optimiser, OptimisedPortfolio.Template
Nested classes/interfaces inherited from class org.ojalgo.data.domain.finance.portfolio.FinancePortfolio
FinancePortfolio.Context
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final double
private static final double
private static final double
private static final double
private final HashMap
<int[], LowerUpper> private ExpressionsBasedModel
private BigDecimal
private BigDecimal
private static final NumberContext
Fields inherited from class org.ojalgo.data.domain.finance.portfolio.OptimisedPortfolio
BALANCE, VARIANCE
Fields inherited from class org.ojalgo.data.domain.finance.portfolio.FinancePortfolio
MATRIX_FACTORY
-
Constructor Summary
ConstructorsConstructorDescriptionMarkowitzModel
(FinancePortfolio.Context portfolioContext) MarkowitzModel
(MarketEquilibrium marketEquilibrium, MatrixR064 expectedExcessReturns) MarkowitzModel
(MatrixR064 covarianceMatrix, MatrixR064 expectedExcessReturns) -
Method Summary
Modifier and TypeMethodDescriptionaddConstraint
(BigDecimal lowerLimit, BigDecimal upperLimit, int... assetIndeces) Will add a constraint on the sum of the asset weights specified by the asset indices.protected MatrixR064
Constrained optimisation.(package private) Scalar
<?> calculatePortfolioReturn
(Access1D<?> weightsVctr, MatrixR064 returnsVctr) (package private) Scalar
<?> calculatePortfolioVariance
(Access1D<?> weightsVctr) void
private ExpressionsBasedModel
generateOptimisationModel
(double riskAversion) protected void
reset()
void
setLowerLimit
(int assetIndex, BigDecimal lowerLimit) void
setTargetReturn
(BigDecimal targetReturn) Will set the target return to whatever you input and the target variance tonull
.void
setTargetVariance
(BigDecimal targetVariance) Will set the target variance to whatever you input and the target return tonull
.void
setUpperLimit
(int assetIndex, BigDecimal upperLimit) toString()
Methods inherited from class org.ojalgo.data.domain.finance.portfolio.OptimisedPortfolio
calculateAssetReturns, getOptimisationOptions, getVariable, handle, isShortingAllowed, makeModel, optimiser, setShortingAllowed
Methods inherited from class org.ojalgo.data.domain.finance.portfolio.EquilibriumModel
calculateAssetReturns, calculateAssetWeights, calculatePortfolioReturn, calculatePortfolioReturn, calculatePortfolioVariance, calculatePortfolioVariance, calibrate, getAssetReturns, getAssetVolatilities, getAssetWeights, getCorrelations, getCovariances, getMarketEquilibrium, getMeanReturn, getReturnVariance, getRiskAversion, getSymbols, getWeights, isDefaultRiskAversion, setRiskAversion, size, toSimpleAssets, toSimplePortfolio
Methods inherited from class org.ojalgo.data.domain.finance.portfolio.FinancePortfolio
compareTo, forecast, getConformance, getLossProbability, getLossProbability, getSharpeRatio, getSharpeRatio, getValueAtRisk, getValueAtRisk95, getVolatility, normalise, normalise
-
Field Details
-
_0_0
private static final double _0_0 -
INIT
private static final double INIT -
MAX
private static final double MAX -
MIN
private static final double MIN -
TARGET_CONTEXT
-
myConstraints
-
myOptimisationModel
-
myTargetReturn
-
myTargetVariance
-
-
Constructor Details
-
MarkowitzModel
-
MarkowitzModel
-
MarkowitzModel
-
-
Method Details
-
addConstraint
Will add a constraint on the sum of the asset weights specified by the asset indices. Either (but not both) of the limits may be null. -
clearAllConstraints
public void clearAllConstraints() -
setLowerLimit
-
setTargetReturn
Will set the target return to whatever you input and the target variance to
null
.Setting the target return implies that you disregard the risk aversion factor and want the minimum risk portfolio with return that is equal to or as close to the target as possible.
There is a performance penalty for setting a target return as the underlying optimisation model has to be solved several (many) times with different pararmeters (different risk aversion factors).
Setting a target return (or variance) is not recommnded. It's much better to simply modify the risk aversion factor.
- See Also:
-
setTargetVariance
Will set the target variance to whatever you input and the target return to
null
.Setting the target variance implies that you disregard the risk aversion factor and want the maximum return portfolio with risk that is equal to or as close to the target as possible.
There is a performance penalty for setting a target variance as the underlying optimisation model has to be solved several (many) times with different pararmeters (different risk aversion factors).
Setting a target variance is not recommnded. It's much better to modify the risk aversion factor.
- See Also:
-
setUpperLimit
-
toString
- Overrides:
toString
in classEquilibriumModel
-
generateOptimisationModel
-
calculateAssetWeights
Constrained optimisation.- Specified by:
calculateAssetWeights
in classEquilibriumModel
-
reset
protected void reset()- Overrides:
reset
in classOptimisedPortfolio
-
calculatePortfolioReturn
-
calculatePortfolioVariance
-