Dokumentation1.0 (latest)
SeitenBacktests · 16 / 29

Backtests

Verwenden Sie die Schaltfläche Test (Code ausführen) in der QuantCraft-IDE, um Run backtest zu öffnen. Dort legen Sie Symbole, Kursdaten, optionale Fundamentaldaten, das Simulationsfenster, das Startguthaben und die Ausführungskosten fest sowie (falls Ihr Skript sie nutzt) Eingabeparameter für einen Einzellauf. Die Engine ruft die Callbacks Ihres Strategie-Lebenszyklus auf. Ergebnisse erscheinen unter Testergebnisse; OHLCV erklärt die Balkenformen.

Oben im Dialogkörper können Sie mit Load oder Save eine Ausführungsvorlage (.qcs) wiederverwenden. Alles andere ist in bis zu drei Tabs gruppiert, sodass Sie das Formular durchgehen können, bevor Sie den Backtest starten.

Tabs des Dialogs Run backtest

TabWas Sie festlegen
ScriptWird nur angezeigt, wenn das Skript params.NAME-Eingaben deklariert. Parameterwerte sowie Optimize (Brute-Force-Raster oder genetische Suche). Siehe Eingabeparameter und Optimierung.
Symbol & dataPrice feed (Feed des verbundenen Brokers oder QuantCraft B2), Symbol source, Asset class, Bar timeframe (Broker-Feed) / Timeframe (B2), Additional timeframes (optional) für rt.get_bar, Min bars (optional) (Broker-Feed), Uses fundamentals (select if your strategy requires fundamental data), Include Fama-French factors (global) und Include calendar data (dividends, splits, earnings dates) (Premium / Gratisdaten-Ausnahme; standardmäßig an).
SimulationStart-/Enddatum (Standard: der letzte Monat), warmup bars (Standard 45), starting balance (Standard 100.000), Provisions- und Slippage-Modelle. Siehe Kontomodell.

Takt-/Primärsymbol: Im Dialog gibt es kein Bedienelement für ein Primärsymbol. Bei Selected symbols verwendet der Balkentakt eine SYMBOL-Konstante in Ihrem Skript (sofern dieser Ticker in der geladenen Liste ist), sonst das erste geladene Symbol. Bei Screener gibt es überhaupt kein Taktsymbol — die Symbolmenge ändert sich im Verlauf des Laufs, also lesen Sie die Historie jedes Tickers über dessen eigene bar.close[i]-Offsets. Siehe Strategie-Lebenszyklus.

Timer / on_timer: Der Dialog Run backtest legt kein Timer-Intervall fest. on_timer ist für Forward-/Bulk-/Chart-Forward-Läufe gedacht, die ein Timer-Bedienelement bieten — nicht für IDE-Backtests.


Kursquelle (Broker-Feed vs. B2)

Wählen Sie im Tab Symbol & data den Kurs-Feed:

  • Feed des verbundenen Brokers — Intraday- und Tages-Zeitrahmen sind verfügbar (erfordert ein verbundenes Broker-Konto mit in der App konfigurierten Zugangsdaten).
  • QuantCraft B2 — in einem kostenlosen Tarif sind nur die OHLCV-Zeitrahmen täglich (d), wöchentlich (w) und monatlich (m) verfügbar; Premium schaltet Intraday und erweiterte B2-Zeitrahmen frei. Sie müssen bei QuantCraft angemeldet sein, damit ein Sitzungstoken für B2-OHLCV (und für Fundamentaldaten, sofern aktiviert) gesendet werden kann.

Die Wahl wird in den Ausführungsvorlagen (.qcs) als ohlcvSource gespeichert ("alpaca" oder "b2").


Balken-Zeitrahmen und Anlageklasse (nur Broker-Feed)

Ist die Kursquelle der Feed des verbundenen Brokers, können Sie festlegen:

FeldZweck
Bar timeframeKerzenauflösung für den Lauf — z. B. 1 Tag, 1 Stunde, 4 Stunden, 1 Woche und mehrere Minutenbalken (1 / 5 / 15 / 30 Min).
Asset classUS equity oder Crypto — bestimmt, in welcher Symbolliste Sie suchen und wie der Broker die Daten abruft.
Min bars (optional)Wenn gesetzt, behält die Engine nach Anwendung des Zeitraums nur die N jüngsten Balken. Leer lassen, um den vollen durch Start- und Enddatum implizierten Bereich zu verwenden.

