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

Plotten für die Analyse: Kurs mit Indikatoren, Equity- und Drawdown-Charts, Renditeverteilungen und der Export von Grafiken

Nutzen Sie die Figure-und-Axes-Schnittstelle von matplotlib, um die vier Charts zu erstellen, die jeder Backtest-Bericht braucht, lesen Sie sie richtig und exportieren Sie sie in Druckqualität.

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

Was Sie lernen werden

  • Das Muster fig, ax = plt.subplots() und warum es der schnellen Abkürzung series.plot() bei allem überlegen ist, was Sie wiederverwenden werden.
  • Wie Sie Kurs-, Indikator- und Equity-Panels mit einer gemeinsamen Zeitachse übereinanderstapeln und wann Sie die Equity-Achse auf eine logarithmische Skala umstellen.
  • Wie Sie einen Drawdown-Chart und ein Renditehistogramm zeichnen und worauf Sie jeweils achten sollten.
  • Wie Grafikgröße, DPI und Dateiformat bestimmen, wie das exportierte Bild aussieht.

Erklärung

Charts sind in der Forschung keine Dekoration; sie sind die schnellste Prüfung, ob Ihre Zahlen stimmen. Eine Equity-Kurve, die an einem Tag um 30 % springt, bedeutet meist einen Datenfehler, keinen großartigen Trade. Diese Lektion verwendet matplotlib, das pandas im Hintergrund aufruft, über seine objektorientierte Schnittstelle.

Figure, Axes und die gemeinsame Zeitachse

Eine Figure ist die gesamte Zeichenfläche; ein Axes-Objekt ist ein Plotbereich darin. fig, axes = plt.subplots(3, 1, figsize=(10, 8), sharex=True, height_ratios=[3, 1, 1]) erzeugt drei übereinanderliegende Panels unterschiedlicher Höhe, die gemeinsam zoomen. Das Muster ist für jedes Panel gleich: Rufen Sie ax.plot(x, y, label=...) auf, dann ax.set_ylabel, ax.legend() und ax.grid(True, alpha=0.3). Geben Sie jedem Panel einen kurzen Titel und beschriften Sie die Einheiten (€, %, Punkte).

Kurs mit Indikatoren

  • fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6), sharex=True, height_ratios=[3, 1])
  • ax1.plot(df.index, df.close, lw=1, label='Schluss')
  • ax1.plot(df.index, df.sma50, lw=1, label='SMA 50')
  • ax1.fill_between(df.index, df.bb_lo, df.bb_hi, alpha=0.15, label='Bollinger')
  • ax1.legend(loc='upper left'); ax1.set_ylabel('Kurs (€)')
  • ax2.plot(df.index, df.rsi, lw=1); ax2.axhline(70, ls='--'); ax2.axhline(30, ls='--')
  • ax2.set_ylabel('RSI'); fig.autofmt_xdate(); fig.tight_layout()

fill_between schattiert ein Band; axhline zeichnet Referenzniveaus; autofmt_xdate dreht die Datumsangaben, damit sie sich nicht überlappen. Um Trades aus der Trade-Liste von Lektion 8 zu markieren, verwenden Sie ax1.scatter(entries.index, entries.price, marker='^') für Einstiege und ein nach unten zeigendes Dreieck für Ausstiege.

Equity und Drawdown

Plotten Sie die Equity mit ax.set_yscale('log'), sobald sich das Konto über den Zeitraum mehr als verdoppelt. Auf einer linearen Achse wirkt ein Anstieg von €10,000 auf €11,000 winzig neben einem späteren Anstieg von €40,000 auf €44,000, obwohl beide +10 % betragen. Das Drawdown-Panel plottet dd = equity / equity.cummax() - 1 und füllt die Fläche: ax.fill_between(dd.index, dd, 0, alpha=0.4). Lesen Sie daraus drei Dinge ab: den tiefsten Punkt (maximaler Drawdown), die längste Strecke unter null (Zeit unter Wasser, oft schmerzhafter als die Tiefe) und ob sich Drawdowns in einem bestimmten Marktregime häufen.

