- 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. ( 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 setShortingAllowed(boolean).
To get the optimal asset weighs you simply call FinancePortfolio.getWeights() or 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);
- Author:
- apete
-
Nested Class Summary
Nested classes/interfaces inherited from class org.ojalgo.data.domain.finance.portfolio.FinancePortfolio
FinancePortfolio.Context -
Field Summary
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 TypeMethodDescriptionorg.ojalgo.data.domain.finance.portfolio.LowerUpperaddConstraint(BigDecimal lowerLimit, BigDecimal upperLimit, int... assetIndeces) Will add a constraint on the sum of the asset weights specified by the asset indices.protected final MatrixR064protected final MatrixR064calculateAssetReturns(MatrixR064 aWeightsVctr) protected MatrixR064Constrained optimisation.protected final MatrixR064calculateAssetWeights(MatrixR064 aReturnsVctr) final doublecalculatePortfolioReturn(FinancePortfolio weightsPortfolio) protected final Scalar<?> calculatePortfolioReturn(MatrixR064 aWeightsVctr, MatrixR064 aReturnsVctr) final doublecalculatePortfolioVariance(FinancePortfolio weightsPortfolio) protected final Scalar<?> calculatePortfolioVariance(MatrixR064 aWeightsVctr) protected final voidcalibrate(MatrixR064 aWeightsVctr, MatrixR064 aReturnsVctr) voidfinal MatrixR064final MatrixR064final MatrixR064final MatrixR064final MatrixR064final MarketEquilibriumfinal doubleThe mean/expected return of this instrument.final doubleThe instrument's return variance.final Scalar<?> final String[]final List<BigDecimal> This method returns a list of the weights of the Portfolio's contained assets.protected final MatrixR064handle(Optimisation.Result optimisationResult) final booleanorg.ojalgo.data.domain.finance.portfolio.OptimisedPortfolio.Optimiserprotected voidreset()voidsetLowerLimit(int assetIndex, BigDecimal lowerLimit) final voidsetRiskAversion(Comparable<?> factor) final voidsetShortingAllowed(boolean allowed) 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) intsize()final List<SimpleAsset> final SimplePortfoliotoString()Methods inherited from class org.ojalgo.data.domain.finance.portfolio.FinancePortfolio
compareTo, forecast, getConformance, getLossProbability, getLossProbability, getSharpeRatio, getSharpeRatio, getValueAtRisk, getValueAtRisk95, getVolatility, normalise, normalise
-
Constructor Details
-
MarkowitzModel
-
MarkowitzModel
-
MarkowitzModel
-
-
Method Details
-
addConstraint
public org.ojalgo.data.domain.finance.portfolio.LowerUpper addConstraint(BigDecimal lowerLimit, BigDecimal upperLimit, int... assetIndeces) 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
-
calculateAssetWeights
Constrained optimisation. -
reset
protected void reset() -
isShortingAllowed
public final boolean isShortingAllowed() -
optimiser
public org.ojalgo.data.domain.finance.portfolio.OptimisedPortfolio.Optimiser optimiser() -
setShortingAllowed
public final void setShortingAllowed(boolean allowed) -
calculateAssetReturns
-
handle
-
calculatePortfolioReturn
- Specified by:
calculatePortfolioReturnin interfaceFinancePortfolio.Context
-
calculatePortfolioVariance
- Specified by:
calculatePortfolioVariancein interfaceFinancePortfolio.Context
-
getAssetReturns
- Specified by:
getAssetReturnsin interfaceFinancePortfolio.Context
-
getAssetVolatilities
- Specified by:
getAssetVolatilitiesin interfaceFinancePortfolio.Context
-
getAssetWeights
-
getCorrelations
- Specified by:
getCorrelationsin interfaceFinancePortfolio.Context
-
getCovariances
- Specified by:
getCovariancesin interfaceFinancePortfolio.Context
-
getMarketEquilibrium
-
getMeanReturn
public final double getMeanReturn()Description copied from class:FinancePortfolioThe mean/expected return of this instrument. May return either the absolute or excess return of the instrument. The context in which an instance is used should make it clear which. return.- Specified by:
getMeanReturnin classFinancePortfolio
-
getReturnVariance
public final double getReturnVariance()Description copied from class:FinancePortfolioThe instrument's return variance. Subclasses must override either FinancePortfolio.getReturnVariance() or FinancePortfolio.getVolatility().- Overrides:
getReturnVariancein classFinancePortfolio
-
getRiskAversion
-
getSymbols
-
getWeights
Description copied from class:FinancePortfolioThis method returns a list of the weights of the Portfolio's contained assets. An asset weight is NOT restricted to being a share/percentage - it can be anything. Most subclasses do however assume that the list of asset weights are shares/percentages that sum up to 100%. Calling FinancePortfolio.normalise() will transform any set of weights to that form.- Specified by:
getWeightsin classFinancePortfolio
-
setRiskAversion
-
size
public int size()- Specified by:
sizein interfaceFinancePortfolio.Context
-
toSimpleAssets
-
toSimplePortfolio
-
calculateAssetReturns
-
calculateAssetWeights
-
calculatePortfolioReturn
protected final Scalar<?> calculatePortfolioReturn(MatrixR064 aWeightsVctr, MatrixR064 aReturnsVctr) -
calculatePortfolioVariance
-
calibrate
-