Equilibrium expected returns

PortfolioOptimisers.EquilibriumExpectedReturnsType
struct EquilibriumExpectedReturns{__T_ce, __T_w, __T_l} <: AbstractShrunkExpectedReturnsEstimator

Computes 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 vector assets × 1. If nothing, equal weights are used.
  • l: Risk aversion parameter.

Constructors

EquilibriumExpectedReturns(;    ce::StatsBase.CovarianceEstimator = PortfolioOptimisersCovariance(),    w::Option{<:VecNum} = nothing,    l::Number = 1) -> EquilibriumExpectedReturns

Keywords correspond to the struct's fields.

Validation

  • If w is not nothing, !isempty(w).

Propagated parameters

When factory is called on this type, the following @fprop-tagged fields are automatically propagated:

  • ce: Recursively updated via factory.

View parameters

When port_opt_view is called on this type, the following @vprop-tagged fields are automatically subset to the selected indices:

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: 1

Related

References

  • [5] D. Cajas. Advanced Portfolio Optimization: A Cutting-edge Quantitative Approach (Springer Nature Switzerland, 2025). Section 5.1.1, Equation 5.2.
  • [29] F. Black and R. Litterman. Global portfolio optimization. Financial Analysts Journal 48, 28–43 (1992).
source
Statistics.meanMethod
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 × N covariance matrix estimated from the data.
  • $\boldsymbol{w}$: N × 1 equilibrium portfolio weights (equal weights if not provided).

Algorithm

  1. Estimate the covariance matrix of X with me.ce, giving sigma.
  2. Pass me.l, sigma and me.w to equilibrium_mu, which selects the equal-weight fallback when me.w is nothing, and which gives mu.

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 estimator me.ce is what raises the DomainError.

Returns

  • mu::VecNum: Equilibrium expected returns, a vector of length N. Unlike the other expected returns estimators, this method returns a plain vector for both values of dims, because equilibrium_mu reduces the covariance block against the weights. dims reaches the covariance estimator only, and the covariance matrix is N × N for both values, so dims does not change the shape of the result.

Related

source

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).