Ist die Kursquelle B2, wählen Sie nur den Timeframe: Daily, Weekly oder Monthly im kostenlosen Tarif; Premium ergänzt Intraday und erweiterte B2-Zeitrahmen (siehe die B2-Codes unter OHLCV- und Balkendaten).


Zusätzliche Zeitrahmen (optional)

Verwenden Sie Additional timeframes unter Symbol & data, um neben Ihrem primären Zeitrahmen weitere Balkengrößen zu laden. Im Strategiecode lesen Sie sie mit rt.get_bar(Timeframe.X, shift) — siehe OHLCV- und Balkendaten und Strategie-Lebenszyklus.

  • Wählen Sie beliebige zusätzliche Zeitrahmen, die Ihre Strategie braucht (z. B. täglich, wenn Ihr primärer Balken 5 Minuten ist).
  • Der primäre Zeitrahmen ist auch über rt.get_bar verfügbar, ohne dass er unter Additional timeframes aufgeführt werden muss.
  • Gibt None zurück, wenn dieser Zeitrahmen für den Lauf keinen Puffer hat, bei einer Screener-Quelle oder wenn Daten nicht verfügbar sind.
  • In einem Backtest sieht get_bar immer nur Balken bis zum aktuellen Schritt und liest stets die Balken des Taktsymbols — für die Historie eines anderen Tickers nutzen Sie dessen bar.close[i]-Offsets.
  • Die Einstellungen können in den Ausführungsvorlagen (.qcs) unter secondaryTimeframes gespeichert werden.

Symbole

Symbolquelle

Symbol source im Tab Symbol & data entscheidet, welche Ticker der Backtest handelt:

QuelleWas sie tut
Selected symbolsHandelt die feste Liste, die Sie wählen, plus alles, was Sie mit Paste tickers hinzufügen.
ScreenerFührt einen Screen im Verlauf des Backtests erneut aus und handelt, was an diesem Punkt der Simulation passte.

Bei gewähltem Screener konfigurieren Sie den Screen selbst:

EinstellungWas sie tut
Screener sourceScreener preset oder Python script.
Sort column / DirectionWie Preset-Treffer gerankt werden, bevor das Limit greift.
Rank directionBei Skripten — welches Ende Ihres rank()-Scores zuerst genommen wird.
LimitWie viele Symbole pro Rebalancing gehandelt werden. 0 nimmt jeden Treffer.
Refresh interval (days)Wie oft der Screen erneut läuft, in simulierten Kalendertagen. Skripte erfordern 7 Tage oder mehr.
Keep tickers with an open positionHält ein Symbol handelbar, nachdem es nicht mehr passt, sodass eine offene Position weiter verwaltet werden kann.

Grenzen eines Screener-gesteuerten Backtests: Er benötigt ausdrückliche Start- und Enddaten; zusätzliche Zeitrahmen werden nicht unterstützt; ein Screen per Python-Skript braucht ein Refresh interval von 7 Tagen oder mehr; und Debug Test unterstützt keine Screener-Quelle (es stoppt mit einer Meldung, zu Selected symbols zu wechseln). Bei aktivierten Fundamentaldaten erhält jedes gescreente Symbol seine Fundamentaldaten automatisch. Die Ergebnisse enthalten neben Logs einen Tab Screener Output, der jedes Rebalancing als einklappbares Datum mit den in diesem Zeitfenster gehandelten Symbolen zeigt. Siehe Screener zum Erstellen von Screens sowie zu Point-in-Time- und Survivorship-Details.

Selected symbols

Wählen Sie unter Symbol & data einen oder mehrere Ticker für den Lauf:

  • Beim Feed des verbundenen Brokers stammt die Liste aus dem Asset-Universum Ihres Brokers (Aktien oder Krypto je nach Asset class). Sie können suchen und mehrfach auswählen.
  • Bei B2 stammt die Liste aus demselben Katalog wie die Fundamentaldaten-Pfade auf dem Server.

Regeln:

  • Mindestens ein Symbol ist erforderlich.
  • Symbole werden für den Lauf in Großbuchstaben normalisiert.
  • Gültige Zeichen: Buchstaben, Ziffern, . und - (typisch für Börsensuffixe wie BRK.B oder RHM.XETRA).

Das erste Symbol in Ihrer Auswahlreihenfolge ist das standardmäßige Taktsymbol, es sei denn, Ihre Strategie setzt ein SYMBOL = "..." auf oberster Ebene, das zu einem geladenen Ticker passt. Der Dialog hat kein separates Bedienelement für ein Primärsymbol.


Fundamentaldaten (optional)

