Ein Backtest kann einen Fill zu einem Preis ausweisen, den der Markt nie angezeigt hat. Meist hat der Simulator anhand unvollständiger Daten eine plausibel wirkende Ausführung abgeleitet: aus dem Hoch und Tief einer Bar, einem Midpoint oder einem Limitpreis, den ein einzelner Trade berührt hat. Dadurch kann das Handelsprotokoll präzise aussehen, während verborgen bleibt, was der Markt tatsächlich geboten hat.
Frage zuerst, mit welchem Preis deine Order hätte interagieren können. Eine Last-Trade-Bar zeigt, zu welchen Preisen innerhalb eines Intervalls gehandelt wurde. Sie verrät nicht, wie Bid und Ask bei Eingang deiner Order standen, welche Menge dort verfügbar war oder ob deine Order an die Spitze der Queue hätte gelangen können.
Warum zeigt mein Backtest einen Fill außerhalb des Marktpreises?
Kläre zuerst, was „außerhalb“ bedeutet. Ein Buy-Fill unter dem Tief der Bar oder ein Sell-Fill über ihrem Hoch ist ein offensichtlicher Abrechnungs- oder Timingfehler. Auch ein Fill innerhalb der Hoch-Tief-Spanne kann fiktiv sein: Der Preis könnte gehandelt worden sein, bevor die Order existierte, auf der anderen Seite des Spreads oder in einer Menge, die für die Ausführung deiner Order zu klein war.
Nehmen wir eine 1-Minuten-Bar mit einem Open von 100.00, einem Tief von 99.80 und einem Close von 100.10. Deine Strategie sieht die abgeschlossene Bar, gibt eine Buy-Order auf und der Simulator führt sie zu 99.80 aus. Dieses Tief könnte nahe dem Beginn der Minute aufgetreten sein, 50 Sekunden vor dem Signal. Die Bar liefert keinen Beleg dafür, dass 99.80 nach der Entscheidung noch verfügbar war.
| Vorhandene Daten | Was sie belegen | Was sie nicht belegen |
|---|---|---|
| OHLCV-Bar | Beobachtete Handelspreisspanne und Volumen über ein Intervall | Preisabfolge, Bid und Ask oder Verfügbarkeit bei Eingang der Order |
| Trade Prints | Gemeldete Ausführungen mit Zeitstempeln und Preisen | Ruhende Liquidität oder deine Position in der Queue |
| Top-of-Book-Quotes | Bester angezeigter Bid und Ask zu abgetasteten Zeitpunkten | Tiefe jenseits des besten Preislevels oder ob ein Quote zwischen den Abtastungen bestehen blieb |
| Orderbuchereignisse | Änderungen der angezeigten Tiefe und Queue-Ereignisse, abhängig von der Feed-Abdeckung | Verborgene Liquidität, Zugang zum Handelsplatz oder garantierte Priorität |
Ein weiterer häufiger Grund ist die Verwechslung von Midpoint und ausführbaren Preisen. Bei einem Quote von 99.99 Bid und 100.01 Ask sieht ein Buy zum Midpoint von 100.00 im Bericht sauber aus. Bei einem Marketable Buy zahlst du in der Regel den Ask zuzüglich eines möglichen Preiseffekts durch die Ordergröße. Wer den Midpoint als Fill ansetzt, lässt stillschweigend die halbe Spreadbreite weg.
Kann eine Limit-Order ausgeführt werden, nur weil der Markt ihren Preis berührt hat?
Eine Berührung belegt, dass ein Trade zum Limitpreis ausgeführt wurde. Sie beweist nicht, dass deine ruhende Order ausgeführt worden wäre. Wenn andere Orders vor deiner lagen, war das Handelsvolumen zu diesem Preis möglicherweise zu klein, um deine Position in der Queue zu erreichen. Der Print könnte außerdem von einem anderen Handelsplatz stammen, während deine Order anderswo lag.
Angenommen, dein Buy-Limit liegt bei 50.00 und der Markt handelt nach deiner Orderaufgabe 200 Aktien zu diesem Preis. Ein Simulator, der nur auf eine Preisberührung achtet, führt alle 500 Aktien aus. Ein vorsichtigeres Modell fragt, wie viel nach Orderannahme zu oder unter 50.00 gehandelt wurde, und berücksichtigt dann eine geschätzte Queue vor deiner Order. Ohne Order-Level-Daten des Orderbuchs bleibt diese Queue eine Annahme. Sie sollte in den Ergebnissen sichtbar sein und nicht als Gewissheit untergeschoben werden.
Bei einem kleinen Research-System würde ich diese Annahme lieber ausdrücklich festhalten und eine Bandbreite testen, als so zu tun, als ließe sich die Queue-Priorität aus Candlestick-Daten ablesen. Die passende Bandbreite hängt vom Handelsplatz, der Ordergröße und der Handelsfrequenz der Strategie ab. Eine ruhige Aktie zur Markteröffnung und ein wenig liquider Krypto-Kontrakt um 03:00 UTC stellen unterschiedliche Ausführungsprobleme dar.
Wie wähle ich ein Fill-Modell für Bar-Daten aus?
Stimme das Modell sowohl auf die Daten als auch auf die Aussage ab, die deine Strategie belegen soll. Ein barbasierter Backtest kann für langsam handelnde Strategien weiterhin nützlich sein, aber seine Fills sollten berücksichtigen, was die Bars tatsächlich zeigen.
- Lege Entscheidungs- und Eingangszeitpunkt fest. Wenn ein Signal den Schlusskurs der Bar verwendet, gib die Order nach diesem Schluss auf. Simuliere die Ausführung ab dem nächsten verfügbaren Intervall oder Quote und nicht anhand des früheren Tiefs der bereits abgeschlossenen Bar.
- Verwende die richtige Seite des Spreads. Setze bei Marketable Buys zuerst den Ask an und bei Sells den Bid. Wenn du nur Trade-Bars hast, schätze den Spread anhand einer separaten Quelle oder weise darauf hin, dass das Modell ihn auslässt.
- Begrenze Fills auf plausible Liquidität. Begrenze die Teilnahme am beobachteten Volumen und berücksichtige Gebühren und Markteinfluss. Das Gesamtvolumen einer Bar bedeutet nicht, dass es vollständig zum gewählten Preis verfügbar war.
- Teste die Annahmen unter ungünstigen Bedingungen. Vergleiche Ausführungen zum nächsten Open mit konservativem Slippage und prüfe, ob das Ergebnis auch bei ungünstigerer Ausführung bestehen bleibt. Optimiere das Fill-Modell nicht so lange, bis die Strategie gewinnt.
Das sind Modellierungsentscheidungen und keine Anleitung, um aus unvollständigen Daten den einen wahren Fill zu rekonstruieren. Wenn die Strategie davon abhängt, wenige Basispunkte herauszuholen, reichen Bar-Daten möglicherweise nicht als Beleg für diese Aussage aus.
Wie finde ich heraus, an welcher Stelle der unmögliche Fill in den Backtest gelangt ist?
Verfolge einen verdächtigen Trade vom Signal bis zum Ledger. Halte Entscheidungszeitstempel, Zeitstempel der Orderaufgabe, simulierten Eingangszeitpunkt, ausgewählte Marktbeobachtung, Fill-Preis, Fill-Menge und Gebühr in separaten Feldern fest. Prüfe dann der Reihe nach:
- Wurde das Feature anhand von Daten aus einer Bar berechnet, die zum Entscheidungszeitpunkt noch nicht abgeschlossen war?
- Hat der Fill das Hoch, Tief oder den Schlusskurs der Bar verwendet, obwohl dieser Preis vor Eingang der Order auftrat?
- Wurde ein Buy mit dem Bid oder ein Sell mit dem Ask gematcht?
- War die simulierte Menge größer als die verfügbare Quote-Menge oder die Teilnahmeobergrenze des Modells?
- Wurden Preisrundung, Tickgröße des Kontrakts und Gebühren erst angewendet, nachdem der Fill-Preis ausgewählt wurde?
Wenn sich diese Fragen anhand des Trade-Datensatzes nicht beantworten lassen, fehlen dem Backtest Ausführungsbelege. Ergänze die Felder, spiele einige Trades anhand der Rohdaten von Hand nach und prüfe, ob der ausgewiesene Fill nach dem beabsichtigten Modell hätte stattfinden können. Eine glatte Equity-Kurve erkennt keinen Preis, der nur im Simulator existierte.
← Alle Beiträge


