Prior Estimator#

A prior estimator fits a PriorModel containing the distribution estimate of asset returns. It represents the investor’s prior beliefs about the model used to estimate that distribution.

A prior estimator follows the same API as scikit-learn’s estimator: the fit method takes X as the assets returns and stores the PriorModel in its prior_model_ attribute.

X can be any array-like structure (numpy array, pandas DataFrame, etc.)

Warning

The prior of one model can be the posterior of another one. For example, BlackLitterman takes as input a prior estimator used to compute the prior expected returns and prior covariance matrix, which are updated using the analyst’s views to get the posterior expected returns and posterior covariance matrix. These posterior estimates will be saved in a new PriorModel that can be used in another estimator.

The PriorModel is a dataclass containing:

  • mu: Expected returns estimation

  • covariance: Covariance matrix estimation

  • returns: assets returns estimation

  • cholesky : Lower-triangular Cholesky factor of the covariance estimation (optional)

Empirical Prior#

The EmpiricalPrior estimator estimates the PriorModel by fitting a mu_estimator and a covariance_estimator separately.

Example:

Empirical prior with James-Stein shrinkage for the estimation of expected returns and Denoising for the estimation of the covariance matrix:

from skfolio.datasets import load_sp500_dataset
from skfolio.moments import DenoiseCovariance, ShrunkMu
from skfolio.preprocessing import prices_to_returns
from skfolio.prior import EmpiricalPrior

prices = load_sp500_dataset()
X = prices_to_returns(prices)

model = EmpiricalPrior(
    mu_estimator=ShrunkMu(), covariance_estimator=DenoiseCovariance()
)
model.fit(X)
print(model.prior_model_)

Black & Litterman#

The BlackLitterman estimator estimates the PriorModel using the Black & Litterman model. It takes a Bayesian approach by using a prior estimate of the assets expected returns and covariance matrix, which are updated using the analyst views to get the posterior estimates.

Example:

from skfolio.preprocessing import prices_to_returns
from skfolio.datasets import load_sp500_dataset
from skfolio.prior import BlackLitterman

prices = load_sp500_dataset()
X = prices_to_returns(prices)

analyst_views = [
    "AAPL - BBY == 0.0003",
    "CVX - KO == 0.0004",
    "MSFT == 0.0006",
]

model = BlackLitterman(views=analyst_views)
model.fit(X)
print(model.prior_model_)

Factor Model#

The FactorModel estimator estimates the PriorModel using a factor model and a prior estimator of the factor’s returns.

The purpose of factor models is to impose a structure on financial variables and their covariance matrix by explaining them through a small number of common factors. This can help overcome estimation error by reducing the number of parameters, i.e., the dimensionality of the estimation problem, making portfolio optimization more robust against noise in the data. Factor models also provide a decomposition of financial risk into systematic and security-specific components.

To be fully compatible with scikit-learn, the fit method takes X as the assets returns and y as the factors returns. Note that y is in lowercase even for a 2D array (more than one factor). This is for consistency with the scikit-learn API.

Example:

from skfolio.datasets import load_factors_dataset, load_sp500_dataset
from skfolio.preprocessing import prices_to_returns
from skfolio.prior import FactorModel

prices = load_sp500_dataset()
factor_prices = load_factors_dataset()
X, y = prices_to_returns(prices, factor_prices)

model = FactorModel()
model.fit(X, y)
print(model.prior_model_)

The loading matrix (betas) of the factors is estimated using a loading_matrix_estimator. By default, we use the LoadingMatrixRegression which fits the factors using a sklean.linear_model.LassoCV on each asset separately.

Combining Multiple Prior Estimators#

Prior estimators can be combined. For example, it is possible to create a Black & Litterman Factor Model by using a BlackLitterman estimator for the prior estimator of the FactorModel:

Example:

Factor model for the estimation of the assets expected returns and covariance matrix with a Black & Litterman model for the estimation of the factors expected reruns and covariance matrix, incorporating the analyst views on the factors.

from skfolio.datasets import load_factors_dataset, load_sp500_dataset
from skfolio.preprocessing import prices_to_returns
from skfolio.prior import BlackLitterman, FactorModel

prices = load_sp500_dataset()
factor_prices = load_factors_dataset()
X, y = prices_to_returns(prices, factor_prices)

views = [
    "MTUM - QUAL == 0.0003",
    "SIZE - USMV == 0.0004",
    "VLUE == 0.0006",
]

model = FactorModel(
    factor_prior_estimator=BlackLitterman(views=views),
)
model.fit(X, y)
print(model.prior_model_)