Python port of R PerformanceAnalytics package using pandas, numpy, and statsmodels
Project description
PyPerfAnalytics
PyPerfAnalytics is a Python port of the popular R package PerformanceAnalytics. It provides a collection of functions for performance and risk analysis of financial portfolios.
The library ensures algorithmic consistency with the original R implementation, validated against R benchmarks with high precision.
Key Features
- Returns Calculation: Cumulative, annualized, and excess returns.
- Risk Metrics: VaR (Historical, Gaussian, Modified), Expected Shortfall, Tracking Error, etc.
- Performance Ratios: Sharpe, Sortino, Information, Treynor, Calmar, Omega, Burke, and more.
- Advanced Metrics: Hurst Index, Smoothing Index (Getmansky), CDaR (Conditional Drawdown at Risk).
- Summary Tables: Comprehensive reporting tables for distributions, correlations, downside risk, and drawdowns.
- Attribution: Aggregation of asset contributions to portfolio returns.
Visualization
PyPerfAnalytics includes a comprehensive suite of interactive plotting functions built on Plotly, designed to match the visual output and logic of the R PerformanceAnalytics package while providing modern web-based interactivity.
Core Charts
- Performance: Cumulative Returns, Bar Returns, Drawdown (Underwater), and Performance Summaries.
- Risk: Bar VaR/ES overlays, Risk Confidence Sensitivity, and Histograms with risk markers.
- Distribution: Boxplots, Q-Q Plots, and ECDF (Empirical Cumulative Distribution Function).
- Rolling Metrics: Rolling Performance, Rolling Correlation, and Rolling Regression (Alpha, Beta, R-Squared).
- Specialized: Snail Trails (Rolling Risk-Return), Capture Ratios, ACF/PACF, and Event Studies.
Installation
# Using uv (recommended)
uv pip install pyperfanalytics
# Using pip
pip install pyperfanalytics
Quick Start
import pandas as pd
import pyperfanalytics as pa
# Load your return data
returns = pd.read_csv("your_returns.csv", index_col=0, parse_dates=True)
# Calculate Annualized Sharpe Ratio
sharpe = pa.sharpe_ratio(returns, Rf=0, annualize=True)
# Generate a Downside Risk Summary Table
risk_table = pa.table_downside_risk_ratio(returns)
print(risk_table)
API Reference
1. Returns & Portfolio Management
return_calculate(prices, method="discrete")
Calculate returns from a price stream.
- Parameters:
prices(pd.Series or pd.DataFrame): Price levels.method(str): Calculation method:"discrete"(default),"log"(continuous), or"diff"(absolute difference).
- Example:
returns = pa.return_calculate(prices, method="log")
return_annualized(R, scale=None, geometric=True)
Calculate the annualized return.
- Parameters:
R(pd.Series or pd.DataFrame): Asset returns.scale(int, optional): Number of periods in a year (e.g., 12 for monthly, 252 for daily). If None, it's inferred from the index.geometric(bool): Whether to use geometric compounding.
- Example:
ann_ret = pa.return_annualized(returns, scale=12)
return_portfolio(R, weights=None, rebalance_on="none", geometric=True)
Calculate the returns of a portfolio.
- Parameters:
R(pd.DataFrame): Returns of individual assets.weights(list or np.array, optional): Asset weights. Defaults to equal weights.rebalance_on(str): Rebalancing frequency:"none","months","quarters","years".
- Example:
port_ret = pa.return_portfolio(returns, weights=[0.6, 0.4], rebalance_on="quarters")
2. Risk Metrics
max_drawdown(R, geometric=True)
Calculate the maximum peak-to-trough loss.
- Parameters:
R(pd.Series or pd.DataFrame): Asset returns.geometric(bool): Whether to use geometric returns for the equity curve.
- Example:
mdd = pa.max_drawdown(returns)
var_modified(R, p=0.95)
Calculate Modified (Cornish-Fisher) Value at Risk (VaR). Adjusts for skewness and kurtosis.
- Parameters:
R(pd.Series or pd.DataFrame): Asset returns.p(float): Confidence level (default 0.95).
- Example:
m_var = pa.var_modified(returns, p=0.99)
tracking_error(Ra, Rb, scale=None)
Calculate the annualized standard deviation of excess returns relative to a benchmark.
- Parameters:
Ra(pd.Series or pd.DataFrame): Asset returns.Rb(pd.Series or pd.DataFrame): Benchmark returns.
- Example:
te = pa.tracking_error(returns, benchmark_returns)
3. Performance Ratios
sharpe_ratio(R, Rf=0, p=0.95, FUN="StdDev", annualize=False)
Calculate the Sharpe Ratio (return per unit of risk).
- Parameters:
Rf(float or pd.Series): Risk-free rate.FUN(str): Risk measure to use:"StdDev","VaR","ES", or"SemiSD".
- Example:
# Traditional Sharpe
sr = pa.sharpe_ratio(returns, Rf=0.02/12, annualize=True)
# Modified VaR-based Sharpe
sr_mod = pa.sharpe_ratio(returns, FUN="VaR")
sortino_ratio(R, MAR=0)
Calculate the Sortino Ratio (excess return per unit of downside risk).
- Parameters:
MAR(float): Minimum Acceptable Return (default 0).
- Example:
sortino = pa.sortino_ratio(returns, MAR=0.05/12)
omega_ratio(R, L=0)
Calculate the Omega Ratio (probability-weighted gain vs loss).
- Parameters:
L(float): The threshold return (Level).
- Example:
omega = pa.omega_ratio(returns, L=0)
4. Summary Tables
table_stats(R, ci=0.95, digits=4)
Comprehensive returns summary including mean, median, std dev, skewness, kurtosis, and confidence intervals.
- Example:
stats = pa.table_stats(returns)
print(stats)
table_downside_risk_ratio(R, MAR=0, scale=None)
Summary table of downside risk metrics: Downside Deviation, Omega, Sortino, etc.
- Example:
downside_table = pa.table_downside_risk_ratio(returns, MAR=0)
table_capture_ratios(Ra, Rb, digits=4)
Calculate Up and Down Capture ratios relative to a benchmark.
- Example:
capture_table = pa.table_capture_ratios(returns, benchmark)
Verification
Every function is verified against the R PerformanceAnalytics implementation using the managers and edhec standard datasets. Tests are located in the tests/ directory and can be run using pytest.
Note on Accuracy: Where R's PerformanceAnalytics implementation contains known mathematical bugs (such as the BurkeRatio inadvertently scaling decimal inputs by 0.01 during drawdown calculations), pyperfanalytics corrects these bugs to produce accurate results for standard percentage-based analytics. In such explicitly documented cases, the library's output will intentionally deviate from the buggy R output to prioritize mathematical correctness.
Note on Robust Estimation Tolerance: The return_clean(method="boudt") function utilizes the Minimum Covariance Determinant (MCD) estimator. R's PerformanceAnalytics uses the robustbase:covMcd implementation (which includes specific finite sample corrections), while pyperfanalytics relies on scikit-learn's MinCovDet. Due to inherent algorithmic differences in these foundational robust statistics libraries, the scale thresholds and identified outliers can slightly differ. Mathematical correctness is maintained, but outputs will exhibit minor variance from R.
uv run pytest
License
This project is licensed under the GPL v2+ License - see the LICENSE file for details (matches original R PerformanceAnalytics).
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyperfanalytics-1.1.0.tar.gz.
File metadata
- Download URL: pyperfanalytics-1.1.0.tar.gz
- Upload date:
- Size: 2.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f33eec997dbfad910f84b2915c804051c9ad9b58fd4e2e1c1a83ea9bd833bfb6
|
|
| MD5 |
20d58e4660121666d9bb61313dbdf712
|
|
| BLAKE2b-256 |
1c4f1f84f8aeebd01b214076a5bf5e6224221bdd5e2aae86e5aac13f36fea142
|
Provenance
The following attestation bundles were made for pyperfanalytics-1.1.0.tar.gz:
Publisher:
test.yml on twn39/pyperfanalytics
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyperfanalytics-1.1.0.tar.gz -
Subject digest:
f33eec997dbfad910f84b2915c804051c9ad9b58fd4e2e1c1a83ea9bd833bfb6 - Sigstore transparency entry: 1172943826
- Sigstore integration time:
-
Permalink:
twn39/pyperfanalytics@d0675a62cb112ef18e6fa93b4f2fee3db2520bb2 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/twn39
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
test.yml@d0675a62cb112ef18e6fa93b4f2fee3db2520bb2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pyperfanalytics-1.1.0-py3-none-any.whl.
File metadata
- Download URL: pyperfanalytics-1.1.0-py3-none-any.whl
- Upload date:
- Size: 63.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3e2d28546a52f59fb2dd544511e87cbe61b4cda76d35a238469f73f61b7b5e68
|
|
| MD5 |
bb9c2b4b7a4a25dd722e05e0d276b087
|
|
| BLAKE2b-256 |
857110dbb9481f5f58332047bff39e2d5de45db9698be44201abde76b07fd82c
|
Provenance
The following attestation bundles were made for pyperfanalytics-1.1.0-py3-none-any.whl:
Publisher:
test.yml on twn39/pyperfanalytics
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyperfanalytics-1.1.0-py3-none-any.whl -
Subject digest:
3e2d28546a52f59fb2dd544511e87cbe61b4cda76d35a238469f73f61b7b5e68 - Sigstore transparency entry: 1172943886
- Sigstore integration time:
-
Permalink:
twn39/pyperfanalytics@d0675a62cb112ef18e6fa93b4f2fee3db2520bb2 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/twn39
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
test.yml@d0675a62cb112ef18e6fa93b4f2fee3db2520bb2 -
Trigger Event:
push
-
Statement type: