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:-
unless this was already set in the
invalid reference
#setRiskAversion(Number)MarketEquilibriumorFinancePortfolio.Contextused 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 OptimisedPortfolio
OptimisedPortfolio.Optimiser, OptimisedPortfolio.TemplateNested classes/interfaces inherited from class FinancePortfolio
FinancePortfolio.Context -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final doubleprivate static final doubleprivate static final doubleprivate static final doubleprivate final HashMap<int[], LowerUpper> private ExpressionsBasedModelprivate BigDecimalprivate BigDecimalprivate static final NumberContextFields inherited from class OptimisedPortfolio
BALANCE, VARIANCEFields inherited from class 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 MatrixR064Constrained optimisation.(package private) Scalar<?> calculatePortfolioReturn(Access1D<?> weightsVctr, MatrixR064 returnsVctr) (package private) Scalar<?> calculatePortfolioVariance(Access1D<?> weightsVctr) voidprivate ExpressionsBasedModelgenerateOptimisationModel(double riskAversion) protected voidreset()voidsetLowerLimit(int assetIndex, BigDecimal lowerLimit) voidsetTargetReturn(BigDecimal targetReturn) Will set the target return to whatever you input and the target variance tonull.voidsetTargetVariance(BigDecimal targetVariance) Will set the target variance to whatever you input and the target return tonull.voidsetUpperLimit(int assetIndex, BigDecimal upperLimit) toString()Methods inherited from class OptimisedPortfolio
calculateAssetReturns, getOptimisationOptions, getVariable, handle, isShortingAllowed, makeModel, optimiser, setShortingAllowedMethods inherited from class EquilibriumModel
calculateAssetReturns, calculateAssetWeights, calculatePortfolioReturn, calculatePortfolioReturn, calculatePortfolioVariance, calculatePortfolioVariance, calibrate, getAssetReturns, getAssetVolatilities, getAssetWeights, getCorrelations, getCovariances, getMarketEquilibrium, getMeanReturn, getReturnVariance, getRiskAversion, getSymbols, getWeights, isDefaultRiskAversion, setRiskAversion, size, toSimpleAssets, toSimplePortfolioMethods inherited from class 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:
toStringin classEquilibriumModel
-
generateOptimisationModel
-
calculateAssetWeights
Constrained optimisation.- Specified by:
calculateAssetWeightsin classEquilibriumModel
-
reset
protected void reset()- Overrides:
resetin classOptimisedPortfolio
-
calculatePortfolioReturn
-
calculatePortfolioVariance
-