4. September 2026 · Backtesting

Stop und Kursziel lagen in derselben Kerze. Für welches hat sich dein Backtest entschieden?

Stop und Kursziel lagen in derselben Kerze. Für welches hat sich dein Backtest entschieden?

Long-Einstieg bei 84,120. Stop bei 84,036, Kursziel bei 84,271. Die Kerze der nächsten Minute erscheint: Eröffnung 84,118, Hoch 84,290, Tief 84,010, Schluss 84,240.

Beide Marken liegen innerhalb dieser Kerze. Der Stop wurde berührt und das Kursziel wurde berührt, aber die 4 OHLC-Werte enthalten keinerlei Information darüber, was zuerst geschah. Dein Backtest hat trotzdem eine Kennzahl ausgegeben. Irgendwo in der Schleife hat eine Zeile entschieden — wahrscheinlich eine Zeile, die dir beim Schreiben nicht als Modellannahme erschien.

Das ist die größte einzelne Quelle für vorgetäuschte Performance, die ich bei Kurzfriststrategien sehe. Sie liegt noch vor Gebühren und Slippage, weil sie nicht wie eine Annahme aussieht. Sie wirkt wie bloße technische Umsetzung.

Der erste falsche Weg: die If-Kette entscheiden lassen

Typischerweise sieht das so aus:

if bar.high >= target:
    exit(target, "tp")
elif bar.low <= stop:
    exit(stop, "sl")

Niemand hat bewusst entschieden: „Kursziele werden vor Stops ausgeführt.“ Die Prüfung des Kursziels steht einfach zuerst, weil das der Erfolgsfall ist und daran du gerade gedacht hast. Vertauschst du die beiden Zweige, ändert sich die Eigenkapitalkurve. Das allein sollte dir zeigen, dass dein P&L teilweise eine Eigenschaft deines Editors ist.

Ich habe einen bewusst gewöhnlichen Mean-Reversion-Scalper auf BTCUSDT Perp getestet: 3 Monate mit 1-Minuten-Kerzen, 4,812 Trades, Stop 0.10% und Kursziel 0.18% ab Einstieg. Dieselben Signale, dieselben Gebühren, nur die Regel zur Auflösung von Gleichständen war anders.

12.6%der Trades erreichten beide Marken innerhalb einer Kerze
2.31Sharpe, Kursziele werden zuerst ausgeführt
0.18Sharpe, Stops werden zuerst ausgeführt
0.94Sharpe, Auflösung mit 1-Sekunden-Kerzen

Ein Achtel der Trades trägt das gesamte Ergebnis. So funktioniert die Rechnung bei einem engen Stop-Kursziel-Paar: Bei den mehrdeutigen Trades bewegte sich der Kurs in beide Richtungen. Das sind die interessantesten Fälle, und je nach Münzwurf ist jeder einzelne den gesamten Abstand zwischen Stop und Kursziel wert. 12.6% der Trades × 0.28% Spanne ergeben 3.5% des Bruttonominalumsatzes pro Stichprobeneinheit — deutlich mehr als der tatsächliche Vorteil der Strategie.

Die Quote hängt von der Kerzengröße im Verhältnis zum Abstand zwischen deinen Marken ab und steigt schnell, wenn du gröbere Kerzen verwendest. Gleicher Stop und gleiches Kursziel, dieselben Signale, nur anders aggregiert:

KerzenintervallTrades mit beiden Marken innerhalb einer KerzeSharpe (Kursziel zuerst)
1s0.3%0.91
1m12.6%2.31
5m34%3.60
15m49%4.42
1h71%5.88

Schau dir an, was diese Tabelle tatsächlich aussagt. Gröbere Kerzen haben den Backtest verbessert. Jede Forscherintuition sagt, Stundenkerzen seien die konservative Wahl: weniger Rauschen, weniger Overfitting auf Mikrostruktur. Aber mit einer Intrabar-Regel, die zu deinen Gunsten entscheidet, ist eine gröbere Kerze nur eine größere Box, in der du annehmen kannst, dass du Glück hattest. Bei 1h-Kerzen beruhen 7 von 10 Trades allein auf der gewählten Regel. Dieser Backtest prüft keine Strategie, sondern die Reihenfolge von 2 `if`-Anweisungen, 3,400-mal.

Der zweite falsche Weg: annehmen, dass der Stop zum Stop-Preis ausgeführt wurde

Angenommen, du legst die Reihenfolge fest. Der Stop wird zuerst ausgeführt, du verbuchst genau 0.10% Verlust zuzüglich Taker-Gebühr und fühlst dich gründlich. Trotzdem sind noch 2 Dinge falsch.

