numfolio ⚡

A python package for portfolio evaluation build on top of Numba

Minimal examples

Compute statistics from input returns:

import numpy as np
from numfolio import compute_sharpe_ratio

returns = np.array([
    0.10002028, -0.52892259, -1.07383022, -0.19794636, -2.17779965,
    -0.28190857,  0.74667829,  0.2446915 ,  0.13643797,  0.4230784
])
sr = compute_sharpe_ratio(returns)
## -5.162601446765606

It is also possible to compute bootstrapping statistics

import numpy as np
from numfolio import compute_cvar, bootstrap_metric

returns = np.random.default_rng(42).standard_t(df=4, size=252)
m = bootstrap_metric(returns=returns, metric=compute_cvar)
cvar = m.mean()
## 3.60224242103749

You can estimate a correlation (or covariance) matrix from multivariate return data using estimate_correlation. The function accepts a pandas DataFrame of returns (columns = assets) and supports different estimation methods (e.g. "empyrical", "glassocv", "ledoit_wolf") and optional bootstrapping.

import numpy as np
import pandas as pd
from numfolio import estimate_correlation

rng = np.random.default_rng(42)
n_obs, n_assets = 250, 5

# simulate correlated returns
A = rng.standard_normal((n_assets, n_assets))
cov_true = A @ A.T
returns = rng.multivariate_normal(mean=np.zeros(n_assets), cov=cov_true, size=n_obs)
df = pd.DataFrame(returns, columns=[f"asset_{i}" for i in range(n_assets)])

# estimate correlation matrix (method can be 'empyrical', 'glassocv', 'ledoit_wolf')
corr_est = estimate_correlation(df, method="ledoit_wolf", n_bootstraps=100, n_jobs=-1)

print(corr_est)
# Expected: a pandas DataFrame with shape (n_assets, n_assets) showing the estimated correlations

Installation

To install the package the simplest procedure is:

pip install numfolio

Now you can test the installation... In a python shell:

import numfolio as nf

nf.__version__

Optional dependencies are docs for documentation and build for development. To install optional dependencies pip install numfolio[docs,build].