Es gibt eine Frage, um die sich jeder Backtest herumdrückt: Hätte derselbe Code, live mit demselben Markt gefüttert, dasselbe getan? Mit noch mehr Backtesting lässt sie sich nicht beantworten. Beantworten lässt sie sich nur, indem man die Strategie gegen Live-Daten mit echter Ausführungssemantik laufen lässt und anschließend — Trade für Trade — prüft, ob beide Welten übereinstimmen. Genau diese Prüfung führen wir täglich automatisch durch, und sie ist der mit Abstand produktivste Bug-Finder der gesamten Plattform.
Tag eins: den Spiegel bauen
Jede promotete Strategie läuft in ihrem eigenen isolierten Live-Node und konsumiert echte Exchange-Streams: Live-Quotes für die Fills, echte Spreads, echte Handelszeiten. Kein geteilter State zwischen Strategien (diese Lektion haben wir auf die harte Tour gelernt — in einem gemeinsamen Node schwappten die Positionsabfragen einer Strategie in die einer anderen über). Jeder Fill wird zusammen mit dem Signalwert protokolliert, der ihn ausgelöst hat.
Jeden Morgen: Replay und Diff
Ein täglicher Job nimmt das Paper-Trading-Fenster jeder Strategie, schickt den identischen Code über denselben Zeitraum auf Katalogdaten durch die Backtest-Engine und ordnet die Fills eins zu eins zu: gleiche Seite, gleiche Zeitstempel-Toleranz, gleiche Größe. Heraus kommt keine Korrelation und kein Bauchgefühl, sondern eine Tabelle: matched, nur Paper, nur Replay. Eine gesunde Strategie liegt bei 54 von 55 Treffern. Eine kranke sagt Ihnen exakt, welcher Trade abgewichen ist und wann.
Was kaputtging, in der Reihenfolge des Kaputtgehens
- Warmup-Fills. Der Live-Node fütterte Historie ein, um Indikatoren aufzuwärmen — und Strategien mit eigenen Bar-Handlern handelten fröhlich darauf. Backtests haben diese Phantom-Einstiege nie gesehen. Der Fix saß in der Submission-Schicht, nicht in der Strategie, denn sonst erbt jede Strategie den Bug aufs Neue.
- Sequenzieller Multi-Leg-Warmup. Eine Cross-Sectional-Strategie wärmte ein Instrument nach dem anderen auf; jedes Leg sah leere Geschwister, und der Anker wurde nie initialisiert. Live handelte sie gar nichts, im Replay lief sie einwandfrei. Null gematchte Trades — aber nur der Diff hat das laut ausgesprochen.
- Crash-Loops durch Tick-Präzision. Live-aggTrade-Ticks kommen mit einer anderen Präzision an, als das Sandbox-Instrument erwartet. Der Node lief in eine Crash-Schleife an einer Assertion, die im Backtest niemals auslösen kann, weil Katalog-Bars bereits normalisiert sind.
- Restart-Amnesie. Prozess-Neustarts feuerten die Einstiegslogik erneut auf bereits bestehenden Positionen — bei einer Rebalancing-Strategie wurde aus einem Neustart klammheimlich ein Rebalance. Im Live-Handel ist das keine Fußnote zur Parität, sondern ein Warnsignal mit echtem Geld daran.
Man beachte das Muster: Kein einziger dieser Fälle ist ein Signal-Bug. Es sind allesamt Bugs an der Ausführungsgrenze — Warmup, State, Präzision, Neustarts. Genau für diese Fehlerklasse sind Backtests strukturell blind, denn im Backtest ist die Backtest-Engine die Ausführungsgrenze.
Die Asymmetrien, die wir bewusst beibehalten
Die beiden Welten sind absichtlich nicht identisch. Der Backtest berechnet einen modellierten halben Spread plus Wurzel-Impact innerhalb der PnL; Paper zahlt den echten Spread im Fill-Preis und kennt kein Impact-Modell. Den modellierten Spread zusätzlich im Paper anzusetzen (oder den echten im Backtest) würde doppelt zählen. Parität heißt gleiche Entscheidungen, gleiche Fills innerhalb der Toleranz — nicht bitgenau identische PnL. Zu wissen, welche Unterschiede prinzipientreu sind und welche Bugs, macht den größten Teil der Disziplin aus.
Ein Backtest ist eine Hypothese. Paper Trading ist das Experiment. Replay-Parität ist das Laborbuch, das Sie dabei erwischt, wie Sie sich selbst etwas vormachen.
Wenn Sie Strategien betreiben und nicht regelmäßig das Live-Verhalten gegen das Replay-Verhalten diffen, dann haben Sie eine ganze Bug-Kategorie, die Sie noch nie zu Gesicht bekommen haben. Wir finden etwa alle zwei Wochen einen — und jeder einzelne war aus dem Backtest heraus unsichtbar.
← Alle Beiträge