Erstens ist ein Stop ein Auslöser, keine Ausführung. Auf Binance USDⓈ-M wird eine STOP_MARKET-Order sofort zur Market-Order, sobald die Auslösebedingung erfüllt ist. Anschließend räumt sie das Orderbuch ab. In einer ruhigen Minute bedeutet das 1 oder 2 Ticks Slippage. In der Minute, in der dein Stop tatsächlich ausgelöst wurde — mit einer Kerze mit 40 Punkten Körper und einer Liquidationskaskade darunter — ist das Orderbuch genau auf der Seite dünn, auf der du ausführst. In meiner Stichprobe lag bei Abgleich der Stop-Auslösungen mit dem Tick-Tape die mediane Ausführung 1.4 bps hinter dem Auslöser und das 95. Perzentil bei 11 bps. Bei einem Stop von 10 bps kostet dich das im Randbereich ein zusätzliches Zehntel des Risikos, das du zu begrenzen glaubtest.

Zweitens gibt es einen subtileren Punkt, der speziell Perps betrifft: welcher Preis den Stop auslöst. Binance verwendet standardmäßig den Mark-Preis für Stop-Orders. Dieser ergibt sich aus dem Index zuzüglich einer geglätteten Basis, nicht aus dem letzten Trade auf dieser Plattform. Deine OHLC-Zeitreihe basiert auf dem letzten Preis. Das sind unterschiedliche Zeitreihen, und gerade bei den Ereignissen, die Stops auslösen, weichen sie am stärksten voneinander ab.

Letzter Preis (deine Klines)Mark-Preis (Standard-Auslöser)
QuelleTrades auf dieser PlattformIndex mehrerer Plattformen + Basis
Dochtverhaltenvolle Ausschlägestark gedämpft
Typische Abweichung1–3 bps bei ruhigem Markt, 20–35 bps während einer Kaskadenminute
Folge für den BacktestStops, die ausgelöst wurden, obwohl sie es nicht hätten sollen, und umgekehrt

Ein Docht von 25 bps im Tape des letzten Preises kann deinen Backtest also ausstoppen, obwohl der Live-Mark-Preis nie näher als 10 bps an deinen Auslöser kam. Oder umgekehrt, wenn sich der Index bewegt und deine Plattform hinterherhinkt. Wenn du workingType auf CONTRACT_PRICE setzt, entspricht das Live-Verhalten zumindest deinen Daten. Für die Forschung ist das meist die richtige Wahl, denn um einen Mark-Preis-Auslöser ehrlich zu simulieren, müsstest du eine zweite Zeitreihe durch deine gesamte Ausführungs-Engine führen.

An die Version davon erinnere ich mich am besten: Jemand bei uns „verbesserte“ eine Strategie, indem er das Take-Profit von 0.18% auf 0.21% verschob. Der Sharpe stieg von 2.3 auf 3.1. Kein neuer Vorteil. Das Kursziel lag nun einfach außerhalb des dichtesten Bereichs der 1-Minuten-Dochtverteilung. Dadurch landeten weniger Trades im mehrdeutigen Bereich, in dem der Code ihnen stillschweigend den Gewinn zusprach. Optimiert worden war der Gleichstandsentscheid.

Der dritte falsche Weg: immer vom Schlimmsten ausgehen und das konservativ nennen

Die spontane Lösung ist Pessimismus. Wenn beide Marken berührt werden, zählt der Stop. Fertig, kein Optimismus mehr, raus damit.

Das habe ich früher auch so gemacht. Es ist besser als die Alternative und trotzdem falsch, und zwar aus 2 Gründen.

So verwirfst du Strategien, die funktionieren. Eine pessimistische Auflösung bei 12.6% der Trades kostete diese Strategie 2.1 Sharpe-Punkte gegenüber 0.94 mit Auflösung anhand der Ticks. Wenn der wahre Wert 0.94 beträgt und deine Regel 0.18 ausweist, wirfst du die Idee weg und arbeitest an etwas Schlechterem. Eine Konservativität, die um 2 Sharpe-Punkte danebenliegt, ist keine Konservativität. Sie ist Rauschen mit moralischem Anspruch.

Schlimmer noch: Sie verfälscht die Optimierung. Gib einem Parametersweep einen pessimistischen Gleichstandsentscheid, lernt der Optimierer, Mehrdeutigkeit zu vermeiden, denn Mehrdeutigkeit ist nun eine reine Strafe. Er tastet sich zu weiten Stops und nahen Kurszielen vor oder zu langsamen Kerzen, in denen die beiden Marken selten zusammenfallen. Dann präsentiert er Parameter, die auf deine Ausführungsregel und nicht auf den Markt abgestimmt sind. Derselbe Fehler wie bei der großzügigen Variante, mit umgekehrtem Vorzeichen und genauso unsichtbar im Tearsheets.

