Portfolio Optimization and Quantitative Strategic Asset Allocation in Python
npx @tessl/cli install tessl/pypi-riskfolio-lib@7.0.0A comprehensive Python library for quantitative strategic asset allocation and portfolio optimization. Riskfolio-Lib provides advanced mean risk and logarithmic mean risk portfolio optimization with 4 objective functions and 24 convex risk measures, supporting multiple portfolio optimization models including mean-variance, risk parity, hierarchical clustering, nested clustered optimization, and worst-case scenarios optimization.
pip install Riskfolio-Libimport riskfolio as rpAll classes and functions are available at the top level:
# Import specific components
from riskfolio import Portfolio, HCPortfolio
from riskfolio import plot_frontier, mean_vector, MADimport riskfolio as rp
import numpy as np
import pandas as pd
# Load your returns data
returns = pd.read_csv('returns.csv', index_col=0, parse_dates=True)
# Create Portfolio object
port = rp.Portfolio(returns=returns)
# Calculate basic statistics
port.assets_stats(method_mu='hist', method_cov='hist')
# Optimize portfolio for minimum risk
w = port.optimization(model='Classic', rm='MV', obj='MinRisk', rf=0.0, l=0)
# Display allocation
print(w.T)
# Plot efficient frontier
ax = rp.plot_frontier(
w_frontier=port.efficient_frontier(model='Classic', rm='MV'),
mu=port.mu,
cov=port.cov,
returns=returns,
rm='MV',
rf=0.0
)Riskfolio-Lib is organized around core optimization classes and supporting modules:
The library integrates seamlessly with the Python scientific ecosystem (NumPy, Pandas, Matplotlib) and uses CVXPY for convex optimization.
Core portfolio optimization functionality including mean-variance, risk parity, Black-Litterman, factor models, and worst-case optimization. Supports 4 objective functions and 24 risk measures.
class Portfolio:
def __init__(self, returns=None, sht=False, uppersht=0.0001, upperlng=1, factors=None, alpha=0.05, a_sim=100, beta=None, b_sim=None): ...
def assets_stats(self, method_mu='hist', method_cov='hist', **kwargs): ...
def optimization(self, model='Classic', rm='MV', obj='Sharpe', rf=0, l=0, hist=True): ...
def efficient_frontier(self, model='Classic', rm='MV', points=20, rf=0, hist=True): ...Hierarchical clustering-based portfolio optimization using advanced clustering algorithms for asset allocation based on correlation structures.
class HCPortfolio:
def __init__(self, returns=None, alpha=0.05): ...
def optimization(self, model='HRP', codependence='pearson', covariance='hist', obj='MinRisk'): ...Comprehensive collection of 45+ risk measures including dispersion measures, downside risk measures, drawdown measures, and range measures for portfolio risk analysis.
def MAD(X): ...
def CVaR_Hist(X, alpha=0.05): ...
def MDD_Abs(X): ...
def Sharpe(X, rf=0): ...
def Risk_Contribution(w, cov, rm='MV'): ...Statistical methods for estimating expected returns, covariance matrices, factor models, and implementing Black-Litterman and other advanced estimation techniques.
def mean_vector(X, method='hist', **kwargs): ...
def covar_matrix(X, method='hist', **kwargs): ...
def black_litterman(X_hist, P, Q, **kwargs): ...
def loadings_matrix(X, Y, method='stepwise'): ...Comprehensive visualization tools for portfolios, efficient frontiers, risk contributions, cluster analysis, and performance attribution.
def plot_frontier(w_frontier, mu, cov, returns, rm='MV', rf=0): ...
def plot_pie(w, title='Portfolio Composition'): ...
def plot_risk_con(w, cov, returns, rm='MV'): ...
def plot_clusters(returns, codependence='pearson', linkage='ward'): ...Advanced constraint modeling including network constraints, clustering constraints, risk budgeting, and factor risk constraints for sophisticated portfolio construction.
def assets_constraints(assets, min_val=None, max_val=None): ...
def risk_constraint(w, cov, rm='MV', rf=0): ...
def connection_matrix(returns, network_method='MST'): ...
def centrality_vector(adjacency_matrix, centrality='degree'): ...Constraints and Advanced Features
Comprehensive portfolio reporting tools for generating detailed analysis reports in Jupyter notebooks and Excel formats with portfolio statistics, risk analysis, and visualizations.
def jupyter_report(returns, w, rm='MV', rf=0, alpha=0.05): ...
def excel_report(returns, w, rf=0, alpha=0.05, name='report', folder='Reports/'): ...# Risk measure codes
rmeasures = ["MV", "KT", "MAD", "GMD", "MSV", "SKT", "FLPM", "SLPM",
"CVaR", "TG", "EVaR", "RLVaR", "WR", "CVRG", "TGRG",
"EVRG", "RVRG", "RG", "MDD", "ADD", "CDaR", "EDaR",
"RLDaR", "UCI"]
# Optimization models
models = ["Classic", "BL", "FM", "FC", "WC", "OWA"]
# Objectives
objectives = ["MinRisk", "Utility", "Sharpe", "MaxRet"]