Portfolio analytics for quants - comprehensive statistical analysis, risk assessment, and performance visualization for quantitative finance
npx @tessl/cli install tessl/pypi-quantstats@0.0.0Portfolio analytics for quants - a comprehensive Python library providing statistical analysis, risk assessment, performance visualization, and reporting capabilities for quantitative finance. QuantStats enables portfolio managers and quantitative analysts to perform in-depth performance analysis through statistical metrics, risk ratios, drawdown analysis, and professional-grade tearsheet generation.
pip install quantstatsimport quantstats as qsAccess specific modules:
import quantstats.stats as stats
import quantstats.plots as plots
import quantstats.reports as reports
import quantstats.utils as utilsimport quantstats as qs
import pandas as pd
import numpy as np
# Create sample returns data
dates = pd.date_range('2020-01-01', '2023-12-31', freq='D')
returns = pd.Series(np.random.normal(0.001, 0.02, len(dates)), index=dates)
# Basic performance metrics
sharpe_ratio = qs.stats.sharpe(returns)
max_dd = qs.stats.max_drawdown(returns)
cagr = qs.stats.cagr(returns)
print(f"Sharpe Ratio: {sharpe_ratio:.2f}")
print(f"Max Drawdown: {max_dd:.2%}")
print(f"CAGR: {cagr:.2%}")
# Generate comprehensive HTML report
qs.reports.html(returns, output='portfolio_report.html')
# Create performance plots
qs.plots.snapshot(returns, title="Portfolio Performance")
# Extend pandas for method chaining
qs.extend_pandas()
portfolio_metrics = returns.sharpe(), returns.sortino(), returns.calmar()QuantStats is organized into four main modules that work together to provide comprehensive portfolio analysis:
The library also provides extend_pandas() functionality that adds all statistical and plotting methods directly to pandas DataFrames and Series, enabling method chaining and integrated workflows.
Core statistical functions for portfolio performance analysis including return calculations, risk metrics, performance ratios, and benchmarking against market indices.
def sharpe(returns, rf=0.0, periods=252, annualize=True, smart=False): ...
def sortino(returns, rf=0, periods=252, annualize=True, smart=False): ...
def max_drawdown(prices): ...
def volatility(returns, periods=252, annualize=True, prepare_returns=True): ...
def cagr(returns, rf=0.0, compounded=True, periods=252): ...
def calmar(returns, prepare_returns=True, periods=252): ...Advanced risk metrics including Value at Risk (VaR), drawdown analysis, tail risk measures, and stress testing indicators for comprehensive portfolio risk evaluation.
def value_at_risk(returns, sigma=1, confidence=0.95, prepare_returns=True): ...
def conditional_value_at_risk(returns, sigma=1, confidence=0.95, prepare_returns=True): ...
def ulcer_index(returns): ...
def to_drawdown_series(returns): ...
def tail_ratio(returns, cutoff=0.95, prepare_returns=True): ...Plotting and charting functions for creating comprehensive performance visualizations including cumulative returns, rolling metrics, drawdown underwater plots, and monthly heatmaps.
def snapshot(returns, grayscale=False, figsize=(10, 8), title="Portfolio Summary", ...): ...
def returns(returns, benchmark=None, ...): ...
def drawdown(returns, ...): ...
def rolling_sharpe(returns, benchmark=None, rf=0.0, period=126, ...): ...
def monthly_heatmap(returns, benchmark=None, ...): ...Professional tearsheet and report generation including HTML reports, metrics tables, and comprehensive performance analysis with customizable layouts and benchmarking.
def html(returns, benchmark=None, rf=0.0, ...): ...
def metrics(returns, benchmark=None, rf=0.0, ...): ...
def full(returns, benchmark=None, rf=0.0, ...): ...
def basic(returns, benchmark=None, ...): ...Data preparation and utility functions for converting between prices and returns, data validation, benchmarking preparation, and pandas integration.
def to_returns(prices, rf=0.0): ...
def to_prices(returns, base=1e5): ...
def validate_input(data, allow_empty=False): ...
def aggregate_returns(returns, period=None, compounded=True): ...
def download_returns(ticker, period="max", proxy=None): ...Extended pandas functionality that adds all QuantStats statistical and plotting methods directly to DataFrames and Series for seamless integration with existing workflows.
def extend_pandas(): ...When extend_pandas() is called, all statistical methods become available on pandas objects:
# After calling qs.extend_pandas()
returns.sharpe() # Same as qs.stats.sharpe(returns)
returns.plot_snapshot() # Same as qs.plots.snapshot(returns)
returns.max_drawdown() # Same as qs.stats.max_drawdown(returns)class QuantStatsError(Exception):
"""Base exception class for QuantStats"""
class DataValidationError(QuantStatsError):
"""Raised when input data validation fails"""
class CalculationError(QuantStatsError):
"""Raised when a calculation fails"""
class PlottingError(QuantStatsError):
"""Raised when plotting operations fail"""
class BenchmarkError(QuantStatsError):
"""Raised when benchmark-related operations fail"""