Renditeverteilungen

ax.hist(returns, bins=50, density=True) zeigt die Form täglicher Renditen oder Renditen pro Trade. Legen Sie eine Normalverteilungskurve mit demselben Mittelwert und derselben Standardabweichung darüber, um die Fat Tails (dicken Verteilungsränder) zu sehen: Reale Renditen haben mehr Extremtage, als die Glockenkurve vorhersagt. Bei einer Trade-Liste plotten Sie stattdessen die R-Multiples: Ein gesundes Trendfolgesystem zeigt viele kleine Verluste nahe −1R und einen langen rechten Rand; ein Short-Volatility-System zeigt das Spiegelbild, und das ist ein Warnsignal. Geben Sie Schiefe und Kurtosis mit returns.skew() und returns.kurt() an (pandas liefert die Exzess-Kurtosis, 0 bedeutet also normalverteilungsähnliche Ränder).

Exportieren

fig.savefig('equity.png', dpi=150, bbox_inches='tight') schreibt ein Rasterbild; Pixelgröße = Zoll × DPI, eine Grafik von 10 × 6 Zoll bei 150 DPI hat also 1,500 × 900 Pixel. Verwenden Sie .svg oder .pdf für Vektorausgaben, die in einem Bericht scharf bleiben, und bbox_inches='tight', um weiße Ränder abzuschneiden. Rufen Sie nach dem Speichern innerhalb einer Schleife immer plt.close(fig) auf, sonst hält ein Skript, das 40 Watchlist-Charts erzeugt (Lektion 12), 40 Grafiken im Arbeitsspeicher. Legen Sie Standardwerte einmal mit plt.rcParams['figure.dpi'] = 110 fest statt in jedem Aufruf.

Durchgerechnetes Beispiel

Hypothetisches Beispiel: eine Equity-Reihe aus einem Backtest (Euro, erfunden) und ihr Chart. Gebühren und Steuern sind in den Equity-Werten nicht berücksichtigt.

  1. Equity zum Jahresende: €10,000, €13,000, €11,700, €16,000, €24,000. Drawdown-Reihe: Hochs 10,000; 13,000; 13,000; 16,000; 24,000 → Drawdowns 0; 0; 11,700 / 13,000 − 1 = −10.0 %; 0; 0. Maximaler Drawdown −10 %, Zeit unter Wasser etwa ein Jahr.
  2. Auf einer linearen Achse dominiert das letzte Segment (+€8,000) das Bild; auf einer logarithmischen Achse erscheinen die Schritte +30 %, −10 %, +36.8 %, +50 % in ihrer wahren relativen Größe, und das Jahr mit −10 % ist sichtbar, statt plattgedrückt zu werden.
  3. Tagesrenditen: Mittelwert 0.06 %, Standardabweichung 1.1 %, Exzess-Kurtosis 4.2. Eine Normalverteilung mit dieser Standardabweichung würde einen Tag mit −3.3 % (drei Standardabweichungen) etwa einmal in 740 Tagen erwarten lassen; das Histogramm zeigt sieben solcher Tage in 1,000. Diese Lücke ist der Fat Tail, und sie ist der Grund, warum Stops durch Kurslücken übersprungen werden können (Lektion 8).
  4. Export: figsize=(8, 5) bei dpi=200 ergibt 1,600 × 1,000 Pixel, genug für eine Folie; dieselbe Grafik als SVG gespeichert ist auflösungsunabhängig und oft kleiner als 100 kB.

Häufiger Fehler