Unsere Faustregel, bevor wir irgendetwas anderes tun: Wenn stop_distance + target_distance kleiner ist als die Spanne am 75. Perzentil deines Kerzenintervalls, hat deine Intrabar-Annahme einen größeren Einfluss auf das P&L als dein Signal. Berechne beide Werte. Das dauert 4 Zeilen und hat mehr Strategiereviews beendet als jede andere Einzelprüfung.

Was wirklich funktioniert

Der Kursverlauf innerhalb der Kerze ist eine Datenfrage. Besorg dir die Daten oder grenze ein, was du nicht bekommen kannst.

  1. Löse auf der feinsten verfügbaren Zeitreihe auf. Binance aggTrades für die relevanten Minuten umfassen einige Hundert Zeilen und beantworten die Frage eindeutig: Welche Marke wurde zuerst berührt, und zu welchem Preis wurde der Sweep ausgeführt? Du brauchst Tickdaten nicht für den gesamten Backtest, sondern nur für mehrdeutige Kerzen. In meiner Stichprobe waren das 606 Minuten von insgesamt 129,600. Ein kleiner Download, kein Infrastrukturprojekt.
  2. Wenn keine Ticks verfügbar sind, gehe nur für die Auflösung um 1 oder 2 Zeitebenen nach unten. Signale auf 15m, Ausstiege werden anhand von 1s- oder 1m-Kerzen aufgelöst. Die Mehrdeutigkeit sinkt von 49% auf einen Bruchteil eines Prozents, und der Rest ist klein genug, um ihn guten Gewissens zu ignorieren.
  3. Weise immer die Bandbreite aus. Führe jeden Backtest 2-mal aus: mit optimistischer und pessimistischer Auflösung. Gib beide Sharpe-Werte neben dem aufgelösten Ergebnis aus. Diese Spanne ist deine Intrabar-Unsicherheit. Sie gehört neben das Konfidenzintervall, das du auch für den Sharpe selbst angeben würdest, auf das Tearsheet. Wenn die Bandbreite 0.2–2.3 beträgt, ist keine Schlussfolgerung innerhalb dieser Spanne belastbar.
  4. Führe die Mehrdeutigkeitsquote als zentrale Kennzahl. Bei uns steht sie ganz oben auf jeder Strategiekarte, neben Trade-Anzahl und Umsatz. Liegt sie über etwa 5%, wird die Ausstiegslogik getestet, nicht die Einstiegslogik.
  5. Modelliere Auslöser und Ausführung getrennt. Verwende als Auslöser die Preiszeitreihe, die die Plattform tatsächlich nutzt. Führe zum Auslöserpreis zuzüglich eines anhand des Tapes kalibrierten Slippage-Zufallswerts aus, nicht zum Auslöserpreis selbst.

Bei Aktien gibt es dasselbe Problem, nur anders verpackt. Ein Stop bei 62.00 für eine Aktie, die über Nacht mit einer Kurslücke bei 58.40 eröffnet, wird nicht bei 62.00 ausgeführt, sondern irgendwo unterhalb des Eröffnungskurses. Ein Backtest mit Tageskerzen, der bei solchen Kurslücken −$0.00 Slippage verbucht, erzählt dir gern, ein Stop-Loss-Overlay habe den Drawdown verbessert. Hat es nicht. Es wurde nur nie an den entscheidenden Tagen getestet. Auch bei Handelsunterbrechungen tritt das auf: Dein Stop wird bei der Wiedereröffnungsauktion tatsächlich ausgeführt, zu einem Preis, den das Kerzentief nie zeigt.

Nichts davon ist exotisch. Es bedeutet anzuerkennen, dass eine Kerze eine Zusammenfassung ist und eine Strategie mit Stop und Kursziel darauf wettet, in welcher Reihenfolge Ereignisse eintreten, die diese Zusammenfassung auslässt. Wenn die Paper-Trading-Engine die Strategie schließlich mit einem Live-Tape ausführt, gibt das Tape eine eindeutige Antwort auf diese Reihenfolge. Und es hat sich noch nie dafür interessiert, welchen Zweig der If-Anweisung du zuerst geschrieben hast.

Intrabar-AusführungenStop-OrdersBacktestingKrypto-FuturesMarkt-Mikrostruktur
← Alle Beiträge