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.
Was Sie lernen werden
- Das Muster
fig, ax = plt.subplots()und warum es der schnellen Abkürzungseries.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.
- 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.
- 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.
- 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).
- Export:
figsize=(8, 5)beidpi=200ergibt 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
Ü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.subplotsmit 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.
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.