Equity auf linearer Skala plotten und eine „Beschleunigung“ hineinlesenEine Strategie mit konstant 15 % Jahresrendite erzeugt auf linearer Skala einen Chart, der immer steiler nach oben gekrümmt ist, was wie eine sich verbessernde Performance aussieht. Auf logarithmischer Skala ist er eine Gerade. Vergleichen Sie Strategien, Zeiträume und Drawdowns auf einer logarithmischen Equity-Achse; verwenden Sie die lineare Achse nur für kurze Zeiträume oder um Eurobeträge zu zeigen.

Übungsaufgabe

Auf Papier: (a) Eine Equity-Kurve verläuft 20,000 → 26,000 → 19,500 → 28,000 (in Euro, vier Punkte). Berechnen Sie den Drawdown an jedem Punkt. (b) Sie möchten eine Grafik mit genau 1,200 × 800 Pixeln bei 100 DPI; welche figsize übergeben Sie? (c) Das Histogramm der R-Multiples einer Strategie hat seinen höchsten Balken zwischen +0.2R und +0.4R und einen dünnen linken Rand, der bis −6R reicht. Schreiben Sie einen Satz dazu, was diese Form über die Strategie aussagt und welches Risiko eine Sharpe Ratio nicht zeigen würde.

Lösung anzeigen

(a) Hochs: 20,000; 26,000; 26,000; 28,000. Drawdowns: 0; 0; 19,500 / 26,000 − 1 = −25.0 %; 0.

(b) figsize = (1,200 / 100, 800 / 100) = (12, 8) Zoll.

(c) Viele kleine Gewinne und seltene sehr große Verluste sind das Profil einer Strategie, die Risiko verkauft (zum Beispiel Optionen schreiben oder Verluste verbilligen); die Sharpe Ratio, gebildet aus einem Durchschnitt und einer Standardabweichung, wird durch die häufigen kleinen Gewinne nach oben gezogen und unterschätzt die Wahrscheinlichkeit eines Tages mit −6R, der die Gewinne von Monaten auslöscht.

Einschränkungen: Ein Histogramm mit weniger als etwa 100 Beobachtungen ist zu verrauscht, um die Form der Ränder zu beurteilen; geben Sie stattdessen die tatsächlich schlechtesten Werte an.

Kernaussagen

  • Verwenden Sie plt.subplots mit gemeinsamen x-Achsen für Kurs-, Indikator-, Equity- und Drawdown-Panels; beschriften Sie die Einheiten.
  • Equity auf logarithmischer Skala zeigt prozentuale Bewegungen ehrlich; Drawdown-Charts zeigen Tiefe und Zeit unter Wasser.
  • Histogramme von Renditen oder R-Multiples offenbaren Fat Tails und Asymmetrie, die zusammenfassende Statistiken verbergen.
  • Pixel = Zoll × DPI; bevorzugen Sie SVG oder PDF für Berichte und schließen Sie Grafiken innerhalb von Schleifen.

Nächster Schritt

Lektion 11 geht von einem Instrument zu mehreren über: Korrelations- und Kovarianzmatrizen, Portfoliovolatilität aus Gewichten und eine Rebalancing-Simulation in pandas.

Selbsttest

Beantworten Sie die Fragen und prüfen Sie dann Ihre Antworten. Sie können es so oft wiederholen, wie Sie möchten.

1. Sie rufen fig.savefig('out.png', dpi=300) für eine Grafik auf, die mit figsize=(6, 4) erstellt wurde. Welche Pixelgröße hat das Bild?

2. Zwei Strategien lassen beide €10,000 über zehn Jahre auf €40,000 wachsen. Auf einem Equity-Chart mit logarithmischer Skala ist Strategie A nahezu eine Gerade, während Strategie B acht Jahre lang flach verläuft und dann steil ansteigt. Was sagt Ihnen das?

3. Ein Skript erzeugt für eine Watchlist mit 60 Werten einen Chart pro Ticker und wird bei jedem Lauf langsamer und verbraucht mehr Arbeitsspeicher. Was ist die wahrscheinlichste Lösung?

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.