6. Backtesting-Engine und Leistung

In diesem Kapitel wird erklärt, wie die Backtesting-Engine von qteasy aus der Perspektive von Nutzung und Ergebnissen funktioniert und wie Leistung und Vektorisierung implementiert werden, um Benutzern zu helfen, zu verstehen, woher Backtest-Geschwindigkeit und -Korrektheit kommen. Eine Erklärung der Architektur auf niedrigerer Ebene finden Sie unter Backtesting Engine and Performance (Design Perspective) in „Architektur und Design“.

6.1. 1. 回测引擎概览

Der Backtest-Einstiegspunkt und der Workflow wurden in Backtest-Übersicht und So führen Sie einen Backtest aus beschrieben: Gehen Sie über „qt.run(op, mode=1, …)“ in den Backtest-Modus und führen Sie intern bei jedem Zeitschritt in group_timing_table die Strategie aus, analysieren Sie Signale und simulieren Sie Ausführungen.

Im Gegensatz zu „bar-by-bar-ereignisgesteuerten“ oder „einmaligen Matrixoperationen über die gesamte Zeitachse“ verwendet qteasy zeitdimensioniertes sequentielles Schritten mit instrumentendimensionierter Vektorisierung innerhalb jedes Schritts:

  • Zeitdimension: Führen Sie jeden Zeitschritt in echter Handelsrhythmusreihenfolge aus, um Zustände wie Bargeld, Positionen und die Abwicklungswarteschlange (z. B. T+1) korrekt beizubehalten.

  • Instrumentendimension: Führen Sie innerhalb jedes Zeitschritts vektorisierte Berechnungen (NumPy-Arrays + Numba-Beschleunigung) für alle Instrumente im Asset-Pool durch – Kauf-/Verkaufsvolumina, Gebühren, Positionsaktualisierungen usw. – und erzielen Sie so eine hohe Effizienz pro Schritt.

Dies stellt sowohl sicher, dass Zustände und Regeln mit dem Live-Handel konsistent sind, als auch vermeidet den Leistungsverlust, der durch Schleifen pro Tick bei einem rein ereignisgesteuerten Ansatz verursacht wird.

6.2. 2. 性能与向量化

2.1 Kernberechnungsbeschleunigung

Die folgenden Kernfunktionen beim Backtesting und der Handelsergebnisberechnung werden alle mit Numba JIT (@njit(nogil=True, Cache=True)) beschleunigt:

  • backtest_step: Berechnen Sie in einem einzigen Schritt Kauf-/Verkaufsvolumina, Gebühren, Positionen und Abwicklungsaktualisierungen für den gesamten Satz von Instrumenten.

  • calculate_trade_results: Handelsergebnisse und Cashflow-Berechnung.

  • backtest_batch_steps: Schleife über Zeitschritte in Numba und rufe „backtest_step“ auf, um das gesamte Backtest-Segment abzuschließen.

  • backtest_flash_steps: Wird nur im Optimierungsmodus verwendet; Behält nur das endgültige Bargeld und die Positionen, um Speicherplatz zu sparen, und führt auch Batch-Stepping innerhalb von Numba durch.

Beim Mischen von Signalen (z. B. Zusammenführen mehrerer Strategien) wird für einige Operatoren im Modul „blender“ auch die „@njit“-Beschleunigung verwendet. Daher wird die Haupt-Backtesting-Engine mit Vektorisierung + Numba und nicht mit reinen Python-Schleifen implementiert.

2.2 Zeitdimensionale Ordnung und Vektorisierung entlang der Instrumentendimension

Dimension

Ansatzübersicht

Zeitdimension

Gehen Sie nacheinander vor, um Zustände wie T+1, Abwicklungszyklen, MOQ usw. im Einklang mit dem Live-Handel korrekt beizubehalten.

Instrumentendimension

Führen Sie Array-Operationen für alle Instrumente in einem einzigen Schritt durch (z. B. „op_signal“, „own_amounts“ usw. sind 1D-Arrays), um eine Vektorisierung zu erreichen.

Optimierungsmodus

Mehrere Parametersätze werden über Multiprocessing parallel zurückgetestet; Innerhalb jedes Satzes werden effiziente Pfade wie „backtest_flash_steps“ verwendet, um Speicher und Rechenaufwand zu reduzieren.

Beim ersten Start oder wenn sich Parameter ändern, kompiliert Numba die relevanten Funktionen, was zu einer einmaligen Startverzögerung führen kann; Nachfolgende Backtests desselben Typs verwenden den Cache wieder und werden schneller ausgeführt.

2.3 Kurzer Vergleich mit VectorBT

Vergleichsartikel

qteasy

VectorBT

Zeitdimension

Gehen Sie sequentiell vorwärts, vektorisiert innerhalb jedes Schritts

Einmalige Matrixoperationen über die gesamte Zeitachse, ohne explizite Zeitschleife

Zustände und Einschränkungen

Behält explizit T+1, Abwicklung, MOQ usw. bei und passt so eng zum Live-Handel

Meist vereinfachte Aktienkurven; legt keinen Wert auf Abwicklung/MOQ

Anwendbare Szenarien

Wenn Sie A-Share-Regeln genau simulieren, mehrere Strategien zusammenführen und detaillierte Kosten und Abrechnungen modellieren müssen

Schnelles Screening umfangreicher Parameterkombinationen; forschungsorientiertes Backtesting

Unter der Prämisse, Zustandskorrektheit und konfigurierbare Regeln sicherzustellen, gleicht qteasy die Geschwindigkeit durch Zeitachsensequenzierung + Instrumentenachsenvektorisierung + Numba-Einzelschrittausführung aus; Die Multiparameter-Optimierung gleicht hingegen den Unterschied aus, dass „nicht die vollständige Matrix in einem einzigen Lauf übertragen werden kann“ durch Multiprozessor-Parallelität.

6.3. 3. 本目录与相关文档