Aktivieren Sie unter Symbol & data die Option Uses fundamentals (select if your strategy requires fundamental data), wenn Ihre Strategie das Argument fundamentals in on_bar / on_tick (Backtest) oder in on_timer bei einem Forward-Lauf liest oder fundamentaldatenabhängige Logik nutzt.

Das Kontrollkästchen wird angezeigt, wenn die Fundamentaldaten-Funktionen für Ihren Build aktiviert sind, ist aber deaktiviert (mit einem Premium-Hinweis), sofern Sie nicht Premium haben oder der Gratisdaten-Zugang aktiviert ist. Bei aktivierten Fundamentaldaten:

  • Sie müssen angemeldet sein (das QuantCraft-Token wird gesendet, um B2-Fundamentaldaten-Dateien zu laden).
  • Wählen Sie ein oder mehrere Fundamentaldaten-Pakete aus der Mehrfachauswahl (Pfade wie fundamentals/AAPL.json.gz). Der Dialog zeigt unter jeder Auswahl den normalisierten Pfad.

Wichtig: OHLCV-Symbole und Fundamentaldaten-Symbole sind unabhängig. Sie können RNMBY über den Broker-Feed backtesten, während Sie die Fundamentaldaten von RHM.XETRA laden — die Oberfläche erinnert Sie daran, dass Sie in diesem Fall im Code den richtigen Ticker an fundamentals.current(..., symbol="RHM.XETRA") (oder Entsprechendes) übergeben müssen.

Sind mehrere Fundamentaldaten-Pakete ausgewählt, baut die Engine eine Zuordnung pro Pfad auf. Das primäre Fundamentaldaten-Paket für balkenausgerichtete Snapshots ist standardmäßig das gehandelte Symbol (oder das alphabetisch erste Paket); übergeben Sie in Multi-Symbol- und Screener-Läufen bei fundamentals.current / get_data_with_offset immer symbol=, da das primäre nicht der Ticker sein muss, bei dem Sie gerade sind.


Fama-French-Faktoren (optional)

Aktivieren Sie unter Symbol & data die Option Include Fama-French factors (global), wenn Ihre Strategie globale monatliche Faktorrenditen über fama_french.qc liest. Siehe Fama-French-Faktoren für die vollständige API.

Bei aktivierten Faktoren:

  • Sie benötigen Premium (oder Gratisdaten-Zugang, sofern aktiviert) und müssen angemeldet sein.
  • Das Kontrollkästchen ist standardmäßig an, wenn die Datenfreigabe es zulässt. Deaktivieren Sie es, um Faktordaten für diesen Lauf zu überspringen.
  • OHLCV-Symbole, Fundamentaldaten-Pakete und Fama-French-Faktoren sind unabhängig — aktivieren Sie jede benötigte Kombination.
  • Es gibt kein Callback-Argument factors= — importieren Sie quantcraft.fama_french und lesen Sie fama_french.qc innerhalb der Callbacks (on_init, on_bar, on_tick, …).

Kalenderdaten und Kapitalmaßnahmen (optional)

Unter Symbol & data fügt Include calendar data Ihrem Backtest Dividendenhistorie, Split-Historie, Ergebnistermine und SEC-Einreichungen hinzu. Es ist standardmäßig an, und Ihre Wahl wird für den nächsten Lauf gemerkt.

Warum das wichtig ist

Backtest-Kursbalken sind nicht adjustiert. Ohne Kalenderdaten erscheint ein 4-zu-1-Split als nächtlicher Kurseinbruch um 75 %, und Ihre simulierte Position bricht mit ein. Dividenden kommen außerdem nie an, was die Gesamtrendite jeder lange gehaltenen Position stillschweigend unterschätzt.

Unteroptionen

Zwei Unteroptionen steuern, wie Maßnahmen während der Simulation auf offene Positionen angewandt werden:

UnteroptionWas sie tut
Adjust positions for stock splitsAm Wirksamkeitsdatum des Splits wird die Aktienanzahl mit dem Verhältnis multipliziert und der Einstandspreis dadurch geteilt. Stop- und Zielkurse werden ebenfalls umskaliert. Da qty × entry_price unverändert bleibt, bleibt Ihre Eigenkapitalkurve über den Split hinweg stetig.
Credit dividends to cashAm Ex-Tag wird qty × amount bei Long-Positionen zum Bargeld addiert und bei Short-Positionen abgezogen (Leerverkäufer schulden dem Verleiher die Dividende). Das fließt in das Eigenkapital und alle Renditekennzahlen ein, aber nicht in realized_pnl.

