11. Backtester Strategie-Backtesting-Engine
Die Klasse Backtester wird zum Backtesten von Operatorobjekten verwendet.
Die Attribute dieser Klasse umfassen alle für Backtest-Berechnungen erforderlichen Parameter sowie die beim Backtest generierten Ergebnisdaten. Diese Ergebnisdaten werden als Ndarrays gespeichert und für die gesamte Lebensdauer des Objekts aufbewahrt und können wiederholt aktualisiert werden.
Diese Klasse kann erst instanziiert werden, nachdem das Operatorobjekt erstellt wurde, da die Klasse Backtester vom Operatorobjekt abhängt, um Handelssignale zu generieren und Trades auszuführen. Typische Verwendung ist wie folgt:
operator = Operator( ... ) # 创建Operator对象
backtested = Operator.backtest( signal_count=100, share_count=10, **kwargs) # 创建Backtester对象
# get backtest raw results:
backtested.cash_investment_array
backtested.own_cashes
...
# get backtest results as DataFrame:
result_df = backtested.value_records()
trade_log_df = backtested.trade_logs()
trade_summary_df = backtested.trade_summary()
- class qteasy.backtest.Backtester(op: Operator, shares: list[str], cash_plan: CashPlan, cash_investment_array: ndarray, cash_inflation_array: ndarray, delivery_day_indicators: ndarray, cost_params: ndarray, signal_parsing_params: dict, trading_moq_params: dict, trading_delivery_params: dict, trade_price_data: ndarray, benchmark_data: Optional[Union[DataFrame, Series]] = None, evaluate_price_data: Optional[DataFrame] = None, enable_tracing: bool = False, logger: Optional[Logger] = None)[Quellcode]
Die Klasse Backtester wird zum Backtesten eines Operatorobjekts verwendet. Die Attribute dieser Klasse umfassen alle für Backtest-Berechnungen erforderlichen Parameter sowie die beim Backtest generierten Ergebnisdaten. Diese Ergebnisdaten werden als Ndarrays gespeichert und für die gesamte Lebensdauer des Objekts aufbewahrt und können wiederholt aktualisiert werden.
Diese Klasse kann erst instanziiert werden, nachdem das Operatorobjekt erstellt wurde, da die Klasse Backtester vom Operatorobjekt abhängt, um Handelssignale zu generieren und Trades auszuführen. Typische Verwendung ist wie folgt:
operator = Operator( ... ) # 创建Operator对象 backtested = Operator.backtest( signal_count=100, share_count=10, **kwargs) # 创建Backtester对象 # get backtest raw results: backtested.cash_investment_array backtested.own_cashes ... # get backtest results as DataFrame: result_df = backtested.value_records() trade_log_df = backtested.trade_logs() trade_summary_df = backtested.trade_summary()
- op
Ein Handelsvorgangsobjekt, das die Logik zum Generieren von Handelssignalen und zum Ausführen von Geschäften enthält
- Type:
- clear_backtest_buffers()[Quellcode]
Löschen Sie die zwischengespeicherten Backtest-Ergebnisdaten und setzen Sie die Backtest-Ergebnisdaten auf ein leeres Array zurück, damit der Backtest neu berechnet werden kann.
- Rückgabetyp:
None
- evaluate_result(indicators: str) dict[Quellcode]
Erstellt einen Auswertungsbericht der Handelsergebnisse und speichert ihn im Attribut self.evaluate_result
- Parameter:
indicators (str) – Bewertungsmetriken für Backtest-Ergebnisse; Einzelheiten finden Sie in der Funktion qteasy.evaluate.evaluate()
- generate_trade_logs(save_to_file_path: Optional[str] = None) DataFrame[Quellcode]
Erstellen Sie ein Handelsprotokoll basierend auf den Backtest-Ergebnissen. Das Handelsprotokoll ist eine vollständige Handelsaufzeichnungsdatei, die für jede Handelsperiode die folgenden Informationen enthält.
Jede Handelsperiode enthält 8 Datenzeilen wie folgt:
„0, trade signal“: das Handelssignal der aktuellen Periode für jede Aktie
„1, price“: der aktuelle Handelspreis für jede Aktie
„2, traded amounts“: die gehandelte Menge für jede Aktie im aktuellen Zeitraum; 0, wenn kein Handel stattfindet
„3, cash changed“: der Bargeldwechselbetrag der aktuellen Periode für jede Aktie; negativ für Käufe und positiv für Verkäufe
„4, trade cost“: die Handelskosten der aktuellen Periode für jede Aktie
„5, own amounts“: die Bestandsmenge am Ende des Zeitraums für jede Aktie
„6, available amounts“: die verfügbare Menge am Ende des Zeitraums für jeden Bestand
„7, Zusammenfassung“: der Positionswert jeder Aktie für die aktuelle Periode, einschließlich zusammenfassender Daten (am Ende der aktuellen Periode gehaltene Barmittel, verfügbare Barmittel, Gesamtvermögenswert)
Die oben genannten Informationen werden in Form eines DataFrame gespeichert. Der Zeilenindex ist ein MultiIndex: Die erste/zweite Ebene sind die Zeit-/Strategiegruppenindizes und die dritte Ebene sind die 8 oben genannten Datenkategorien. Die Handelsprotokolldatei kann im CSV-Format mit dem Dateinamen „trade_log.csv“ gespeichert werden.
- Parameter:
save_to_file_path (str, optional) – Wenn ein Dateipfad angegeben ist, speichern Sie das Handelsprotokoll als CSV-Datei. Der Standardwert ist „Keine“.
- Rückgabe:
trade_log – Ergebnisdaten der Handelssimulation
- Rückgabetyp:
pd.DataFrame
- generate_trade_summary(share_names: Optional[list[str]] = None, save_to_file_path: Optional[str] = None) DataFrame[Quellcode]
Generieren Sie die Handelszusammenfassungstabelle (eine kompaktere Handelszusammenfassungstabelle, die die wichtigsten Informationen für jeden Handel enthält, für den Menschen besser lesbar dargestellt wird und Datensätze ohne Geschäfte herausfiltert). Der Funktionseingang trade_log_df ist der Rückgabewert der Funktion generic_trade_logs().
- Parameter:
share_names (list[str], optional) – Liste der Namen von Handelsinstrumenten; Wenn „Keine“, verwenden Sie „N/A“ als Namen.
save_to_file_path (str, optional) – Wenn ein Dateipfad angegeben ist, speichern Sie die Handelsübersichtstabelle als CSV-Datei. Der Standardwert ist None (keine Datei speichern).
- plot_result(plot_title: str, show_positions: bool, buy_sell_markers: bool) None[Quellcode]
Generieren Sie Handelsergebnisse in Diagrammform
- Parameter:
plot_title (str) – Der Diagrammtitel
show_positions (bool) – Ob Positionsintervallinformationen angezeigt werden sollen. Wenn die Einstellung „True“ ist, wird der Positionstyp für jedes Intervall im Renditekurvendiagramm als rote/grüne Bänder angezeigt (grün bedeutet das Halten einer Long-Position, rot bedeutet das Halten einer Short-Position). Je dunkler die Farbe, desto höher das Positionsverhältnis.
buy_sell_markers (bool) – Ob Kauf-/Verkaufspunkte im Renditekurvendiagramm angezeigt werden sollen. Bei der Einstellung „True“ werden Kauf-/Verkaufspunkte auf dem Renditekurvendiagramm mit kleinen roten/grünen Pfeilen markiert
- Rückgabetyp:
None
- report_result(trade_log: Optional[str] = None, trade_summary: Optional[str] = None) str[Quellcode]
Erstellen Sie einen detaillierten Bericht über die Backtest-Ergebnisse. Der Bericht liegt im Klartextformat vor und kann mit dem Druckbefehl ausgedruckt werden
- Parameter:
trade_log (str, optional) – Speicherpfad für die Handelsprotokolldatei. Der Standardwert ist „Keine“. Wenn dieser Pfad angegeben ist, wird der Speicherpfad des Handelsprotokolls im Bericht gedruckt
trade_summary (str, optional) – Speicherpfad für die Handelszusammenfassungsdatensatzdatei. Der Standardwert ist „Keine“. Falls angegeben, drucken Sie den Speicherpfad des Handelszusammenfassungsdatensatzes im Bericht aus.
- Rückgabe:
report_str – Backtest-Ergebnisbericht formatiert zum Drucken
- Rückgabetyp:
str
- run() Backtester[Quellcode]
Führen Sie die Backtest-Berechnungen durch, generieren Sie die Backtest-Ergebnisdaten und speichern Sie sie in den Attributen des Objekts
- save_complete_values(save_to_file_path: Optional[str] = None) Optional[str][Quellcode]
Complete_values als CSV-Datei speichern (von qt_operator aufgerufen, wenn trade_log=True)
- Parameter:
save_to_file_path (str, optional) – Pfad speichern; wenn None, wird nichts geschrieben
- Rückgabe:
Bei Erfolg den Speicherpfad zurückgeben; andernfalls wird None zurückgegeben
- Rückgabetyp:
str or None
- trace_result_df() Optional[DataFrame][Quellcode]
Erstellen Sie eine Aufzeichnung des Handelsvorgangs basierend auf den Backtest-Ergebnissen. Die Ausgabe erfolgt im DataFrame-Format
Die Ausrichtung zwischen Trace-Zeilen und op_signal_index wird beim Schreiben durch Operator sichergestellt (update_trace_step verwendet die globale Signalzeilennummer). Hier verketten wir nur nach Strategie und setzen dann den Index auf op_signal_index.
- Rückgabe:
trade_trace – Daten zum Handelssimulationsprozess
- Rückgabetyp:
pd.DataFrame
- trade_result_df() DataFrame[Quellcode]
Erstellen Sie Vermögenswertaufzeichnungen basierend auf den Backtest-Ergebnissen. Die Ausgabe erfolgt im DataFrame-Format.
- Rückgabe:
value_history – Ergebnisdaten der Handelssimulation
- Rückgabetyp:
pd.DataFrame
- trade_result_final_value()[Quellcode]
Berechnen Sie direkt und schnell das Endwertergebnis des Backtests und geben Sie es zurück.
- trade_result_max_drawdown()[Quellcode]
Berechnen Sie direkt und schnell das maximale Drawdown-Ergebnis des Backtests und geben Sie es zurück.
- trade_result_volatility()[Quellcode]
Berechnen Sie direkt und schnell das Volatilitätsergebnis des Backtests und geben Sie es zurück.