Riskfolio-Lib

raw JSON →
7.2.1 verified Sat May 09 auth: no python

Riskfolio-Lib is a Python library for portfolio optimization and quantitative strategic asset allocation. It provides tools for mean-variance, Black-Litterman, risk parity, and other advanced portfolio methods. Current version is 7.2.1, requiring Python >=3.9. The library is actively maintained with a regular release cadence.

pip install riskfolio-lib
error ModuleNotFoundError: No module named 'riskfolio'
cause Importing with hyphen instead of underscore: 'riskfolio-lib' is the package name, but the module is 'riskfolio'.
fix
Use 'import riskfolio' after 'pip install riskfolio-lib'.
error KeyError: 'prices'
cause Portfolio class in v7+ does not accept 'prices' as a parameter.
fix
Pass 'returns' (DataFrame of returns) instead of 'prices' to Portfolio.
error cvxpy.error.SolverError: Solver not found (ECOS, SCS, etc.)
cause cvxpy is installed but no solver backend is available.
fix
Install a solver: e.g., 'pip install cvxopt'.
error ValueError: The covariance matrix is not positive semidefinite
cause Data contains NaN or insufficient observations causing non-psd covariance.
fix
Drop or interpolate NaN values; use method='ledoit' in covariance estimation: Port = Portfolio(returns, method_cov='ledoit').
breaking In version 7.0+, the Portfolio class no longer accepts 'prices' directly; use 'returns' or 'mu' and 'cov' explicitly.
fix Convert prices to returns with .pct_change().dropna() before passing to Portfolio.
deprecated The function 'riskfolio.MeanRisk()' is deprecated. Use 'Portfolio.optimization()' with risk measure parameters.
fix Switch to Portfolio object and its optimization method.
gotcha The library requires cvxpy with a compatible solver (e.g., ECOS, SCS). Missing solver may cause silent fallback or errors.
fix Install cvxpy and optionally 'cvxopt' or 'scipy' for alternative solvers.

Basic mean-variance optimization to maximize Sharpe ratio using historical returns.

import numpy as np
import pandas as pd
from riskfolio import Portfolio

# Sample data
ereturns = pd.DataFrame(np.random.randn(100, 4), columns=['Asset1','Asset2','Asset3','Asset4'])

# Portfolio object
port = Portfolio(returns=ereturns)

# Mean-variance optimization
w = port.optimization(model='Classic', rm='MV', obj='Sharpe', hist=True)
print(w)