Beide Unteroptionen sind standardmäßig an, wenn Kalenderdaten aktiviert sind.

Hinweis zur Ex-Tag-Schätzung: EDGAR veröffentlicht keine Ex-Dividenden-Tage. Sofern keine Börsendaten vorlagen, wird der Ex-Tag aus dem Deklarationsdatum geschätzt (auf etwa ±7 Tage genau) und in den Testergebnissen mit est. markiert. Geschätzte Dividenden werden standardmäßig gutgeschrieben; um sie zu überspringen, setzen Sie dividendDatePolicy in einer .qcs-Vorlage auf exact_only (oder off) — dafür gibt es kein Bedienelement im Dialog. Filtern Sie im Code nach d.estimated, wenn Ihre Strategie auf das genaue Datum empfindlich ist.

Screener-Universen

Kalenderdaten funktionieren mit einer Screener-Symbolquelle. Die Kalender werden geladen, sobald der Screen die vollständige Tickerliste aufgelöst hat; Symbole, die passen, aber keine Kursbalken haben, verursachen keine Kalenderanfrage. Ein breiter Screen kann Symbole ohne Kalender auf dem Server enthalten — das Lauf-Log meldet die Anzahl, statt zu scheitern.

Wo Sie es sehen

  • Ausgabebereich — eine [calendar]-Zeile pro im Lauf angewandter Kapitalmaßnahme, plus eine Zusammenfassungszeile am Ende.
  • Test Results — Split- und Dividend-Zeilen erscheinen mitten in der Tabelle der abgeschlossenen Trades (die dann Closed trades & events heißt) und zeigen Verhältnis bzw. Betrag je Aktie sowie die Bargeldauswirkung.

Siehe Kalenderdaten für die vollständige BacktestCalendar-API und das Callback-Argument calendar.


Simulation — Zeitraum, Saldo und Ausführungskosten

Alles Folgende befindet sich im Tab Simulation:

FeldZweck
Start datePflichtfeld (Standard: etwa vor einem Monat). Erster UTC-Kalendertag, der im Ausführungsfenster enthalten ist (YYYY-MM-DD).
End datePflichtfeld. Letzter UTC-Kalendertag, der enthalten ist. Muss am oder nach dem Startdatum liegen.
Warmup bars (indicators)Zusätzliche Balken, die vor dem Startdatum geladen werden (gleicher Zeitrahmen wie Ihre Balken), damit gleitende Durchschnitte und ähnliche Indikatoren Historie haben. Callbacks laufen weiterhin nur zwischen Start- und Enddatum. Standard ist 45; geben Sie 0 ein, um zusätzliches Warmup zu deaktivieren.
Starting balancePflichtfeld. Anfängliches Bargeld des simulierten PaperAccount (Standard 100.000).
Commission / slippageWie Ausführungen um Handelskosten angepasst werden — siehe unten und Kontomodell.

Der Dialog Run backtest konfiguriert kein Timer-Intervall. on_timer ist nur bei Forward-Läufen verfügbar (Chart Forward Test, Bulk Forward / QuantCloud), wenn timerIntervalMs gesetzt ist. Siehe Strategie-Lebenszyklus.

Optionales Standard-Stop-Loss / Take-Profit / Risiko-Sizing kann in .qcs-Vorlagen weiterhin vorkommen, wenn vorhanden, aber der Dialog Run backtest bietet derzeit keine SL/TP-/Risiko-Eingaben an. Konfigurieren Sie diese im Code oder über Vorlagen, wenn Ihre Hilfsfunktionen sie unterstützen — siehe Kontomodell und Ausführungsvorlagen (.qcs).

Provision und Slippage

EinstellungZweck
Commission modelPro Aktie (Standard), pro Trade oder null
Commission costKosten pro Aktie oder Pauschalgebühr pro Order ($) — Standard 0,001 $ pro Aktie
Minimum trade costUntergrenze pro Order bei Provision pro Aktie ($) — Standard 0 $
Slippage modelVolumenanteil (Standard), fester Spread oder null
Volume limit / Price impactParameter der Volumenanteil-Slippage (volume_limit verkleinert auch die Menge bei Eröffnungen)
SpreadGesamt-Spread pro Aktie für die Fixed-Spread-Slippage ($)

Simulationseinstellungen können in den Ausführungsvorlagen (.qcs) gespeichert werden.


Skriptparameter (Einzellauf)

