Ich hatte kürzlich versprochen, einen Thread zum Thema Walk-Forward Optimization (WFO) zu starten. Here we go. In diesem ersten Beitrag möchte ich das genrelle Vorgehen und meine Erfahrungen, die ich unter Amibroker damit gemacht habe, darstellen. In einem zweiten Beitrag stelle ich meinen WFO-Code vor, der allerdings noch unfertig und fehlerhaft ist - vielleicht könnt ihr mir dabei unter die Arme greifen.
WFO habe ich kennen gelernt durch die Lektüre der Bücher Quantitative Trading Systems von Howard Bandy (das sich explizit mit Amibroker beschäftigt) und The Evaluation and Optimization of Trading Systems von Robert Pardo. Bandy hatte WFO seinerzeit beschrieben, bevor das in Amibroker implementiert war; mittlerweile gibt es ein Addendum als PDF zum Buch, in dem u.a. diese neue Funktion dargestellt wird.
M.E. ruht die WFO-Logik auf zwei Säulen:
Zum einen hat wahrscheinlich jeder von uns schon häufig festgestellt, dass ein Trading System, das einfach über einen gewissen Zeitraum in der Vergangenheit optimiert wurde und eine ganz tolle Equity-Kurve produziert hatte, in der Realität kläglich versagt hat. Eine probate Methode ist daher, den gesamten Testzeitraum in eine In-sample-(IS)-Periode, in der das System optimiert wird, und eine Out-of-sample-(OOS)-Periode, in der mit den optimierten Parametern ein Backtest durchgeführt wird, aufzuteilen. D.h., das in der IS-Periode optimiert System wird auf die neuen bzw. unbekannten Daten der OOS-Periode angewandt, um zu überprüfen, ob es da immer noch funktioniert.
Das Problem ist jedoch, dass Märkte dynamisch sind, d.h. sich im Zeitverlauf ändern, so dass eine fixe Aufteilung des Testzeitraums in IS und OOS möglicherweise wenig aussagt. Bei der WFO werden daher die IS- und OOS-Perioden gekürzt in der Hoffnung, dass der Markt und das Trading System synchron bleiben - oder statistisch gesprochen: stationär, d.h. dass die erwarteten Werte, Standardabweichungen und Korrelationen über den jeweiligen Zeitraum konstant bleiben. IS- und OOS-Perioden werden dabei jeweils bis heute nach vorne gerollt.
Das genaue Vorgehen bei der WFO wird in dem o.g. PDF-Fiel und in der Amibroker-Hilfe schön dargestellt - siehe die dortige Grafik.
Beispiel: Es soll ein WFO seit Anfang 1990 auf den DAX durchgeführt werden. Zunächst sollte man sich überlegen, welches Optimization Target (bzw. welche Objective Function) man in Automatic Analysis-> Settings -> Walk-Forward benutzt werden sollte. Gute Kandidaten sind m.E. CAR/MDD, RAR/MDD, K-ratio, UPI. Dann wählt man bei End-od-day-Daten die Easy Mode (EOD) und z.B. als IS-Periode 2 Jahre, d.h. von 01.0.1990 bis 31.12.1991 und als Step z.B. 6 Monate - das ist dann unsere OOS-Periode. Nun wird zunächst über die 1. IS-Periode von 1.1.1990-31.12.1991 optimiert und anschließend mit dem optimierten Parameter-Set ein Backtest über die 1. OOS-Periode vom 1.1.1992-30.06.1992 durchgeführt. Im 2. Durchgang verschiebt sich nun die IS-Periode auf 01.07.1990-30.06.1992 und die OOS-Periode auf 01.07.1992-31.12.1992, im 3. Durchgang IS auf 01.01.1991-31.12.1992 und OOS auf 01.01.1993-30.06.1993 - usw., bis man in der Gegenwart angekommen ist.
Nach dem Ende der WFO werden die Equity-Kurven für die einzelnen IS- und OOS-Perioden zu einer gesamten IS- und OOS-Equity-Kurve verknüpft, die man sich mit dem unten auf der AB-Hileseite genannten Code anzeigen lassen kann:
Um das noch mal deutlich zu machen: Während die IS-Equity-Kurve das Ergebnis des Systems aus bekannten Daten anzeigt (denn über die wurde es jeweils optimiert), zeigt die OOS-Equity-Kurve, wie das System bei Anwendung auf jeweils unbekannte Daten abgeschnitten hätte. Das ist daher wohl der ultimative Realitätscheck: Wenn die OOS-Equity-Kurve eine stabile Entwicklung und gute Performance anzeigt, dann ist die Wahrscheinlichkeit recht hoch, dass das System auch in der Realität funktionieren dürfte (auch wenn es dafür natürlich nie eine Garantie geben kann). Man hat dann wohl ein System gefunden, das sich gut an veränderte Marktbedingungen anpassen kann, nicht überoptimiert oder over-fitted ist, sondern offenbar generalisieren kann.
Erfahrungen und Tipps:
Die Länge der IS- und OOS-Periode muss man selbst herausfinden. Es gibt dafür keine allgemeingültigen Regeln. Pardo schreibt irgendwo, dass eine OOS-Periode, die 1/4 bis 1/3 der IS-Periode lang ist, ein guter Ausgangspunkt ist. Aber letztlich muss man das selber ausprobieren und auf jeden Fall mehrere Durchgänge machen, da das auch stark vom jeweiligen System abhängt. Wenn man z.B. ein langfristiges Modell hat, das nur alle paar Monate ein Signal generiert, aber als OOS-Periode 1 Monat gewählt hat, wird die OOS-Equity-Kurve mit Sicherheit miserabel aussehen, da in dieser kurzen Periode nicht genügend Trades generiert werden.
Man sollte vor der WFO zunächst eine Optimierung über den gesamten Zeitraum durchführen, um eine Vorstellung zu bekommen, wo die relevanten Parameter-Bereiche liegen. Simples Beispiel: Wenn man etwa ein System testet, das Signale als Schnittpunkt des Kurses mit einem gleitenden Durchschnitt generiert, und dabei einen Parameter-Bereich von 2 bis 200 Tagen vorgibt, kann es sein, dass in einer IS-Periode, in der der Markt "verrückt" spielt, ein sehr ungewöhnlicher Parameter-Wert "optimal" ist (v.a. wenn die gewählte IS-Periode relativ kurz ist), in der darauf folgenden OOS-Periode das System aber völlig versagt, weil es zwar die Verhältnisse in der IS-Periode perfekt gelernt hat (-> over-fitting), das Ergebnis aber auf unbekannte Daten nicht angewendet werden kann. Meine Erfahrung zeigt, dass es Sinn machen kann, dass man mehrere WFO-Durchgänge macht, bei denen man die Parameter-Bereiche probeweise etwas verengt - oft bekommt man dadurch stabilere OOS-Equity-Kurven.
Erwägenswert ist auch, für die WFO statt einer vollständigen Optimierung eine "non-exhaustive" Optimierung mit CMAE durchzuführen:
OptimizerSetEngine("cmae");
Während es bei einer vollständigen Optimierung passieren kann, dass für eine IS-Periode eine Parameter-Kombination gewählt wird, die jedoch nur eine schmale Spitze (peak) im Ertragsgebirge darstellt und daher im OOS vermutlich weniger gute Ergebnisse bringt, neigt CMAE aufgrund seines Suchalgorithmus dazu, stabile Plateaus zu bevorzugen, d.h. Parameter-Kombinationen, die "allgemeingültiger" sind und daher teilweise zu stabileren OOS-Equity-Kurven führen können. Siehe dazu auch die Anmerkungen in dem o.g. PDF-File. Unabhängig davon kann CMAE eine umfangreiche Optimierung und WFO mit mehreren Parametern deutlich abkürzen.
So viel erst mal vorab - ist lang genug geworden. Bin jetzt gespannt auf eure Kommentare, besonders natürlich von denjenigen von euch, die selbst mit der WFO arbeiten!
Ich hatte kürzlich versprochen, einen Thread zum Thema Walk-Forward Optimization (WFO) zu starten. Here we go. In diesem ersten Beitrag möchte ich das genrelle Vorgehen und meine Erfahrungen, die ich unter Amibroker damit gemacht habe, darstellen. In einem zweiten Beitrag stelle ich meinen WFO-Code vor, der allerdings noch unfertig und fehlerhaft ist - vielleicht könnt ihr mir dabei unter die Arme greifen.
WFO habe ich kennen gelernt durch die Lektüre der Bücher Quantitative Trading Systems von Howard Bandy (das sich explizit mit Amibroker beschäftigt) und The Evaluation and Optimization of Trading Systems von Robert Pardo. Bandy hatte WFO seinerzeit beschrieben, bevor das in Amibroker implementiert war; mittlerweile gibt es ein Addendum als PDF zum Buch, in dem u.a. diese neue Funktion dargestellt wird.
M.E. ruht die WFO-Logik auf zwei Säulen:
Das genaue Vorgehen bei der WFO wird in dem o.g. PDF-Fiel und in der Amibroker-Hilfe schön dargestellt - siehe die dortige Grafik.
Beispiel: Es soll ein WFO seit Anfang 1990 auf den DAX durchgeführt werden. Zunächst sollte man sich überlegen, welches Optimization Target (bzw. welche Objective Function) man in Automatic Analysis-> Settings -> Walk-Forward benutzt werden sollte. Gute Kandidaten sind m.E. CAR/MDD, RAR/MDD, K-ratio, UPI. Dann wählt man bei End-od-day-Daten die Easy Mode (EOD) und z.B. als IS-Periode 2 Jahre, d.h. von 01.0.1990 bis 31.12.1991 und als Step z.B. 6 Monate - das ist dann unsere OOS-Periode. Nun wird zunächst über die 1. IS-Periode von 1.1.1990-31.12.1991 optimiert und anschließend mit dem optimierten Parameter-Set ein Backtest über die 1. OOS-Periode vom 1.1.1992-30.06.1992 durchgeführt. Im 2. Durchgang verschiebt sich nun die IS-Periode auf 01.07.1990-30.06.1992 und die OOS-Periode auf 01.07.1992-31.12.1992, im 3. Durchgang IS auf 01.01.1991-31.12.1992 und OOS auf 01.01.1993-30.06.1993 - usw., bis man in der Gegenwart angekommen ist.
Nach dem Ende der WFO werden die Equity-Kurven für die einzelnen IS- und OOS-Perioden zu einer gesamten IS- und OOS-Equity-Kurve verknüpft, die man sich mit dem unten auf der AB-Hileseite genannten Code anzeigen lassen kann:
PlotForeign("~~~ISEQUITY","In-Sample Equity", colorRed, styleLine);
PlotForeign("~~~OSEQUITY","Out-Of-Sample Equity", colorGreen, styleLine);
Um das noch mal deutlich zu machen: Während die IS-Equity-Kurve das Ergebnis des Systems aus bekannten Daten anzeigt (denn über die wurde es jeweils optimiert), zeigt die OOS-Equity-Kurve, wie das System bei Anwendung auf jeweils unbekannte Daten abgeschnitten hätte. Das ist daher wohl der ultimative Realitätscheck: Wenn die OOS-Equity-Kurve eine stabile Entwicklung und gute Performance anzeigt, dann ist die Wahrscheinlichkeit recht hoch, dass das System auch in der Realität funktionieren dürfte (auch wenn es dafür natürlich nie eine Garantie geben kann). Man hat dann wohl ein System gefunden, das sich gut an veränderte Marktbedingungen anpassen kann, nicht überoptimiert oder over-fitted ist, sondern offenbar generalisieren kann.
Erfahrungen und Tipps:
OptimizerSetEngine("cmae");
Während es bei einer vollständigen Optimierung passieren kann, dass für eine IS-Periode eine Parameter-Kombination gewählt wird, die jedoch nur eine schmale Spitze (peak) im Ertragsgebirge darstellt und daher im OOS vermutlich weniger gute Ergebnisse bringt, neigt CMAE aufgrund seines Suchalgorithmus dazu, stabile Plateaus zu bevorzugen, d.h. Parameter-Kombinationen, die "allgemeingültiger" sind und daher teilweise zu stabileren OOS-Equity-Kurven führen können. Siehe dazu auch die Anmerkungen in dem o.g. PDF-File. Unabhängig davon kann CMAE eine umfangreiche Optimierung und WFO mit mehreren Parametern deutlich abkürzen.
So viel erst mal vorab - ist lang genug geworden. Bin jetzt gespannt auf eure Kommentare, besonders natürlich von denjenigen von euch, die selbst mit der WFO arbeiten!
Bearbeitet von tlu