Backtest & Optimierung
Wie partiqon Strategien auf Historien testet, Parameterwerte sucht und sie auf Daten misst, die die Suche nicht verwendet hat: Backtesting, PSO-Optimierung, Walk-Forward-Validierung und WFO.
Backtesting
Ein Backtest simuliert eine Strategie auf historischen Daten. Für jeden Bar wird geprüft, ob Ein- oder Ausstiegssignale ausgelöst werden, und alle Trades mit P&L werden aufgezeichnet. Es wird kein echtes Geld verwendet. Es ist reine Simulation zur Messung vergangener Performance.
So funktioniert es
- Daten laden: Historische Bars (OHLCV) aus BAR6-Dateien
- Zustand zurücksetzen: Strategie-Parameter, Indikatoren und Positionen auf Start zurücksetzen
- Bars durchlaufen: Jeden Bar im Zeitraum an die Strategie übergeben
- Signale prüfen: Erzeugt die Strategie Ein- oder Ausstiegssignale?
- Trades ausführen: Einstieg öffnet eine Position; Ausstieg schließt sie. Einstiegs-/Ausstiegspreis und P&L aufzeichnen
- Kennzahlen berechnen: Win-Rate, Drawdown, Profit-Factor usw.
- Ergebnisse ausgeben: Trade-Liste, Equity-Kurve, Performance-Statistiken
Zeitstempel der Trades
Bar-Daten gehen als UTC in die Engine. Trade-Zeitstempel kommen in
Europe/Berlin-Ortszeit heraus (CET im Winter, CEST im Sommer).
Das betrifft die Spalten EntryTime und ExitTime in
detailed_trades.csv, die Trade-Liste sowie die Auswertungen nach
Tagesstunde und Wochentag.
Gate.Session-Fenster verwenden dieselbe Uhr. Ein Trade steht
damit in derselben Uhr wie die Session-Regel, die ihn zugelassen hat.
Aggregator.D1, Aggregator.TickToBar.D1, der
tägliche Reset von Indicator.VWAP und
Indicator.PivotPoints legen ihren Tag ganzjährig auf ein
festes UTC+1, 23:00→23:00 UTC. Das ist im Winter Mitternacht
Berliner Zeit und im Sommer 01:00. Ein halbes Jahr lang sind sich ein
Gate.Session-Fenster und ein Aggregator.D1-Bar also um
eine Stunde uneinig, wann ein Tag beginnt. Ein selbst konvertierter Datensatz
und die Bars, die der Chart zeichnet, verwenden noch eine dritte Grenze: das
schlichte UTC-Raster, 00:00 UTC. Alle drei sind Absicht und keine davon
wird geändert, denn eine verschobene Tagesgrenze verschiebt still die
Ergebnisse jeder gespeicherten D1-Strategie. Die
Block-Referenz hält fest, welche
Oberfläche welche verwendet.
10:00 und am 15. Juli als 11:00. Wer diese Zeitstempel
wieder in Zeitpunkte zurückrechnet (in einer Tabelle, einem Notebook oder
eigenen Werkzeugen), muss sie als Europe/Berlin mit Sommerzeit
interpretieren. Als UTC oder als festes UTC+1 gelesen, liegt jeder Sommer-Trade
eine Stunde daneben.
Wichtige Kennzahlen
- Gesamtrendite: Endkapital − Startkapital, in Prozent des Startkapitals
- Win-Rate: Gewinn-Trades ÷ Gesamt-Trades. Eine hohe Win-Rate bei niedrigem Profit-Factor bedeutet, dass die Gewinne klein und die Verluste groß sind.
- Profit-Factor: Bruttogewinn ÷ Bruttoverlust. Bei 1,0 haben die Gewinn-Trades genau so viel eingebracht, wie die Verlust-Trades verloren haben; über 1,0 mehr. Der Wert zeigt nicht, wie viele Trades ihn erzeugt haben: Wenige Trades können einen sehr hohen Wert ergeben.
- Max. Drawdown: Größter Rückgang der Equity-Kurve von einem Hochpunkt bis zum folgenden Tiefpunkt. Er ist der tiefste Rückgang auf diesem einen Pfad durch die Historie; dieselben Regeln können in einem anderen Zeitraum tiefer fallen.
- Sharpe-Ratio: Durchschnittliche monatliche Überrendite ÷ ihre Standardabweichung, annualisiert. Gewinn- und Verlustmonate zählen beide als Schwankung. Überrendite heißt: über dem risikofreien Zins, dem Leitzins des in den Einstellungen zum risikofreien Zins gewählten Bezugs, aus den Veröffentlichungen der Zentralbanken selbst (USD: Effective Federal Funds Rate der Federal Reserve Bank of New York; EUR: Zinssatz der Einlagefazilität der EZB aus dem ECB Data Portal; GBP: Bank Rate aus der statistischen Datenbank der Bank of England; CNY: 1-Jahres-Loan-Prime-Rate des National Interbank Funding Center; JPY: Leitzins der Bank of Japan, von Hand aus ihren Erklärungen übernommen). Jeder Kalendermonat des Laufs zählt, auch ein Monat, in dem kein Trade geschlossen wurde (seine Rendite ist 0, seine Überrendite minus der risikofreie Zins dieses Monats). Ein erster oder letzter Monat, der nur zum Teil im Lauf liegt, zählt mit den Trades, die in diesem Teil geschlossen wurden, und wird mit dem entsprechenden Anteil des risikofreien Zinses belastet: Tage im Lauf ÷ Tage des Monats. Die Sortino-Ratio verwendet dieselben Monate, im Nenner nur die Monate unter dem risikofreien Zins. Bei weniger als zwei Monaten oder bei Monatsergebnissen, die nicht schwanken, sind die Quotienten nicht definiert und zeigen einen Strich, den Grund beim Darüberfahren. Ergebnisse, die vor dieser Definition berechnet wurden, behalten ihre Werte und tragen den Hinweis „frühere Methode“.
- Trades pro Jahr: Wie oft die Regeln handeln. Bei wenigen Trades kann ein Trade mehr oder weniger jede andere Kennzahl stark verschieben.
Am Datenende offene Positionen
Eine Position, die beim Ende der Daten noch offen ist, schließt die Engine zum Preis
des letzten Balkens, mit dem Ausstiegsgrund END_OF_DATA. Dieser Ausstieg
ist keine Entscheidung der Strategie, und sein Ergebnis hängt davon ab, wo die Daten
zufällig enden. Die Kennzahlen sind deshalb zweigeteilt:
- Aus den Trades berechnet (nur die Trades, die die Strategie selbst geschlossen hat): Anzahl der Trades, Win-Rate, Profit-Factor, durchschnittlicher Gewinn und Verlust und ihr Verhältnis, Bruttogewinn und Bruttoverlust, der Kelly-Anteil, durchschnittliche Haltedauer, die Kontext-Tabellen, die Stichprobe der Monte-Carlo-Simulation und im Diagnostic Mode der Median von Profit-Factor, Win-Rate und durchschnittlichem R.
- Aus der Equity-Kurve berechnet (die offene Position mit ihrem Bewertungspreis enthalten): Nettogewinn und Gesamtrendite, Max. Drawdown und seine Dauer, Sharpe, Sortino, Calmar, Gain to Pain, die Monatsergebnisse und die Equity-Kurve sowie im Diagnostic Mode der maximale Drawdown in R.
Die Ergebnisse zeigen, wie viele Positionen am Ende offen waren und ihr unrealisiertes Ergebnis; Trade-Liste und Trade-Export kennzeichnen sie in der Spalte Open at data end. Der Nettogewinn ist Bruttogewinn minus Bruttoverlust plus dieses unrealisierte Ergebnis. Besteht ein Ergebnis nur aus Trades, die am Ende noch offen waren, zeigen die aus Trades berechneten Kennzahlen einen Strich. Ergebnisse, die vor dieser Regel berechnet wurden, zählten solche Positionen in jeder Kennzahl als gewöhnliche Trades und behalten ihre Zahlen.
MFE und MAE
Die Trade-Liste zeigt, wie weit sich der Preis bewegt hat, während ein Trade offen war, in Preispunkten pro Einheit der Positionsgröße:
- MFE (Maximum Favourable Excursion): die größte Bewegung zugunsten des Trades. 0 oder positiv.
- MAE (Maximum Adverse Excursion): die größte Bewegung gegen den Trade. 0 oder negativ.
Beide werden ab dem Preis gemessen, zu dem der Trade ausgeführt wurde (Spread und Slippage des Einstiegs sind in diesem Preis enthalten), über jeden Bar vom Bar der Ausführung bis zum Bar, in dem der Trade geschlossen wurde, einschließlich dieses Ausstiegsbars, jeweils mit Hoch und Tief des Bars. Für einen Long-Trade ist MFE = höchstes Hoch − Ausführungspreis und MAE = tiefstes Tief − Ausführungspreis; für einen Short-Trade MFE = Ausführungspreis − tiefstes Tief und MAE = Ausführungspreis − höchstes Hoch.
Weil der Ausstiegsbar zählt, liegt der Preis, zu dem ein Stop oder Ziel ausgeführt wurde, oder die Eröffnung eines Bars, der darüber hinweg gegappt ist, im gemessenen Bereich: Die Preisbewegung von der Ausführung bis zum Ausstieg ist höchstens MFE und mindestens MAE, ein Take-Profit hat einen MFE von mindestens seinem Zielabstand und ein Stop-Loss einen MAE, der mindestens so groß ist wie sein Stop-Abstand. Der ganze Ausstiegsbar zählt, auch sein Teil nach dem Ausstieg, weil ein Bar ein Hoch und ein Tief liefert und nicht die Reihenfolge seiner Preise; bei einem Bar, der Stop und Ziel erreicht hat, geht deshalb einer der beiden Werte über sein Niveau hinaus.
Spread und Slippage des Ausstiegs, Kommission und Finanzierung sind nicht Teil von MFE und MAE. Das P&L eines Trades enthält sie und steht in Kontowährung für die ganze Position; direkt mit MFE und MAE vergleichbar ist es deshalb nur bei einem Wert pro Punkt von 1 und einer Größe von 1. Ein Ergebnis, das vor dieser Definition gespeichert wurde, zeigt MFE und MAE so, wie sie gespeichert sind, mit einem Hinweis: ohne den Ausstiegsbar und in Kontowährung pro Einheit.
Trade-Kontext
Der Tab Context gruppiert dieselben Trades nach der Lage, in der jeder eingegangen wurde, in Tabellen mit Trades, Anteil, Win-Rate, Profit-Factor, Erwartungswert und Netto-P&L je Gruppe. Jeder Wert wird auf dem letzten Bar gelesen, der vor dem Einstieg abgeschlossen war, nie auf dem Bar, in dem der Trade eingegangen wurde, denn dessen Hoch, Tief und Schluss liegen nach dem Einstieg.
- Session und Wochentag: die Uhrzeit des Einstiegs in Europe/Berlin.
- Volatilität: ATR(14), die durchschnittliche True Range, nach Wilder geglättet; True Range = max(Hoch − Tief, |Hoch − vorheriger Schluss|, |Tief − vorheriger Schluss|).
- Trendstärke: ADX(14) nach Wilder: +DM und −DM aus der Veränderung von Hoch und Tief, jeweils über 14 Bars geglättet und durch die geglättete True Range geteilt (+DI, −DI); DX = 100 × |+DI − −DI| ÷ (+DI + −DI); ADX = DX über 14 Bars geglättet. 0 ohne Richtungsbewegung, 100 auf einer geraden Linie.
- Abstand vom Mittelwert: (Schluss − EMA(20)) ÷ ATR(14), in ATR-Einheiten. Für einen Long-Trade unverändert, für einen Short-Trade mit umgekehrtem Vorzeichen: über 0 wurde der Trade in der Richtung eingegangen, in die sich der Preis von seinem Mittelwert entfernt hatte, unter 0 dagegen, nach einem Rücksetzer.
- Lage in der jüngsten Spanne: (Schluss − tiefstes Tief) ÷ (höchstes Hoch − tiefstes Tief) über die letzten 20 Bars, 0 bis 100 %. Für einen Short-Trade 100 % minus diesen Wert, sodass 100 % das Extrem in Richtung des Trades ist.
- Serie vor dem Trade: die Folge von Gewinnen oder Verlusten unter den Trades, die vor dem Einstieg geschlossen waren, geordnet nach ihrem Ausstieg: nach 2 oder mehr Verlusten, nach 1 Verlust, kein vorheriger Trade, nach einem Trade bei 0, nach 1 Gewinn, nach 2 oder mehr Gewinnen. Ein beim Einstieg noch offener Trade zählt nicht, und ein Trade, der genau bei 0 geschlossen wurde, beendet eine Serie.
Volatilität, Trendstärke, Abstand und Lage werden in Drittel geteilt. Die beiden Grenzen werden
über jeden Bar des Datensatzes bestimmt, bei Abstand und Lage mit jedem Bar einmal als Long und
einmal als Short gezählt, und jede Tabelle nennt sie. Weil die Grenzen auch die Bars nach jedem
Trade verwenden, beschreiben die Bänder die Vergangenheit und lassen sich nicht als Filter im
Live-Trading verwenden. Eine Gruppe mit weniger als 30 Trades ist als Low Sample markiert; bei
mehreren Tabellen nebeneinander sind kleine Unterschiede zwischen Bändern meist Rauschen. Der
Trade-Export enthält die vier Werte jedes Trades in den Spalten entry_adx,
entry_mean_distance, entry_range_position und
streak_before (+n nach n Gewinnen, −n nach n Verlusten, 0 nach einem Trade bei 0,
leer ohne vorherigen Trade).
PSO-Optimierung
PSO (Particle Swarm Optimization, Partikelschwarm-Optimierung) ist ein Suchalgorithmus, der Parameterwerte automatisch sucht. Jeder Partikel ist ein Satz von Parameterwerten. Nach jeder Generation bewegt sich jeder Partikel in Richtung des besten Satzes, den er bisher gefunden hat, und des besten Satzes des ganzen Schwarms, gemessen an der gewählten Metrik.
Wie PSO funktioniert
- Suchbare Parameter definieren: Welche Block-Parameter können angepasst werden? (z.B. EMA-Periode 10–100, RSI-Level 20–50)
- Schwarm initialisieren: N Partikel mit zufälligen Parameter-Werten erstellen (z.B. 30 Partikel)
- Jeden Partikel bewerten: Backtest mit diesen Parametern ausführen. Profit-Factor (oder gewählte Metrik) aufzeichnen
- Bestes verfolgen: Jeder Partikel merkt sich sein bestes Ergebnis. Der Schwarm merkt sich das globale Beste.
- Geschwindigkeiten aktualisieren: Jeder Partikel passt seine Parameter in Richtung seines persönlichen Besten und des globalen Besten an (mit Zufälligkeit)
- Wiederholen: Mehrere Generationen durchlaufen (z.B. 60 Iterationen). Der Schwarm sammelt sich um die Sätze, die bei der gewählten Metrik am höchsten gemessen wurden.
- Champion ausgeben: Der Parametersatz, der über alle Generationen am höchsten gemessen wurde
Was PSO tut und was nicht
- Anzahl der Backtests: Grid-Search testet jede Kombination; PSO testet bis zu Partikel × Generationen Parametersätze.
- Parameterarten: PSO verarbeitet beliebige Mischungen aus diskreten und kontinuierlichen Parametern.
- Eine Suche, kein vollständiger Test: Sie probiert viele Sätze, nicht jeden, und kann deshalb enden, ohne den Satz ausprobiert zu haben, der am höchsten messen würde.
- Woher die Kennzahlen stammen: Die Kennzahlen des Champions wurden auf dem Zeitraum gemessen, auf dem er gewählt wurde, und enthalten deshalb, was die Suche an diesen Zeitraum angepasst hat. Ein Backtest auf einem späteren Zeitraum misst denselben Satz auf Daten, die die Suche nicht gelesen hat.
Walk-Forward-Validierung
Eine einzelne Aufteilung in In-Sample und Out-of-Sample misst die Strategie auf einem späteren Zeitraum. Walk-Forward wiederholt diese Messung auf mehreren aufeinanderfolgenden Zeiträumen. So zeigen die Kennzahlen, wie sich das Ergebnis von einem Zeitraum zum nächsten unterscheidet.
Warum ein eigener Zeitraum
Parameter, die auf einem Zeitraum gewählt werden, können neben einem Muster auch das Rauschen dieser einen Historie abbilden. Auf demselben Zeitraum gemessen, enthält das Ergebnis diese Anpassung. Ein späterer Zeitraum, den die Wahl nicht gesehen hat, misst dieselben Regeln ohne sie.
Walk-Forward-Prozess
- In-Sample-Fenster: Der erste Out-of-Sample-Block beginnt IS Window (months) Monate nach Full Range Start.
- Out-of-Sample-Blöcke: Der Zeitraum danach wird in aufeinanderfolgende Blöcke von je OOS Block Size (months) Monaten geteilt.
- Blockgrenzen: Jeder Out-of-Sample-Block endet am Tag, bevor der nächste beginnt, kein Tag gehört also zu zwei Blöcken. Der letzte Block endet bei Full Range End und kann kürzer sein als die Blockgröße. Die Daten sind ganze Tage in UTC, beide Enden eingeschlossen.
- Welche Trades ein Block zählt: Ein Trade gehört zu dem Block, in dem er eröffnet wurde. Die Trade-Liste zeigt die Zeiten in mitteleuropäischer Zeit; im Winter gehört ein Trade, der am ersten Tag eines Blocks um 00:30 eröffnet wurde (23:30 UTC am Vortag), deshalb zum vorherigen Block.
- Walk-Forward-Tab: Das In-Sample-Fenster jedes Blocks reicht vom Startdatum bis zu diesem Block (verankert), und der Graph wird auf jedem Block so getestet, wie er ist, ohne Re-Tuning.
- WFO-Tab: Die Parameter werden auf dem In-Sample-Fenster jedes Blocks neu optimiert, bevor dieser Block gemessen wird (siehe unten).
Ergebnisse lesen
- Profitable blocks: Die Anzahl der Blöcke, deren Out-of-Sample-Nettogewinn über null liegt, von den abgeschlossenen Blöcken mit mindestens einem Out-of-Sample-Trade. Ein Block mit einem Nettogewinn von genau null ist nicht in der Zählung. Ein Block ohne Out-of-Sample-Trade hat kein Ergebnis und wird in keiner Richtung gezählt; die Zusammenfassung nennt, wie viele es waren.
- Avg OOS PF: Der Mittelwert der Out-of-Sample-Profit-Factors der Blöcke. Ein Block ohne Verlust-Trade hat keinen Profit-Factor und fließt nicht ein, ebenso ein Block ohne Out-of-Sample-Trade: Er hat kein gemessenes Ergebnis. Hat kein Block einen Out-of-Sample-Trade, zeigen die Mittelwerte einen Strich. Ein Block mit einem sehr hohen Wert kann den Mittelwert tragen; die Blocktabelle zeigt den Wert jedes einzelnen Blocks und einen Strich für einen Block ohne Out-of-Sample-Trade, den das Diagramm des Out-of-Sample-Profit-Factors ohne Balken zeigt.
- Min OOS PF: Der niedrigste Out-of-Sample-Profit-Factor eines Blocks mit Out-of-Sample-Trade, also der Zeitraum mit dem niedrigsten Ergebnis.
- Avg Sharpe: Der Mittelwert der Out-of-Sample-Sharpe-Ratios der Blöcke mit Out-of-Sample-Trade, deren Quotient definiert ist und die nicht den Hinweis „few observations“ (wenige Beobachtungen) tragen; die Karte nennt, über wie viele Blöcke (zum Beispiel über 5 von 7) und nennt beim Darüberfahren die ausgelassenen Blöcke, und zeigt einen Strich, wenn kein Block einen definierten Quotienten hat oder jeder Block mit definiertem Quotienten den Hinweis trägt. Sharpe und Sortino eines Blocks beruhen auf seinen Monatsergebnissen: jeder Kalendermonat seines Out-of-Sample-Fensters, ein angeschnittener erster oder letzter Monat mit seinem Anteil des risikofreien Zinses belastet. Ein Block aus einem Kalendermonat hat eine einzige Beobachtung und keinen definierten Quotienten; ein Block aus einem Monat und wenigen Tagen des nächsten hat zwei Beobachtungen, eine davon fast null, und seine Sharpe-Ratio liegt dann nahe ±2,45, gleich, was die Strategie getan hat. Bei weniger als 6 Monaten oder bei Monatsergebnissen über dem risikofreien Zins, die um weniger als 0,1 % des Kontos schwanken, können sie extreme Werte annehmen (zwei fast gleiche Monate können eine Sharpe-Ratio jenseits von -100 ergeben). Die Blocktabelle zeigt solche Werte weiterhin, mit dem Hinweis „few observations“ (wenige Beobachtungen) und dem Grund beim Darüberfahren, und sagt, dass der Block im Mittelwert nicht gezählt wird. Ein Ergebnis, das vor dieser Regel gespeichert wurde, behält seinen Mittelwert über alle definierten Blöcke und trägt den Hinweis „frühere Methode“.
- OOS trades: Die Anzahl der Trades über alle Out-of-Sample-Blöcke. Kennzahlen aus wenigen Trades ändern sich mit einem Trade mehr oder weniger stark.
Walk-Forward-Optimierung (WFO)
WFO optimiert die tunable Parameter mit PSO auf dem In-Sample-Fenster jedes Blocks neu und testet die neu gewählten Parameter dann auf dem folgenden Out-of-Sample-Block. Das In-Sample-Fenster ist standardmäßig am Startdatum verankert oder rollierend: ein Fenster von IS Window (months) Monaten, das mit den Blöcken weiterwandert.
WFO-Prozess
- Daten aufteilen: In-Sample-Fenster und Out-of-Sample-Blöcke wie bei Walk-Forward oben.
- Pro Block: PSO auf dem In-Sample-Fenster des Blocks → Backtest der neu gewählten Parameter auf dem Block
- Zusammenfassung: Profitable Blöcke, durchschnittlicher und niedrigster Out-of-Sample-Profit-Factor, durchschnittliche Sharpe-Ratio und die Anzahl der Out-of-Sample-Trades, dazu die Werte jedes Blocks in der Blocktabelle
Auf voller Historie anpassen
Ein WFO hinterlässt einen Parametersatz pro Block, keinen für die spätere Verwendung. Nach einem abgeschlossenen WFO führt Fit on full history (Auf voller Historie anpassen) in seinen Ergebnissen dasselbe Vorgehen noch einmal aus, auf dem Fenster, auf dem ein nächster Block optimiert würde: vom Startdatum bis zum letzten Bar des Datensatzes bei verankertem In-Sample-Fenster, bei rollierendem die letzten IS Window (months) Monate vor diesem Bar (Fit on the last N months). Die Anpassung verwendet die PSO-Einstellungen, die Fitness-Metrik und die Mindestzahl an Trades des WFO und wird als neue Version des Graphen gespeichert; die Version davor bleibt im Versionsverlauf erhalten.
Für diese Parameter gibt es keinen Out-of-Sample-Zeitraum: Die Out-of-Sample-Kennzahlen des WFO beschreiben das Vorgehen, nicht diesen Parametersatz. Das Vorgehen optimiert alle OOS Block Size (months) Monate neu, deshalb zeigt der Graph, wann die nächste Anpassung fällig ist, und Fit again wiederholt die Anpassung auf neueren Daten. Die erste Anpassung nach einem WFO ist im WFO-Lauf enthalten; jede spätere zählt als ein Optimierungslauf.
Wie die Werkzeuge zusammenhängen
- Bauen: Eine Strategie ist ein Graph aus Blöcken im Graph-Editor.
- Backtest: Lässt den Graphen auf einem Zeitraum mit seinen aktuellen Parameterwerten laufen.
- Optimieren: PSO durchsucht die tunable Parameter auf einem In-Sample-Zeitraum.
- Out-of-Sample-Backtest: Misst die gewählten Parameter auf einem späteren Zeitraum, den die Suche nicht gelesen hat.
- Walk-Forward: Misst den unveränderten Graphen auf mehreren aufeinanderfolgenden Out-of-Sample-Blöcken.
- WFO: Optimiert auf dem In-Sample-Fenster jedes Blocks neu und misst dann den Block danach.
- Auf voller Historie anpassen: Führt das Vorgehen eines abgeschlossenen WFO noch einmal aus, auf dem Fenster nach seinem letzten Block, und speichert die Parameter als neue Version des Graphen.
Jeder Schritt liefert Messungen auf vergangenen Daten. Keiner davon sagt, ob eine Strategie zum Handeln taugt.
Structure Finder: Pattern-Mining
Ein Structure-Finder-Lauf (Premium) zeichnet einen Muster-Bericht auf, bevor seine Suche beginnt. Er testet den In-Sample-Teil jedes Walk-Forward-Folds auf 36 feste Bedingungen:
- Schlusskursfolgen: die letzten ein bis vier Schlusskurse sind in einer bestimmten Reihenfolge gestiegen oder gefallen, zum Beispiel drei fallende Schlusskurse in Folge (30 Bedingungen).
- Bereichsausbrüche: der Schlusskurs liegt über dem höchsten Hoch oder unter dem tiefsten Tief der vorigen 5, 10 oder 20 Bars (6 Bedingungen).
Für jede Bedingung wird die Bewegung des nächsten Bars (Schlusskurs bis nächster Schlusskurs, in Basispunkten) nach den Bars, auf denen die Bedingung gilt, mit der Bewegung des nächsten Bars nach allen anderen Bars des Fensters verglichen, mit einem zweiseitigen Mann-Whitney-U-Test. Vor dem Vergleich wird jede Bewegung durch die mittlere absolute Schlusskurs-zu-Schlusskurs-Bewegung der 8 Bars geteilt, die an dem Bar enden, an dem die Bedingung beurteilt wird, damit eine Bedingung, die eher in unruhigen Phasen auftritt, nicht auf der Rohskala mit ruhigen verglichen wird; die Kennzahlen der Ansicht bleiben in Basispunkten. Ein Bar ohne 8 frühere Bewegungen oder mit 8 früheren Bewegungen, die alle null sind, bleibt in beiden Gruppen unberücksichtigt, und vor dieser Änderung gespeicherte Ergebnisse behalten die q-Werte, mit denen sie berechnet wurden. Getestet wird eine Bedingung nur, wenn sie auf mindestens 30 Bars gilt und auf mindestens 30 nicht. Die p-Werte aller in einem Fenster getesteten Bedingungen werden mit der Benjamini-Hochberg-Korrektur angepasst, weil das gleichzeitige Testen vieler Bedingungen Zufallstreffer erzeugt; als gefunden gilt eine Bedingung, wenn ihr angepasster Wert (q) 0,05 oder kleiner ist.
Die Ansicht „Patterns“ des Ergebnisses zeigt pro Fold das untersuchte und das gemessene Fenster, wie viele Bedingungen getestet wurden, und für jede gefundene Bedingung: ihre Beschreibung und die Blöcke, die sie bauen, wie oft sie galt, den Anteil steigender nächster Bars, die mittlere Bewegung des nächsten Bars, die Rangwahrscheinlichkeit und q. Jede gefundene Bedingung wird danach im Out-of-Sample-Fenster des Folds gemessen, ohne dort erneut getestet zu werden, und der zurückgehaltene Holdout wird nie gelesen. Erreicht keine Bedingung q 0,05 oder kleiner, sagt die Ansicht das.
Die Korrektur läuft innerhalb jedes Fensters, die genannten 5 % gelten also pro Fenster: Auf Daten ohne Struktur listen etwa 5 % der Fenster eine Bedingung. Ein Lauf untersucht drei Folds, deshalb zeigt auf Daten ohne Struktur etwa jeder zehnte Lauf in mindestens einem Fold eine Bedingung (zwischen 8,6 % und 10,3 % der Läufe, gemessen an simulierten Reihen mit 20.000 Bars ohne Struktur). Jede Bedingung zeigt, in wie vielen Folds sie gefunden wurde; eine Bedingung, die in allen drei Folds gefunden wurde, ist mehr Evidenz als eine, die nur in einem Fold gefunden wurde, auch wenn sich die Fenster der Folds überlappen.
Der Bericht steht neben den Kandidaten und steuert die Suche nicht. Er beschreibt vergangene Daten: eine Bedingung, die den Test bestanden hat, ist eine gemessene Regelmäßigkeit dieses Fensters, kein Handelssignal. Bei Tickdaten werden die Ticks zuerst zu 1-, 5-, 15- und 30-Minuten-Bars aus dem Mittelkurs zusammengefasst, nach der Regel der Tick-zu-Bar-Blöcke, und die Bedingungen aller vier Perioden werden als eine Familie korrigiert.
Structure Finder: Fitness und Mindestzahl an Trades
Die Fitness eines Kandidaten ist der Median seiner Out-of-Sample-Werte über die Walk-Forward-Folds, standardmäßig 3. In jedem Fold werden die abstimmbaren Parameter auf dem In-Sample-Fenster des Folds angepasst, und der Kandidat wird danach auf dem anschließenden Out-of-Sample-Fenster gemessen.
Ein Kandidat hat nur dann eine Fitness, wenn jeder Fold genug Trades enthält. Die Mindestzahl des Laufs, standardmäßig 30 Trades, wird auf die Folds verteilt und aufgerundet: bei 3 Folds braucht jeder Fold mindestens 10 Out-of-Sample-Trades, bei 4 Folds mindestens 8. Ein Kandidat, bei dem ein Fold darunter liegt, steht ohne Wert in der Liste, was auch immer die anderen Folds gemessen haben, und die Erklärung seiner Zeile nennt den Fold und die Zahl, die ihm fehlte.
Der Grund ist die Obergrenze des Profitfaktors. Der Profitfaktor eines Folds zählt höchstens 10, und ein Fold mit drei gewinnenden Trades erreicht sie. Wird die Mindestzahl über alle Folds zusammen gezählt, kann ein solcher Fold den Median eines Kandidaten bestimmen, dessen übrige Trades auf die beiden anderen Folds fallen.
Ist die Fitness eine Sharpe-, Sortino- oder Adjusted-Sortino-Ratio, wird ein Fold, dessen Quotient den Hinweis „few observations“ (wenige Beobachtungen) trägt (weniger als 6 Monatsergebnisse oder Monatsergebnisse, die kaum schwanken), bei den Folds des Kandidaten angezeigt und im Median nicht gezählt. Ein Kandidat, bei dem kein Fold zum Zählen übrig bleibt oder bei dem ein Fold einen nicht definierten Quotienten hat, hat keine Fitness und steht ohne Wert in der Liste.
Neben der Fitness und dem zurückgehaltenen Wert zeigt jeder Kandidat das Risiko, das geschlossene Trades nicht zeigen. Distance to stop ÷ avg win ist der mittlere Abstand vom Einstieg zum Stopp bei den Out-of-Sample-Trades des Kandidaten, geteilt durch seinen durchschnittlichen Gewinntrade. MAE ÷ avg win ist die weiteste Bewegung eines einzelnen Trades gegen seinen Einstieg, geteilt durch denselben durchschnittlichen Gewinn. Wide stop markiert einen Kandidaten, dessen Stopp mehr als das 20-Fache so weit vom Einstieg entfernt liegt wie sein Ziel, oder wie sein durchschnittlicher Gewinn, wenn er kein Ziel setzt. Nichts wird ausgeschlossen und die Reihenfolge ändert sich nicht: Die Kennzahlen sind Spalten der Ergebnistabelle und Teil des Exports eines Kandidaten.
Ein Profitfaktor zählt nur die Trades, die geschlossen wurden: Hat ein Stopp innerhalb der Fenster nie ausgelöst, steckt kein Verlust daraus in der Kennzahl, wie weit der Stopp auch entfernt liegt. Ein Profitfaktor von 10 neben einem Stopp, der nie ausgelöst hat, zeigt deshalb, wie oft das Ziel erreicht wurde, und nicht, was der Stopp gekostet hätte.
Was ein Backtest abbildet und was nicht
- Lookahead: Auf Bar-Daten läuft die Engine nur auf abgeschlossenen Bars, kein Block liest also einen Bar, bevor er abgeschlossen ist. Tick-Daten laufen Tick für Tick.
- Kosten: Jeder Fill zahlt den Spread aus deinen Daten (den eingestellten Spread auf Bars ohne Quotes) und Slippage von 5 % der durchschnittlichen Bar-Spanne (ATR); Slippage gilt für Einstiege, Ausstiege zum Bar-Schluss und Stops, ein Ziel als ruhende Limit-Order zahlt nur den Spread. Kommission wird nicht berechnet, und Übernacht-Finanzierung ist aus, solange du sie nicht einschaltest. Fills in einem echten Markt können von beidem abweichen.
- Finanzierung: Die beiden Finanzierungssätze sind die deines Brokers, und du gibst sie selbst ein: Jede Belastung ist der Satz mal dem Einstiegspreis der Position, einmal für jede Nacht, in der die Position gehalten wird (im Modell pro Intervall einmal je Finanzierungsintervall). Das Modell kennt keine Währung, keinen Referenzzins und keinen Broker-Aufschlag; es berechnet nur die beiden Sätze, die du eingibst. Die Leitzinsen der Zentralbanken, die Partiqon führt, dienen nur als risikofreier Zins für Sharpe und Sortino.
- Währung: Partiqon rechnet nicht zwischen Währungen um. Jeder Geldbetrag ist die Bewegung in Punkten mal dem Wert pro Punkt, den du eingibst, ein Kurs für den ganzen Backtest. Für einen Markt, der in einer anderen Währung notiert als dein Konto, gilt dieser Kurs für jeden Trade, gleich welcher Wechselkurs am Tag des Trades galt; für einen Einsatz pro Punkt in deiner eigenen Kontowährung ist der Betrag exakt.
- Kurslücken: Ein Stop oder Target, über den der Kurs zwischen zwei Bars hinwegspringt, wird zur Eröffnung des Bars nach dem Sprung ausgeführt, dem ersten Kurs nach der Lücke, nicht auf seinem eigenen Niveau. Auf Tick-Daten zum ersten Tick jenseits davon.
- Ein Bar, der Stop und Target erreicht: Eröffnet ein Bar zwischen Stop und Target einer Position und erreicht beide, wird der Stop gebucht. Ein Bar liefert ein Hoch und ein Tief, nicht die Reihenfolge, in der sie kamen; deshalb wird die ungünstigere der beiden Möglichkeiten genommen. Die Diagnostic bucht einen solchen Bar genauso. Backtests vor dieser Regel entschieden einen solchen Bar danach, wo er innerhalb seiner Spanne schloss; ein früher gespeichertes Ergebnis kann deshalb ein Target zeigen, wo ein neuer Lauf den Stop zeigt.
- Anzahl der tunable Parameter: Jeder tunable Parameter fügt eine Dimension hinzu, die die Suche an den In-Sample-Zeitraum anpassen kann. Diese Anpassung zeigt sich in den In-Sample-Kennzahlen und nicht in den Out-of-Sample-Kennzahlen.
- Die Optimierungsmetrik: Die für PSO gewählte Metrik ist die gesamte Fitness eines Parametersatzes; die Metriken werden nicht kombiniert. Der Profit-Factor zum Beispiel sieht den Drawdown nicht.
- In-Sample-Kennzahlen: Ein Ergebnis, das auf dem Zeitraum gemessen wurde, auf dem seine Parameter gewählt wurden, enthält alles, was die Suche an diesen Zeitraum angepasst hat. Ein Zeitraum, den die Suche nicht gelesen hat, misst dieselben Parameter ohne diese Anpassung.
Nächste Schritte
Bereit, eine Strategie zu bauen? Starte im Graph-Editor auf der /graph-Seite. Oder lies die Block-Referenz, um zu verstehen, was verfügbar ist.