Equilibrium expected returns
PortfolioOptimisers.EquilibriumExpectedReturns — Type
struct EquilibriumExpectedReturns{__T_ce, __T_w, __T_l} <: AbstractShrunkExpectedReturnsEstimatorComputes the expected excess returns that a set of equilibrium weights implies, by reverse optimisation.
It holds a covariance estimator, the equilibrium weights and the risk aversion parameter. The Black-Litterman members use the same expression to build their prior mean.
l is the risk aversion of the representative investor. It is the $\lambda$ of the equation below, which Black and Litterman write $\delta$. It is a caller-supplied number and it is not estimated from the data. A larger l scales every equilibrium return up, and a l of zero gives a zero mean.
w is the weight vector the market is assumed to hold, which is a market-capitalisation vector or a benchmark vector. It is caller-supplied for the same reason: the data hold returns, not holdings. If w is nothing, the equal-weight vector of the right length is used, and the length is read from the covariance matrix rather than from X.
Fields
ce: Covariance estimator.
w: Optional equilibrium weights vectorassets × 1. Ifnothing, equal weights are used.
l: Risk aversion parameter.
Constructors
EquilibriumExpectedReturns(; ce::StatsBase.CovarianceEstimator = PortfolioOptimisersCovariance(), w::Option{<:VecNum} = nothing, l::Number = 1) -> EquilibriumExpectedReturnsKeywords correspond to the struct's fields.
Validation
- If
wis notnothing,!isempty(w).
Propagated parameters
When factory is called on this type, the following @fprop-tagged fields are automatically propagated:
ce: Recursively updated viafactory.
View parameters
When port_opt_view is called on this type, the following @vprop-tagged fields are automatically subset to the selected indices:
ce: Recursively viewed viaport_opt_view.w: Sliced to the selected indices viaport_opt_view.
Examples
julia> EquilibriumExpectedReturns()EquilibriumExpectedReturns ce ┼ PortfolioOptimisersCovariance │ ce ┼ Covariance │ │ me ┼ SimpleExpectedReturns │ │ │ w ┴ nothing │ │ ce ┼ GeneralCovariance │ │ │ ce ┼ StatsBase.SimpleCovariance: StatsBase.SimpleCovariance(true) │ │ │ w ┴ nothing │ │ alg ┼ FullMoment() │ │ w ┴ nothing │ mp ┼ MatrixProcessing │ │ pdm ┼ Posdef │ │ │ alg ┼ UnionAll: NearestCorrelationMatrix.Newton │ │ │ kwargs ┴ @NamedTuple{}: NamedTuple() │ │ dn ┼ nothing │ │ dt ┼ nothing │ │ alg ┼ nothing │ │ order ┴ NTuple{4, Symbol}: (:pdm, :dn, :dt, :alg) w ┼ nothing l ┴ Int64: 1Related
AbstractShrunkExpectedReturnsEstimatorStatsBase.CovarianceEstimatorStatsBase.AbstractWeightsequilibrium_mufactoryport_opt_view
References
Statistics.mean — Method
Statistics.mean(me::EquilibriumExpectedReturns, X::MatNum; dims::Int = 1, kwargs...)Compute equilibrium expected returns from a covariance estimator, weights, and risk aversion.
This method computes equilibrium expected returns as λ * Σ * w, where λ is the risk aversion parameter me.l, Σ is the covariance matrix that me.ce estimates from X, and w are the equilibrium weights me.w. If me.w is nothing, equal weights are used. The expression and the fallback belong to equilibrium_mu.
The result is an excess return. Reverse optimisation implies a risk premium, so no risk-free rate is in it and none is taken off it.
Mathematical definition
\[\begin{align} \hat{\boldsymbol{\mu}}_{\text{eq}} &= \lambda \, \hat{\mathbf{\Sigma}} \, \boldsymbol{w}\,. \end{align}\]
Where:
- $\lambda$: Risk aversion parameter (
me.l). - $\hat{\mathbf{\Sigma}}$:
N × Ncovariance matrix estimated from the data. - $\boldsymbol{w}$:
N × 1equilibrium portfolio weights (equal weights if not provided).
Algorithm
- Estimate the covariance matrix of
Xwithme.ce, givingsigma. - Pass
me.l,sigmaandme.wtoequilibrium_mu, which selects the equal-weight fallback whenme.wisnothing, and which givesmu.
Arguments
me: Equilibrium expected returns estimator.X: Data matrix (observations × assets).dims: Dimension along which to perform the computation.kwargs...: Additional keyword arguments passed to the covariance estimator.
Validation
dims in (1, 2). The check is not made by this method: the covariance estimatorme.ceis what raises theDomainError.
Returns
mu::VecNum: Equilibrium expected returns, a vector of lengthN. Unlike the other expected returns estimators, this method returns a plain vector for both values ofdims, becauseequilibrium_mureduces the covariance block against the weights.dimsreaches the covariance estimator only, and the covariance matrix isN × Nfor both values, sodimsdoes not change the shape of the result.
Related
References
- [5]
- D. Cajas. Advanced Portfolio Optimization: A Cutting-edge Quantitative Approach (Springer Nature Switzerland, 2025).
- [29]
- F. Black and R. Litterman. Global portfolio optimization. Financial Analysts Journal 48, 28–43 (1992).