Built from scratch · risk parity · MIT

Uncorrelated Returns

Combining several independent return streams beats picking any single one. This builds the portfolio: cluster a multi-asset universe by correlation, then balance risk across the clusters.

6.65%
portfolio vol (vs 15.3% equal-wt)
1.83
diversification ratio
−16.5%
max drawdown (vs −26.2%)
12 → 6
assets clustered into themes

The recommended portfolio

Inverse-vol within each cluster, risk parity across clusters — so a calm bond sleeve and a wild crypto sleeve each contribute the same risk.

Portfolio weights by cluster Out-of-sample equity curve
Clustered correlation heatmap

How it works

1 · Cluster

Correlation → distance √(½(1−ρ)) → hierarchical clustering, k chosen by silhouette.

2 · Weight within

Inverse-volatility weights inside each cluster.

3 · Balance across

Risk parity over the cluster streams (SLSQP), equalizing risk contributions.

4 · Evaluate

Train/test split; report vol, drawdown, Sharpe, diversification ratio.

Run it

pip install -e ".[dev]"
uncorrelated --plots docs        # clusters, weights, performance + charts
uncorrelated --source live       # use real market data (yfinance)