⚠ Trading ist mit einem erheblichen Verlustrisiko verbunden. Alle Inhalte dieser Website dienen ausschließlich der Bildung und stellen keine Finanzberatung dar.
Lektion 11 von 13 · Kostenlos

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.

Autor: Moustafa HijaziInhalt geprüft: 2026-10-306 Min. LesezeitSelbstlernkurs

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 1
  • cov_a = rets.cov().values * 252
  • port_var = w @ cov_a @ w
  • port_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 # Monatsrenditen
  • target = 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 lassen
  • path.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 %.

  1. 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.
  2. 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.
  3. Portfoliovolatilität = √0.01678 = 12.95 %, gegenüber einem gewichteten Durchschnitt der Volatilitäten von 16.0 %; die Differenz ist der Diversifikationsvorteil.
  4. 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 %.

  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.
  2. 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.
  3. 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

Die Kovarianzmatrix der gesamten Stichprobe verwenden, um ein Portfolio zu gewichten, das zu Beginn der Stichprobe startetEin Backtest, der 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.

1. Zwei Anlagen haben annualisierte Volatilitäten von 20 % und 10 %, eine Korrelation von 0.0 und Gewichte von 50 / 50 %. Wie hoch ist die Portfoliovolatilität?

2. Die Kovarianzmatrix eines DataFrames mit Tagesrenditen enthält für Anlage X den Wert 0.0001 auf der Diagonale. Wie hoch ist die annualisierte Volatilität von X (252 Tage)?

3. In einer Rebalancing-Simulation wird in jedem Schleifendurchlauf die Zeile hold = hold.sum() * target vor hold = hold * (1 + r.values) ausgeführt. Welche Auswirkung hat das?

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.