Importiert Ihre Strategie from quantcraft.inputs import params (die älteren Pfade quantcraft.inputs_module / ide.inputs_module werden für bestehende Skripte weiterhin erkannt) und verweist auf params.NAME, zeigt der Dialog einen Tab Script mit einer Zeile pro erkanntem Namen: Parameter, Type (int / float / str / bool) und Value.

Füllen Sie vor dem Start jede Zeile aus — für jeden deklarierten Parameter ist ein Wert erforderlich. Sie werden als Strings gesendet und von der Engine umgewandelt, bevor Ihre Datei geladen wird, sodass params.PERIOD (zum Beispiel) beim Ausführen Ihres Moduls bereits den richtigen Python-Typ hat.

Im selben Tab können Sie Optimize für Raster- oder genetische Suche aktivieren — siehe Optimierung. Lassen Sie Optimize für einen normalen Einzel-Backtest deaktiviert.


Was beim Start des Laufs passiert

Die App validiert das Formular (Daten, Symbole, Saldo, Fundamentaldaten falls aktiviert und Typen der Skriptparameter). Bei Erfolg startet sie einen Backtest mit der zusammengestellten Konfiguration; Fortschritt und Logs erscheinen im Panel Output, strukturierte Ergebnisse öffnen sich in Test Results.


Kurzreferenz

ThemaWo es festgelegt wird
Broker-Feed vs. B2-KurseSymbol & data → Kurs-Feed (ohlcvSource in .qcs).
ZeitrahmenBar timeframe (Broker-Feed) oder Timeframe (B2: d / w / m im kostenlosen Tarif; mehr mit Premium).
Zusätzliche ZeitrahmenMehrfachauswahl Additional timeframes — für rt.get_bar(Timeframe.X, shift).
AnlageklasseUS equity / Crypto (nur Broker-Feed).
Auf die letzten N Balken kürzenMin bars (nur Broker-Feed, optional).
Was gehandelt wirdSymbol source: Selected symbols (Mehrfachauswahl) oder Screener (fundamentaldatengesteuerter Screen — siehe Screener).
TaktsymbolSkript-SYMBOL, falls geladen; sonst erstes Symbol (kein Bedienelement im Dialog); keines bei einer Screener-Quelle.
FinanzberichteUses fundamentals + Fundamentaldaten-Mehrfachauswahl (automatisch bei einer Screener-Quelle); erfordert Anmeldung.
Globale FaktorrenditenInclude Fama-French factors (global) — siehe Fama-French-Faktoren.
Dividenden, Splits, ErgebnistermineInclude calendar data — standardmäßig an; siehe Kalenderdaten.
KalenderfensterStart date / End date unter Simulation (Pflicht).
Indikatorhistorie vor dem StartWarmup bars unter Simulation.
StartguthabenStarting balance unter Simulation.
Provision / SlippageTab Simulation — siehe Kontomodell.
on_timerNicht in Run backtest — Forward-Läufe mit timerIntervalMs (Strategie-Lebenszyklus).
on_tickBacktest: vier synthetische OHLC-Ticks pro Balken (keine echte Tick-Historie). Forward-Läufe: jede Kursaktualisierung des Brokers — siehe Strategie-Lebenszyklus.
Anpassbare Werte im CodeTab Script (params.*), einzelne Werte pro Lauf (oder Optimize).

Tipps

  • Wenn Broker-Feed-Symbole nie laden, öffnen Sie einmal Trade oder prüfen Sie Ihre Broker-Verbindung; bei B2 prüfen Sie, ob Sie angemeldet sind und der Symbolkatalog geladen wurde.
  • Warmup erweitert nur die geladene Historie — es fügt keine Handelstage außerhalb Ihres Zeitraums hinzu.
  • Erwarten Sie on_timer nicht im IDE-Backtest — in diesem Dialog gibt es kein Timer-Bedienelement. Nutzen Sie stattdessen on_bar / on_tick. Timer gelten bei Forward-Läufen, wenn timerIntervalMs konfiguriert ist.
  • on_tick im Backtest verwendet synthetische OHLC-Werte aus jedem Balken (vier Aufrufe pro Balken) — keine echten Tickdaten. Testen Sie Live-Tick-Logik in Forward-Läufen (Strategie-Lebenszyklus).
  • Passen Sie Fundamentaldaten-Pakete an die Ticker an, die Sie im Code tatsächlich lesen, wenn sich OHLCV- und Fundamentaldaten-Ticker unterscheiden.
  • Verwenden Sie Min bars sparsam — man verkürzt einen Lauf leicht versehentlich stärker als beabsichtigt.
Backtests — Dokumentation (1.0 (latest)) | QuantCraft