7. Backtesting, Live-Handel und Optimierung: ein einheitlicher Einstiegspunkt und verschiedene Modi
7.1. 1. 统一入口
Benutzer lösen die Ausführung über **qt.run(op, mode=…, kwargs) aus. Intern wird es:
Kwargs mit der globalen Konfiguration in config (ConfigDict) zusammenführen.
Rufen Sie op.run(config, datasource, logger) auf und übergeben Sie die Standarddatenquelle und den Standardlogger von qteasy.
Modus bestimmt, welcher Zweig genommen werden soll:
mode=0: Live-Handelsmodus; tritt in den Trader-Workflow ein (geplante Auslöser, Abrufen von Echtzeitdaten, Generieren von Signalen, Erteilen von Bestellungen und Aufzeichnen).
mode=1: Backtest-Modus; erstellt einen Backtester, führt den Operator Schritt für Schritt gemäß der group_timing_table aus, simuliert Füllungen und gibt die Equity-Kurve und die Leistung aus.
mode=2: Optimierungsmodus. Der Optimierer durchsucht den Parameterraum; Jeder Parametersatz führt einen Backtest durch und die Ergebnisse werden entsprechend der Zielfunktion aggregiert.
mode=3/4: Modi wie Tracking und Prognose; siehe Dokumentation und API.
Daher verwendet derselbe Operator denselben Mechanismus des „Ausführens der Strategie nach Zeitschritt und Mischen von Signalen“ in verschiedenen Modi; Die einzigen Unterschiede bestehen in der Datenquelle und der Art und Weise, wie mit den Ergebnissen umgegangen wird.
7.2. 2. 配置(config)的作用
config umfasst das Vermögensuniversum, den Backtest-Zeitraum, Kostenparameter, den Kapitalplan usw.; Backtesting/Live-Handel/Optimierung haben dieselbe Konfigurationsstruktur. Zum Beispiel:
Asset-Pool, Asset-Typen und die Start-/Enddaten des Backtests;
Handelskosten (Gebührensätze, Mindestgebühren usw.);
Kapitalallokationsplan (invest_cash_amounts usw.);
Bezogen auf den Live-Handel (Konto, Broker-Typ usw.; wird verwendet, wenn Modus=0).
config wird durch Zusammenführen von **qt.run(…, kwargs) mit dem globalen QT_CONFIG erhalten und an op.run(config, …) übergeben; Backtester, Trader und Optimizer lesen jeweils die Felder, die sie benötigen.
7.3. 3. 回测模式(mode=1)
Historische Daten vorbereiten: Rufen Sie basierend auf dem Asset-Universum, dem Backtest-Zeitraum in der Konfiguration und den Datentypen und Fensterlängen aller Strategien innerhalb des Operator check_and_prepare_backtest_data und dergleichen auf, um die erforderlichen historischen Daten aus dem DataSource abzurufen und zusammenzustellen (einschließlich ausreichender Lookback-Historie, um den Beginn des Zeitraums abzudecken).
Erstellen Sie den Backtester: Übergeben Sie Operator, Vermögensliste, Kapitalplan, Handelspreisdaten, Kostenparameter usw., um eine Backtester-Instanz zu erstellen.
Zweigauswahl: Wenn op.check_dynamic_data() False ist (die Strategie hängt nicht von Prozessdaten ab), nehmen Sie den statischen Zweig: alle Signale auf einmal generieren, dann einen Numba-vektorisierten Backtest ausführen; Wenn True (die Strategie verwendet „get_data(‚proc.xxx‘)“ oder ältere dynamische Datentypen), nehmen Sie den dynamischen Zweig: Signale Schritt für Schritt generieren, Füllungen Schritt für Schritt simulieren und Prozessdaten aktualisieren, damit die Strategie im nächsten Schritt verwendet werden kann. Weitere Informationen finden Sie unter Prozessdaten (proc.*) und dynamisches Backtesting.
Schritt für Schritt ausführen: Rufen Sie für jeden Zeitschritt in group_timing_table op.run_strategies(steps) (oder eine gleichwertige Schnittstelle) auf, um (signal_type, signal) für jeden Schritt abzurufen.
Auffüllungen analysieren und simulieren: Signale nach Signaltyp (PT/PS/VS) in Kauf-/Verkaufsabsichten analysieren, dann Logik wie backtest_step verwenden, um Positionen, Bargeld und die Abwicklungswarteschlange zu aktualisieren und so die tägliche Aktienkurve und Handelsaufzeichnungen zu erstellen.
Bewertung und Ausgabe: Bewerten Sie die Leistung der Aktienkurve und der Handelsaufzeichnungen (z. B. Sharpe Ratio, Drawdown usw.), geben Sie die Ergebnisse an den Benutzer zurück und erstellen Sie optional Berichte und Diagramme.
7.4. 4. 实盘模式(mode=0)
Trader enthält Operator und Konfiguration und löst Aufgaben zu bestimmten Zeiten innerhalb von Handelstagen gemäß run_freq, run_timing und dem Handelskalender aus.
Daten für die aktuelle Zeit abrufen: Rufen Sie basierend auf den Strategiedeklarationen das für den aktuellen Schritt erforderliche Datenfenster vom DataSource (oder einer Echtzeitschnittstelle) ab.
Führen Sie Operator aus: Rufen Sie in diesem Schritt Operator auf, um Signale zu generieren (derselbe run_strategy-Ablauf wie beim Backtesting).
Orders analysieren und aufgeben: Signale in Orders analysieren, sie zur Ausführung an den Broker übergeben (simuliert oder über eine Live-Broker-Schnittstelle) und Ausführungen und Positionen aufzeichnen.
7.5. 5. 优化模式(mode=2)
Der Optimierer bestimmt den Parameterraum (z. B. Rastersuche, Zufallsstichprobe, genetische Algorithmen usw.) basierend auf den Parameter-Definitionen der Strategie.
Für jeden Parametersatz: Schreiben Sie die Parameter über set_parameter und dergleichen in den Operator und führen Sie dann einen Backtest durch (d. h. den Modus=1-Workflow).
Berechnen Sie die Zielfunktion (z. B. Sharpe-Ratio, Return-to-Drawdown-Verhältnis usw.) aus den Backtest-Ergebnissen und aggregieren Sie die Ergebnisse aller Parameterkombinationen.
Es gibt bessere Parameterkombinationen und die entsprechenden Backtest-Ergebnisse aus, aus denen Benutzer auswählen können.
7.6. 6. 小结
Backtesting, Live-Handel und Optimierung teilen den Mechanismus „Operator + schrittweise Ausführung im Laufe der Zeit“: Sie alle bereiten zuerst Daten vor und konfigurieren sie, rufen dann die Strategie Schritt für Schritt gemäß group_timing_table auf und mischen Signale. Die einzigen Unterschiede sind: Beim Backtesting werden historische Daten und Backtester verwendet, um Füllungen zu simulieren. Beim Live-Handel werden Echtzeitdaten und Trader/Broker zur Ausführung von Aufträgen verwendet. Die Optimierung führt mehrere Backtests durch und vergleicht die Zielfunktion. Weitere Parameter und deren Verwendung finden Sie im „Benutzerhandbuch“, „Backtest und Bewertung von Handelsstrategien“, „Handelsstrategien optimieren“ und in der API-Referenz.