Du hast mir letzte Woche dein Notebook geschickt: dasselbe Signal, dasselbe Universum, dieselben 14 Monate BTCUSDT-Perp-Daten. Nur die Ausführung war anders. Du hast aufgehört, den Spread zu überqueren, und hast stattdessen Gebote einen Tick innerhalb des Spreads platziert. Die Sharpe Ratio stieg von 0.42 auf 2.14. Du hast gefragt, ob das echt ist oder ob du etwas kaputt gemacht hast.
Du hast etwas kaputt gemacht. Ich möchte dir genau zeigen, wo, denn der Bug steckt in einer Zeile und die Lektion dahinter ist viel größer als diese Zeile.
Hier ist deine Ausführungsregel, direkt aus deiner Engine kopiert:
if bar.low <= limit_price: fill(limit_price)
Das besagt: Wenn während dieser Minute ein Trade am oder unter meinem Preis ausgeführt wurde, wurde meine Order zu meinem Preis ausgeführt. Tatsächlich bildet es ab, dass der Preis dein Niveau berührt hat. Berühren ist nicht Ausführen. Dazwischen liegt eine Queue, und du hast sie als leer modelliert.
Was vor dir liegt
Wenn du bei 84,120.0 für den BTCUSDT-Perp ein Gebot platzierst, reihst du dich hinter allem ein, was dort bereits liegt. Auf der besten Geld-Brief-Stufe dieses Kontrakts sind das je nach Tageszeit normalerweise zwischen 4 und 30 BTC; der Median in deinem Stichprobenzeitraum liegt bei etwa 12 BTC. Deine Order umfasst 0.4 BTC. Damit dein Trade ausgeführt wird, müssen Verkäufer dieses Niveau mit ausreichend Gesamtvolumen treffen, um alle vor dir Eingereihten abzuräumen. Und zwar bevor die Orders dort zurückgezogen werden oder der Markt davonläuft.
Dein Backtest sollte also nicht fragen: „Hat der Preis 84,120.0 erreicht?“, sondern: „Wurden mindestens 12.4 BTC an Market-Sells zu 84,120.0 ausgeführt, während meine Order dort lag?“ Das sind völlig unterschiedliche Ereignisse. In deinen Daten unterscheiden sie sich um ungefähr den Faktor 3.
Drei Ausführungsregeln, drei unterschiedliche Strategien
Ich habe dein Signal mit denselben Einstiegen und 3 Ausführungsmodellen erneut durchlaufen lassen. Dasselbe Alpha, dieselben Gebühren, dasselbe Funding. Nur die Ausführungslogik hat sich geändert.
| Ausführungsregel | Ausführungen | Mittlere 60s-Kursbewegung nach Ausführung | Sharpe Ratio |
|---|---|---|---|
Berührung: low <= limit | 4,180 | +2.6 bp | 2.14 |
Strikte Überschreitung: low < limit - 1 tick | 1,712 | +0.4 bp | 0.61 |
| Queue-Simulation anhand des Volumens am Preisniveau | 1,306 | +0.9 bp | 0.77 |
Die mittlere Zeile zeigt die grobe Korrektur, zu der alle zuerst greifen: Eine Ausführung zählt nur, wenn der Markt tatsächlich über deinen Preis hinaus gehandelt hat – nach der Logik, dass der Markt dich zwangsläufig abgeräumt haben muss, wenn er an dir vorbeigegangen ist. Das ist grundsätzlich richtig und macht den Großteil der Illusion zunichte. Gleichzeitig ist diese Methode auf unschöne Weise verzerrt, dazu komme ich noch.
Die untere Zeile ist die Methode, die du implementieren solltest. Dafür brauchst du weder einen L3-Feed noch eine Rekonstruktion einzelner Orders. Das meiste davon hast du bereits.
Eine Queue-Simulation auf Basis von aggTrades
Zieh den aggregierten Trade-Stream statt Klines heran. Jeder Trade enthält Preis, Menge, Zeitstempel und ein Maker-Flag, an dem du erkennst, ob der Aggressor gekauft oder verkauft hat. Das reicht für eine brauchbare Simulation deiner eigenen passiven Order:
- Wenn deine Order platziert wird, speichere die dort ruhende Menge zu deinem Preis. Wenn du nur einen 100ms-Orderbuch-Feed hast, nimm den letzten Snapshot. Der Fehler ist klein im Vergleich zu dem, den du gerade korrigierst.
- Setze
queue_ahead = resting_size. Sei pessimistisch und nimm an, dass du ganz hinten stehst. Das tust du, sofern du nicht selbst das Preisniveau erzeugst. - Gehe den Trade-Stream durch. Jeder Trade mit Verkaufsaggressor zu deinem Preis oder darunter verringert
queue_aheadum seine Menge. Sobald der Wert negativ wird, ist deine Order ausgeführt – zu deinem Preis und zu diesem Zeitstempel. - Wenn sich der Preis um einen Tick entfernt, setze die Queue nicht auf 0 zurück. Lass sie schrumpfen. Einige der vor dir liegenden Orders werden storniert, wenn das Niveau veraltet, andere nicht. Eine Schrumpfung um 30-40% pro voller Sekunde außerhalb des Preisniveaus stimmte besser mit meinen Rekonstruktionen überein als die beiden Extremannahmen.
- Wenn deine Strategie die Order stornieren und neu platzieren würde, simuliere die neue Order als neue Order ganz hinten in der neuen Queue. Diesen Schritt lassen viele aus, und genau dort steckt die verbleibende Illusion.
Bei Schritt 2 wirst du mir widersprechen wollen. Ja, manchmal stehst du weit vorne, weil du die Order genau dann platziert hast, als das Preisniveau entstanden ist. Gut – miss es, statt es einfach anzunehmen. Protokolliere die ruhende Menge zum Zeitpunkt der Platzierung und lass die Daten zeigen, welcher Anteil deiner Orders tatsächlich früh dran ist. In deiner Strategie waren es 11%, denn dein Signal kommt nach einer Kursbewegung. Das heißt: Das Preisniveau, dem du dich anschließt, besteht bereits und ist schon gut besucht.
Die Ausführungen, die du lieber nicht bekommen hättest
Jetzt kommt der wirklich wichtige Teil und der Grund, warum die Regel der strikten Überschreitung verzerrt ist.
Überlege, wann dein Gebot vollständig abgeräumt wird. Das passiert, wenn der Verkaufsdruck groß genug ist, das gesamte Preisniveau abzuräumen. Per Definition ist das der Moment, in dem sich der Markt durch deinen Preis nach unten bewegt. Bei den Ausführungen, deren Zustandekommen am sichersten ist, gerätst du sofort ins Minus.
Teile deine Ausführungen danach auf, wie sie zustande kamen, und miss die Kursbewegung nach 60 Sekunden:
| Ausführungstyp | Anteil der Ausführungen | Kursbewegung nach 60s |
|---|---|---|
| Preisniveau gehandelt, Preis sprang nach oben | 38% | +3.1 bp |
| Preisniveau gehandelt, Preis blieb unverändert | 21% | +0.2 bp |
| Preis um 2+ Ticks unterschritten | 41% | −2.4 bp |
Dein naiver Backtest hat alle 3 Kategorien berücksichtigt und so getan, als wären ihre Ausführungen kostenlos. Die Regel der strikten Überschreitung liefert dir fast ausschließlich die dritte Kategorie. Deshalb ist ihr Edge stärker eingebrochen als bei der Queue-Simulation. Keine der beiden Regeln ist korrekt. Die Queue-Simulation ergibt eine realistische Mischung, und genau diese Mischung ist entscheidend: Bei passiver Ausführung verdienst du am Spread und zahlst dafür mit adverser Selektion. Das Verhältnis dieser beiden Faktoren ist deine eigentliche Strategie.
Die Denkweise vom alten Aktien-Desk passt noch immer: Eine Maker-Order ist eine kostenlose Option, die du dem Markt verkaufst. Ausgeübt wird sie, wenn es sich lohnt. Dein Backtest hat die Prämie kassiert und vergessen, dass die Option auch eine Auszahlungsseite hat.
Nicht erhaltene Ausführungen verändern die Strategie, nicht nur die Kosten
Das ist der Punkt, über den du meiner Meinung nach am meisten nachdenken solltest. Wenn du Taker-Ausführungen schlecht modellierst, erhältst du die richtigen Trades zum falschen Preis, und eine Gebührenkorrektur behebt den Großteil des Problems. Wenn du Maker-Ausführungen schlecht modellierst, erhältst du eine völlig falsche Auswahl an Trades. Ungefähr 2,900 deiner 4,180 Einstiege kamen nie zustande. Einige davon waren deine besten Signale – auf Kerzen, die kurz nach oben ausschlugen und dann umkehrten. Genau bei diesem Muster ist der Markt ohne dich davongelaufen.
Der Zweig für nicht ausgeführte Orders braucht also eine echte Logik. Was macht die Strategie, wenn die Order nicht ausgeführt wird, bevor das Signal veraltet ist? Jagst du dem Markt mit einer Taker-Order hinterher und zahlst Spread plus Marktimpact? Platzierst du eine neue Order weiter unten und akzeptierst damit eine andere Einstiegsbasis? Lässt du den Trade aus und bleibst flat? Jede dieser Entscheidungen erzeugt eine deutlich andere Equity-Kurve. Keine davon lautet „Nimm einfach an, dass die Order ausgeführt wurde.“ In unseren Durchläufen hat eine realistische Regel fürs Hinterherlaufen – nach 20 Sekunden ohne Ausführung den Spread überqueren, Slippage auf 3 bp begrenzen – etwa ein Drittel der fehlenden Trades und ungefähr die Hälfte des Abstands zwischen der naiven Sharpe Ratio und der der Queue-Simulation zurückgebracht. Das ist ein wirklich interessantes Ergebnis, das erst sichtbar wird, wenn das Ausführungsmodell realistisch genug ist, um die Frage sinnvoll beantworten zu können.
Ein einfacher Plausibilitätscheck, 10 Minuten: Nimm dein Live-Paper-Trading-Log und deinen Backtest für denselben Zeitraum. Vergleiche die Ausführungsquote, nicht den PnL. Wenn der Backtest 100% der ruhenden Orders ausführt und Paper-Trading 34%, vergleichst du keine Strategien – du hast einen Bug im Ausführungsmodell. Behebe ihn, bevor du dir auch nur eine einzige Renditezahl ansiehst.
Zwei kleinere Punkte noch
Post-only-Ablehnungen. Wenn du mit Post-only die Maker-Gebührenstufe sicherstellen willst und sich das Orderbuch zwischen deiner Entscheidung und der Bestätigung der Börse bewegt, wird die Order abgelehnt, statt ins Orderbuch gestellt zu werden. In unseren Paper-Trading-Logs betrifft das während normaler Handelszeiten 3-6% der Versuche auf BTCUSDT und in der Minute nach einer US-CPI-Veröffentlichung mehr als 15%. Eine abgelehnte Order ist weder eine ausgeführte Order noch eine ruhende, nicht ausgeführte Order: Dieser Trade hat nie existiert. Wenn dein Backtest diesen Zustand nicht abbildet, ist deine Trade-Anzahl gerade in den für dich wichtigsten Marktphasen zu hoch.
Self-Trade-Prevention und dein eigener Footprint. Bei 0.4 BTC bewegst du BTCUSDT nicht, also kannst du diesen Punkt auslassen. Du hast aber erwähnt, dass du die Strategie auf einem Perp-Kontrakt eines Altcoins mit mittlerer Marktkapitalisierung einsetzen willst, bei dem der Nominalwert auf der besten Preisstufe oft unter $15k liegt. Dort ist deine Order ein bedeutender Anteil der Queue, und der Wert für das Volumen vor dir, den du beim Platzieren speicherst, umfasst bereits den Effekt deiner letzten Order. Sobald deine Größe mehr als etwa 10% des ruhenden Volumens ausmacht, muss die Simulation berücksichtigen, dass andere Marktteilnehmer auf dich reagieren. Und ehrlich gesagt würde ich ab diesem Punkt dem Paper-Trading mehr vertrauen als jeder Simulation, die du oder ich schreiben können.
Lass die Strategie mit der Queue-Simulation erneut durchlaufen und schick mir die Tabelle mit der Kursbewegung, aufgeteilt nach Ausführungstyp. Wenn die Kategorie mit dem Kurssprung weiterhin den Großteil des Edge trägt und die Kategorie mit der Preisunterschreitung nicht alles zunichtemacht, hast du vielleicht etwas, das sich im Paper-Trading testen lässt. Wenn das Ganze auf den 2,900 Ausführungen beruhte, die du nie bekommen hättest, ist es besser, das jetzt zu erfahren als nach 4 Wochen, in denen du einem Paper-Trading-Konto zusiehst, das nicht tut, was das Notebook versprochen hat.
← Alle Beiträge

