Python Quantitatives Backtesting

Backtesting ist der Prozess der Simulation und Bewertung einer Handelsstrategie anhand historischer Marktdaten.

In der quantitativen Finanzwirtschaft und im algorithmischen Handel ist Backtesting ein zentraler Schritt, um die Performance einer Handelsstrategie anhand vergangenen Marktverhaltens zu bewerten.

Durch Backtesting können Händler verstehen, wie sich ihre Strategien unter verschiedenen Marktbedingungen verhalten, und sie optimieren und verbessern.

Backtesting umfasst typischerweise die folgenden Schritte:

  • Handelsstrategie definieren:Legen Sie die Regeln fest, wann Positionen gekauft, verkauft oder gehalten werden. Dies kann verschiedene Strategien wie technische Indikatoren, Gleitende-Durchschnitt-Strategien, Trendfolge, Arbitrage und mehr umfassen.

  • Historische Daten beschaffen:Rufen Sie vergangene Marktdaten ab, einschließlich Preisen und Handelsvolumina für Finanzinstrumente wie Aktien, Futures und Devisen.

  • Handel simulieren:Simulieren Sie auf Grundlage der definierten Strategie die Ausführung von Trades mit historischen Daten. Dazu gehört die Bestimmung, wann gekauft oder verkauft wird, sowie die Berechnung der Gewinne und Verluste jedes Trades.

  • Performance-Kennzahlen berechnen:Berechnen Sie auf Grundlage der Backtest-Ergebnisse verschiedene Performance-Kennzahlen wie annualisierte Rendite, maximaler Drawdown, Sharpe Ratio usw., um die Performance der Strategie zu bewerten.

  • Strategie optimieren:Wenn die Backtest-Ergebnisse unbefriedigend sind, können Händler die Strategie optimieren, indem sie Parameter anpassen oder Regeln ändern, und den Backtest dann erneut ausführen.

  • Test auf Look-ahead-Bias:Ein zentrales Problem beim Backtesting ist die Verhinderung des Durchsickerns zukünftiger Daten. Der Test auf Look-ahead-Bias stellt sicher, dass bei der Entwicklung und Bewertung einer Strategie nur ein Teil der historischen Daten verwendet wird, um die Situation im tatsächlichen Handel zu simulieren, in der nur bekannte Informationen verwendet werden können.

Als Nächstes folgt Beispielcode für das Backtesting einer einfachen Crossover-Strategie mit gleitendem Durchschnitt:

Beispiel

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

# Aktiendaten abrufen
symbol = "600519.SS"  # Aktiencode für Moutai
start_date = "2019-01-01"
end_date = "2021-01-01"

data = yf.download(symbol, start=start_date, end=end_date)

# Berechne gleitenden Durchschnitt
data['SMA_50'] = data['Close'].rolling(window=50).mean()
data['SMA_200'] = data['Close'].rolling(window=200).mean()

# Crossover-Signal-Spalte initialisieren
data['Signal'] = 0

# Crossover-Signale berechnen
data.loc[data['SMA_50'] > data['SMA_200'], 'Signal'] = 1
data.loc[data['SMA_50'] < data['SMA_200'], 'Signal'] = -1

# Tagesrenditen berechnen
data['Daily_Return'] = data['Close'].pct_change()

# Berechne die Rendite des Strategiesignals (shift(1) wird verwendet, um Look-Ahead-Bias zu vermeiden)
data['Strategy_Return'] = data['Signal'].shift(1) * data['Daily_Return']

# Kumulierte Renditen berechnen
data['Cumulative_Return'] = (1 + data['Strategy_Return']).cumprod()

# Kumulative Renditekurve plotten
plt.figure(figsize=(10, 6))
plt.plot(data['Cumulative_Return'], label='Kumulative Rendite der Strategie', color='b')
plt.plot(data['Close'] / data['Close'].iloc[0], label='Kumulative Rendite der Aktie', color='g')
plt.title("Kumulative Rendite der Strategie vs. Aktie")
plt.xlabel("Datum")
plt.ylabel("Kumulative Rendite")
plt.legend()
plt.show()

Das Ausführen des obigen Codes erzeugt die folgende Ausgabe:

Weitere Erweiterungen