Portfolioanalyse in pandas: Korrelations- und Kovarianzmatrizen, gewichtete Portfoliovolatilität und eine Rebalancing-Simulation
Berechnen Sie annualisierte Kovarianz- und Korrelationsmatrizen aus Renditen, leiten Sie mit NumPy Portfoliovolatilität und Risikobeiträge ab und simulieren Sie Drift im Vergleich zu kalenderbasiertem Rebalancing.
Was Sie lernen werden
- Wie Sie mehrere Kursreihen zu einem Rendite-DataFrame zusammenführen und
.cov()und.corr()korrekt annualisiert berechnen. - Die Matrixformel für die Portfoliovolatilität,
w.T @ Σ @ w, und wie Sie den Risikobeitrag jeder Anlage ablesen. - Wie Sie ein driftendes Buy-and-Hold-Portfolio im Vergleich zu einem nach Kalender rebalancierten Portfolio simulieren.
- Welche numerischen Fallen (nicht übereinstimmende Datumsangaben, gemischte Währungen, Look-Ahead im Kovarianzfenster) zu falschen Antworten führen.
Erklärung
Korrelation und Portfolio-Heat („Risiko- und Trade-Management“, Lektion 6), die Kombination zweier Systeme („Systematisches Trading“, Lektion 10) und Rebalancing-Regeln („ETFs, Fonds & langfristiges Investieren“, Lektion 10) wurden an anderer Stelle behandelt; diese Lektion setzt sie für beliebig viele Anlagen im Code um.
Von Kursen zu einer Renditematrix
Laden Sie den adjustierten Schlusskurs jedes Instruments (Lektion 4) in einen DataFrame, eine Spalte pro Ticker: prices = pd.concat(series_dict, axis=1). Feiertage, die sich zwischen Märkten unterscheiden, erzeugen NaN-Zeilen; entscheiden Sie bewusst zwischen prices.dropna() (nur gemeinsame Tage) und prices.ffill() (den letzten Kurs fortschreiben). Dann rets = prices.pct_change().dropna(). Rechnen Sie zuerst alles in eine Währung um; ein US-ETF im Besitz eines Euro-Anlegers muss mit der EUR/USD-Reihe umgerechnet werden, sonst beschreiben seine Volatilität und Korrelationen das Falsche.
Kovarianz, Korrelation und Annualisierung
rets.cov() ist die Stichproben-Kovarianzmatrix der Tagesrenditen; multiplizieren Sie mit 252, um sie zu annualisieren (die Varianz skaliert mit der Zeit). rets.corr() ist einheitenlos und braucht keine Skalierung. Die Diagonale enthält die Varianz jeder Anlage, sodass np.sqrt(np.diag(cov_a)) die annualisierten Volatilitäten liefert. Die Beziehung Σ_ij = ρ_ij × σ_i × σ_j ermöglicht es, eine Matrix aus Volatilitäten und Korrelationen aufzubauen, um ein hypothetisches Szenario wie „die Korrelationen steigen in einer Krise auf 0.8“ zu testen.
Portfoliovolatilität und Risikobeiträge
w = np.array([0.5, 0.3, 0.2]) # Gewichte, Summe 1cov_a = rets.cov().values * 252port_var = w @ cov_a @ wport_vol = np.sqrt(port_var)marginal = cov_a @ w # d(var)/d(w)risk_contrib = w * marginal / port_var # Anteile, Summe 1
@ ist die Matrixmultiplikation. risk_contrib gibt an, für welchen Anteil der Portfoliovarianz jede Anlage verantwortlich ist; er liegt meist weit vom Kapitalgewicht entfernt, und diese Lücke ist der Ausgangspunkt der Risikobudgetierung („Portfoliokonstruktion im Detail“, Lektion 1).
Eine Rebalancing-Simulation
Buy-and-Hold lässt die Gewichte driften: Gewinner wachsen zu einem größeren Anteil heran. Kalenderbasiertes Rebalancing setzt zu festen Terminen auf die Zielgewichte zurück. In pandas resamplen Sie die Renditen auf die Rebalancing-Frequenz und durchlaufen die Perioden in einer Schleife:
period_rets = (1 + rets).resample('ME').prod() - 1 # Monatsrenditentarget = np.array([0.6, 0.4]); hold = 10_000 * target; path = []for _, r in period_rets.iterrows():hold = hold * (1 + r.values) # jede Tranche wachsen lassenpath.append(hold.sum())hold = hold.sum() * target # auf Zielgewichte rebalancieren
Für die driftende Version löschen Sie die letzte Zeile. Verwenden Sie 'QE' für vierteljährlich und 'YE' für jährlich (pandas 2.2 und neuer; ältere Versionen verwenden 'M', 'Q', 'A'). Der Umschlag eines Rebalancings ist abs(new_hold - old_hold).sum(); multiplizieren Sie ihn mit einem Kostensatz wie 0.1 % und ziehen Sie das Ergebnis ab. In einem steuerpflichtigen deutschen Depot realisiert Rebalancing außerdem Gewinne; prüfen Sie die steuerliche Wirkung mit einem Steuerberater.
Durchgerechnetes Beispiel
Hypothetisches Beispiel mit erfundenen Eingaben; Gebühren, Spreads und Steuern nicht berücksichtigt.
Teil 1: Volatilität bei drei Anlagen. Annualisierte Volatilitäten 20 %, 10 %, 15 %; Korrelationen ρ₁₂ = 0.2, ρ₁₃ = 0.6, ρ₂₃ = 0.1; Gewichte 50 / 30 / 20 %.
- Kovarianzen: Σ₁₂ = 0.2 × 0.20 × 0.10 = 0.0040; Σ₁₃ = 0.6 × 0.20 × 0.15 = 0.0180; Σ₂₃ = 0.1 × 0.10 × 0.15 = 0.0015. Diagonale: 0.0400, 0.0100, 0.0225.
- Portfoliovarianz = Σ wᵢ wⱼ Σᵢⱼ = 0.25 × 0.04 + 0.09 × 0.01 + 0.04 × 0.0225 + 2 × (0.5 × 0.3 × 0.004 + 0.5 × 0.2 × 0.018 + 0.3 × 0.2 × 0.0015) = 0.0100 + 0.0009 + 0.0009 + 2 × (0.0006 + 0.0018 + 0.00009) = 0.01678.
- Portfoliovolatilität = √0.01678 = 12.95 %, gegenüber einem gewichteten Durchschnitt der Volatilitäten von 16.0 %; die Differenz ist der Diversifikationsvorteil.
- Risikobeiträge: Anlage 1 trägt 73.9 % der Varianz bei 50 % des Kapitals; Anlage 2 trägt 9.5 % bei 30 %; Anlage 3 trägt 16.6 % bei 20 %.
Teil 2: Drift im Vergleich zu Rebalancing. €10,000, aufgeteilt 60 / 40 auf Anlage A und Anlage B. Jahresrenditen: A +20 %, −10 %, +15 %; B +2 %, +4 %, +1 %.
- Drift: A: 6,000 × 1.20 × 0.90 × 1.15 = €7,452; B: 4,000 × 1.02 × 1.04 × 1.01 = €4,285.63. Summe €11,737.63; das Gewicht von A ist auf 63.5 % gedriftet.
- Jährliches Rebalancing: Summe Jahr 1 = 7,200 + 4,080 = €11,280 → Rücksetzung auf 6,768 / 4,512; Jahr 2 = 6,091.20 + 4,692.48 = €10,783.68 → Rücksetzung; Jahr 3 = 7,440.74 + 4,356.61 = €11,797.35.
- Das Rebalancing endete €59.72 höher, weil es A nach +20 % verkauft und nach −10 % zurückgekauft hat. Bei einem stetig trendenden A hätte die Drift gewonnen; Rebalancing steuert das Risiko, es garantiert keine Rendite.
Häufiger Fehler
rets.cov() über 2015–2025 berechnet und das Ergebnis verwendet, um 2015 Gewichte festzulegen, nutzt Informationen aus der Zukunft. Schätzen Sie die Kovarianz auf einem rollierenden oder expandierenden Fenster (rets.rolling(252).cov() oder rets.loc[:date].cov()) und wenden Sie sie nur auf die folgende Periode an. Korrelationen steigen zudem in Krisen, sodass eine Matrix aus einer ruhigen Phase das Risiko genau in dem Moment unterschätzt, in dem es darauf ankommt.Übungsaufgabe
Auf Papier: zwei Anlagen mit annualisierten Volatilitäten von 18 % und 6 %, Korrelation 0.3, Gewichte 70 / 30 %. (a) Stellen Sie die 2 × 2-Kovarianzmatrix auf. (b) Berechnen Sie Portfoliovarianz und -volatilität. (c) Berechnen Sie den Risikobeitrag jeder Anlage als Anteil an der Varianz. (d) Berechnen Sie die Volatilität mit einer Korrelation von 0.9 neu und erklären Sie in einem Satz, warum das wichtig ist.
Lösung anzeigen
(a) Σ₁₁ = 0.0324; Σ₂₂ = 0.0036; Σ₁₂ = 0.3 × 0.18 × 0.06 = 0.00324.
(b) Varianz = 0.49 × 0.0324 + 0.09 × 0.0036 + 2 × 0.7 × 0.3 × 0.00324 = 0.015876 + 0.000324 + 0.0013608 = 0.0175608; Volatilität = 13.25 %.
(c) Marginal: Anlage 1: 0.7 × 0.0324 + 0.3 × 0.00324 = 0.023652; Anlage 2: 0.7 × 0.00324 + 0.3 × 0.0036 = 0.003348. Beiträge: 0.7 × 0.023652 / 0.0175608 = 94.3 %; 0.3 × 0.003348 / 0.0175608 = 5.7 %.
(d) Mit ρ = 0.9: Σ₁₂ = 0.00972; Varianz = 0.015876 + 0.000324 + 0.0040824 = 0.0202824; Volatilität = 14.24 %. Der „Diversifizierer“ bringt wenig, wenn die Korrelation steigt, und genau das geschieht typischerweise bei einem Ausverkauf; ein Portfolio sollte anhand von Stress-Korrelationen beurteilt werden, nicht nur anhand des historischen Durchschnitts.
Einschränkungen: Die Stichproben-Kovarianz aus wenigen Jahren Tagesdaten ist verrauscht; kleine Änderungen am Fenster können Korrelationen um 0.1 oder mehr verschieben.
Kernaussagen
- Gleichen Sie Datumsangaben und Währungen ab, bevor Sie Renditen berechnen; entscheiden Sie bewusst, wie fehlende Tage behandelt werden.
- Annualisieren Sie die Kovarianz durch Multiplikation mit den Perioden pro Jahr; die Korrelation braucht keine Skalierung.
- Die Portfoliovolatilität ist √(wᵀ Σ w); die Risikobeiträge w × (Σw) / Varianz zeigen, wo das Risiko wirklich sitzt.
- Simulieren Sie Rebalancing, indem Sie Renditen resamplen und Bestände zurücksetzen; schätzen Sie die Kovarianz nur aus Daten, die zum jeweiligen Zeitpunkt verfügbar waren.
Nächster Schritt
Lektion 12 automatisiert die tägliche Routine: ein zeitgesteuertes Skript, das Daten abruft, Signale berechnet und einen Bericht schreibt, mit sauberem Umgang mit API-Schlüsseln und Rate-Limits.
Selbsttest
Beantworten Sie die Fragen und prüfen Sie dann Ihre Antworten. Sie können es so oft wiederholen, wie Sie möchten.
Automatischer Selbsttest zur eigenen Wiederholung. Ihre Antworten werden in Ihrem Browser geprüft und von uns weder eingesehen noch bewertet. Es ist keine Prüfung und kein Abschluss.
Ihr Fortschritt
„Erledigt“ bedeutet nur, dass Sie die Lektion als abgeschlossen markiert haben. Es ist kein Test Ihres Verständnisses. Fortschritt und Notizen werden nur in diesem Browser auf diesem Gerät gespeichert — nicht in einem Konto.