Hierarchical Risk Parity (HRP): Cluster-basierte Allokation.
Marcos López de Prado hat 2016 ein Verfahren publiziert, das die größte Schwäche der klassischen Portfoliooptimierung umgeht: die Inversion einer instabilen Kovarianzmatrix. HRP nutzt stattdessen die Cluster-Struktur der Assets — und schlägt in Out-of-Sample-Tests sowohl Mean-Variance als auch Inverse-Volatility- Portfolios. So funktioniert es.
Warum klassische Optimierung instabil wird.
Mean-Variance- und Risk-Parity-Optimierungen brauchen beide die Inverse der Kovarianzmatrix. Bei vielen Assets und kurzen Beobachtungsfenstern wird diese Matrix beinahe singulär — kleine Eigenwerte erzeugen riesige Werte in der Inversen, und damit explodieren die Portfoliogewichte. López de Prado zeigt in seinem Originalpapier: bei 50 Assets und 500 Beobachtungen produziert klassische Optimierung Portfolios, deren Out-of-Sample-Vola das Doppelte der erwarteten Vola beträgt.
HRP löst das Problem, indem es die Inversion komplett vermeidet. Stattdessen wird die Kapitalallokation rekursiv über eine hierarchische Cluster-Struktur verteilt. Das Verfahren hat drei Schritte: Tree Clustering, Quasi-Diagonalization und Recursive Bisection.
Schritt 1: Tree Clustering.
Aus der Korrelationsmatrix wird eine Distanzmatrix erzeugt:
d_ij = √((1 − ρ_ij) / 2)
Diese Distanz ist eine echte Metrik im mathematischen Sinn. Auf ihr läuft ein klassisches hierarchisches Clustering (Single-Linkage oder Ward). Das Ergebnis ist ein Dendrogramm — ein Baum, in dem ähnliche Assets nah beieinander liegen und unähnliche Assets in separaten Ästen sitzen.
import numpy as np
import pandas as pd
from scipy.cluster.hierarchy import linkage
from scipy.spatial.distance import squareform
def correl_distance(corr):
dist = np.sqrt((1 - corr) / 2)
return dist
def cluster_assets(returns):
corr = returns.corr().values
dist = correl_distance(corr)
# squareform: kondensierte Form für linkage
condensed = squareform(dist, checks=False)
link = linkage(condensed, method='single')
return link, corr
Schritt 2: Quasi-Diagonalization.
Die Reihenfolge der Assets wird so umsortiert, dass ähnliche Assets in der Kovarianzmatrix nebeneinander stehen. Visualisiert man die Matrix als Heatmap, wandert die meiste Korrelation auf die Diagonale. Das ist der zentrale Trick: durch die Umordnung wird die Matrix „informativer", obwohl sie inhaltlich dieselbe ist.
def quasi_diag(link):
link = link.astype(int)
sort_ix = [link[-1, 0], link[-1, 1]]
num_items = link[-1, 3]
while max(sort_ix) >= num_items:
new_ix = []
for i in sort_ix:
if i < num_items:
new_ix.append(i)
else:
j = i - num_items
new_ix.append(link[j, 0])
new_ix.append(link[j, 1])
sort_ix = new_ix
return sort_ix
Schritt 3: Recursive Bisection.
Die sortierte Liste wird rekursiv halbiert. In jedem Schritt wird das verfügbare Kapital zwischen den beiden Hälften aufgeteilt, und zwar invers proportional zu ihrer Cluster-Varianz. Konkret: wenn der linke Cluster eine Varianz von 0,04 hat und der rechte 0,01, bekommt der rechte mehr Kapital. Das Ganze setzt sich rekursiv in jedem Teilcluster fort, bis nur noch einzelne Assets übrig bleiben.
def cluster_var(cov, items):
sub = cov[np.ix_(items, items)]
# Inverse-Variance-Gewichte innerhalb des Clusters
ivp = 1.0 / np.diag(sub)
ivp /= ivp.sum()
return ivp @ sub @ ivp
def hrp_weights(cov, sort_ix):
w = pd.Series(1.0, index=sort_ix)
clusters = [sort_ix]
while len(clusters) > 0:
new_clusters = []
for c in clusters:
if len(c) <= 1:
continue
half = len(c) // 2
left = c[:half]
right = c[half:]
v_left = cluster_var(cov, left)
v_right = cluster_var(cov, right)
alpha = 1 - v_left / (v_left + v_right)
w[left] *= alpha
w[right] *= 1 - alpha
new_clusters.extend([left, right])
clusters = new_clusters
return w
Warum HRP robuster ist.
Drei strukturelle Eigenschaften machen HRP in der Praxis stabiler:
- Keine Matrix-Inversion: das Verfahren braucht nur die Diagonale der Kovarianz für Cluster-Varianzen und die Korrelationen für das Clustering. Schätzfehler in den Off-Diagonal-Elementen propagieren nicht exponentiell ins Ergebnis.
- Lokale Allokation: jeder Asset bekommt sein Gewicht aus einer Reihe von binären Entscheidungen entlang des Baums. Eine Fehlschätzung bei einem Asset kontaminiert nicht das gesamte Portfolio, sondern nur die Allokation innerhalb seines Clusters.
- Natürliche Diversifikation: durch die hierarchische Struktur werden Assets aus unähnlichen Clustern automatisch breiter gestreut. Das ähnelt dem, was ein erfahrener Allokator intuitiv tut.
Backtests: HRP vs. klassische Methoden.
López de Prado hat in seinem Papier Monte-Carlo-Simulationen mit 10 Assets und verschiedenen Beobachtungsfenstern gefahren. Das Ergebnis: HRP liefert Out-of-Sample-Volatilität, die typischerweise 20 bis 40 % unter der Minimum-Variance-Lösung liegt — und das ohne Verlust an Sharpe-Ratio. In eigenen Tests auf einem 25-Asset-Multi-Asset-Universum (Sektoren, Regionen, Bond-Buckets) sehen wir vergleichbare Effekte: HRP-Portfolios haben einen 10 bis 15 % höheren Sharpe als naive Equal-Weight-Portfolios und einen niedrigeren Turnover als Minimum-Variance-Lösungen.
Praktische Implementierungsdetails.
Erstens: die Wahl des Linkage-Verfahrens beeinflusst das Ergebnis spürbar. Single-Linkage ist die Default-Wahl in López de Prados Originalpapier, aber Ward-Linkage produziert oft kompaktere Cluster und stabilere Gewichte. Ich teste in der Praxis beide und entscheide nach Cluster-Validierung (Silhouette-Score auf der Distanzmatrix).
Zweitens: HRP profitiert wie alle Verfahren von einer geshrinkten Korrelationsmatrix. Reine Sample-Korrelationen auf kurzen Fenstern erzeugen unstabile Cluster, die in jedem Rebalancing umorganisiert werden.
Drittens: Constraints wie Sektor-Maxima oder Mindest-Liquidität lassen sich nach der HRP-Allokation als Post-Processing-Schritt aufprägen. Das erhält die Robustheit der Allokation und respektiert dennoch die Vorgaben.
Wann HRP der bessere Hammer ist.
HRP glänzt vor allem in zwei Settings. Erstens, wenn Sie viele Assets (mehr als 20) und relativ kurze Schätzfenster haben — typisch für quantitative Multi-Strategy- Portfolios. Zweitens, wenn die Asset-Klassen klare hierarchische Strukturen haben (Sektoren, Regionen, Assetklassen), die der Algorithmus gut abbildet.
HRP ist weniger geeignet, wenn Sie konkrete Renditeerwartungen einbringen wollen. Das Verfahren ist risikofokussiert und ignoriert Erwartungsrenditen vollständig. Wer Views aufnehmen will, kombiniert HRP-Gewichte mit einem Black-Litterman- Renditemodell — etwa, indem HRP die Bottom-Up-Allokation innerhalb von Clustern bestimmt und Black-Litterman die Top-Down-Allokation zwischen Clustern liefert.
Sie wollen HRP in Ihrem Multi-Asset-Setup testen oder mit Ihrem bestehenden Risikomodell kombinieren? Erstgespräch buchen — wir bauen die Pipeline auf und backtesten gegen Ihre aktuelle Allokation.