Jump to content
Tom Next - Daytrading Community

Walk-Forward Optimierung


tlu

Recommended Posts

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:

 

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:

  • 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!

Edited by tlu
  • Upvote 1
Link to comment
Share on other sites

Hier der versprochen Code zur WFO. Das Problem bei Amibroker ist, dass für die WFO noch kein schöner Backtest-Report zur Verfügung steht, wie man das sonst gewohnt ist. Nach der WFO findest sich zwar ein neuer Tab geöffnet, der in Tabellenform alle Trades und Kennzahlen für sämtliche IS- und OOS-Perioden aufführt (Datei WalkForward.html im Amibroker-Verezeichnis), aber das ist es dann auch.

 

Angehängt sind 3 Dateien: MessagePanelInclude.afl (leicht mofizierte Version des Codes hier) zu speichern im Include-Ordner, meine Walk Forward_GFX.afl und als Drittes eine leicht modifizierte Version des Codes von hier) , die eine sehr schöne Darstellung der jährlichen und monatlichen Performance ermöglicht.

 

Zu meinem Code vorweg: Ich bin leider kein Programmierer. Mein Code enthält daher diverse Fehler und ist wahrscheinlich auch ziemlich ineffizient geschrieben.

 

Features:

  • Der Code ist geschrieben für die WFO eines einzelnen Tickers. Wenn man ihn auf einen Markt bzw. eine Watchlist anwendet, sollte man als Chart eine passende Benchmark wählen, da dafür die Buy&Hold-Kalkulation durchgeführt wird.
  • Über InitialEquity = GetOption("InitialEquity"); wird das in Automatic Analysis gespeicherte Anfangskapital eingelesen. Ist dort nichts enthalten oder wird ein anderes Kapital definiert, sind einige Kalkulationen falsch.
  • Die IS-Equity-Kurve ist adjustiert. Sie hat ja über die Länge der ersten IS-Periode einen Vorlauf, ihr Wert ist daher zu Beginn der 1. OOS-Periode nicht identisch mit dem Anfangswert der OOS-Equity-Kurve. Daher die Adjustierung, die beide Kurven zu diesem Zeitpunkt identisch setzt, um einen sauberen visuellen Vergleich zu ermöglichen.
  • Standardmäßig werden die IS- und OOS-Equity-Kurven und die Buy&Hold-Kurve angezeigt. Über das Parameter-Menü (rechte Maustaste) können IS- und OOS-Drawdown und IS- und OOS- Relative Performance (einfach als Quotient der jeweiligen Equity Kurve zur B&H-Kurve) angezeigt werden. Aber bitte nicht alles gleichzeitig, sonst wird's unübersichtlich. Meist blende ich die IS-Equity-Kurve aus und konzentriere mich auf OOS.
  • Über das Parameter-Menü kann auch das Aussehen und die Lage des Kennzahlen-Panels geändert werden.
  • Ich habe mich bemüht, die einzelnen Kennzahlen jeweils sauber vom Beginn der 1. OOS-Periode bis zum Ende der letzten OOS-Periode zu berechnen, damit für IS und OOS nicht Äpfel mit Birnen verglichen werden.
  • Einige Metrics sind wohl bekannt. RelativeCAR ist einfach IS- bzw. OOS-CAR minus B&H-CAR. WFE ist Walk-Forward Efficiency nach Pardo und OOS-CAR/IS-CAR. Perfect Profit wird anhand eines ZigZag auf die Benchmark berechnet (@Krümel: Den Code aus deinem Link habe ich noch nicht in AFL übersetzen können), man sollte im Paramter-Menü wählen, ob man ein Long-only oder Long und Short-system hat. Model Efficiency (ebenfalls nach Pardo) vergleicht die IS- und OOS-CAR mit dem Perfect Profit - je höher, desto besser).

 

Bugs:

  • Die Berechnung des K-ratio ist wohl nicht richtig und funktioniert nach zuviel Rumbasteln z.Z. für IS überhaupt nicht.
  • Die Berechnung von R-squared ist offenbar auch nicht korrekt.
  • Dasselbe gilt wohl für CECPP (ebenfalls nach Pardo), die Correlation between equity curve and perfect profit.

 

Wenn mir dabei jemand helfen könnte, wäre ich sehr dankbar.

 

MessagePanelInclude.afl.txt

Walk_Forward_Equity_GFX.afl.txt

OOS_Yearly_monthly_Profit_Chart.afl.txt

  • Upvote 1
Link to comment
Share on other sites

Bugs:

  • Die Berechnung des K-ratio ist wohl nicht richtig und funktioniert nach zuviel Rumbasteln z.Z. für IS überhaupt nicht.
  • Die Berechnung von R-squared ist offenbar auch nicht korrekt.
  • Dasselbe gilt wohl für CECPP (ebenfalls nach Pardo), die Correlation between equity curve and perfect profit.

 

Wenn mir dabei jemand helfen könnte, wäre ich sehr dankbar.

Wenn sich kein anderer findet, kann ich das gerne machen, allerdings wird das noch bisschen dauern, da ich momentan bis über beide Ohren in anderen Sachen stecke, die ich auch erstmal fertigmachen muss.

Link to comment
Share on other sites

Wenn sich kein anderer findet, kann ich das gerne machen, allerdings wird das noch bisschen dauern, da ich momentan bis über beide Ohren in anderen Sachen stecke, die ich auch erstmal fertigmachen muss.

 

Das wäre wirklich super! Und vielleicht kannst du sogar, wenn du mal viel Zeit hast, beim Perfect Profit Compounding einbauen ... :wub:

 

Aber mal 'ne generelle Frage: Ist denn mein Code so einigermaßen brauchbar? Ist etwas unsinnig oder fehlt etwas? Würde mich schon mal interessieren ...

Link to comment
Share on other sites

Aber mal 'ne generelle Frage: Ist denn mein Code so einigermaßen brauchbar? Ist etwas unsinnig oder fehlt etwas? Würde mich schon mal interessieren ...

Hab mir den Code noch nicht angeschaut. gallery_446_9_2235.gif Ich vergleiche im Moment grade ODL (Germany 30)- und Xetra-Dax-Daten bzgl. Qualität und Abweichungen. Da dampft mir der Kopf gewaltig.

Link to comment
Share on other sites

Grins. Die Zahl der Downloads hält sich eh' in recht engen Grenzen bislang ... :wub:

Das darf man nicht überbewerten. Ich denke, viele habe sich mit dem Thema noch nicht so intensiv beschäftigt, auch hier nicht. Ich nehm mich da nicht aus. *Asche auf mein Haupt* :wub:

Aber deswegen bin ich ja sehr froh, dass Du es aufgegriffen hast.

Link to comment
Share on other sites

Noch ein Nachtrag zum 2. Beitrag: In meinem Code werden nur Kennzahlen berechnet, die direkt aus der IS- bzw. OOS-Equity-Kurve abzuleiten sind. Trade-basierte Metrics wie z.B. Avg. Profit/Loss, Avg Bars held, Number/Percentage Winners usw. sind naturgemäß damit nicht berechenbar. Wie schon erwähnt, sind diese Detailinfos für die einzelnen IS- und OOS-Perioden in der Datei WalkForward.html im Amibroker-Verzeichnis verfügbar und müssten irgendwie programmtechnisch ausgelesen werden, um solche Metrics berechnen zu können. Das geht weit über meine Programmierkenntnisse hinaus. Wenn sich also jemand berufen sieht, das anzugehen - immer zu :wub:
Link to comment
Share on other sites

Das darf man nicht überbewerten. Ich denke, viele habe sich mit dem Thema noch nicht so intensiv beschäftigt, auch hier nicht. Ich nehm mich da nicht aus. *Asche auf mein Haupt* :wub:

Aber deswegen bin ich ja sehr froh, dass Du es aufgegriffen hast.

 

Bitte sehr :wub: Das Thema Walk-Forward scheint überhaupt im Forum noch nicht aufgegriffen worden zu sein. Mir fehlt auch der Überblick, welche Trading Software das überhaupt kann.

Link to comment
Share on other sites

Bitte sehr :wub: Das Thema Walk-Forward scheint überhaupt im Forum noch nicht aufgegriffen worden zu sein. Mir fehlt auch der Überblick, welche Trading Software das überhaupt kann.

Tradesignal kann es, bei MT muss ich passen, da ich mich - wie gesagt - noch nicht so intensiv damit beschäftigt habe.

Link to comment
Share on other sites

[*]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.

 

Hier noch eine kleineErgänzung, für diejenigen, die es interessiert. Ein Überblick über CMAE und andere in Amibroker verfügbaren non-exhaustive Optimierungsmethoden findet sich unten auf http://www.amibroker.com/guide/h_optimization.html . Dort sind auch zwei Links zu CMAE, in denen u.a. erläutert wird, dass CMAE anderen Algorithmen überlegen ist.

Link to comment
Share on other sites

Ich muß da auch passen. Hab schon mal was von gehört aber mehr auch nicht. Hätte nicht gedacht das da so viel Arbeit drin steckt... :wub:

 

Naja, was heißt Arbeit? Die Durchführung einer WFO ist naturgemäß schon langwieriger als eine "normale" Optimierung, weil man die passende IS- und OOS-Längen finden muss und ggfs. auch mit etwas veränderten Parameter-Bereichen spielen muss. Mehrere Durchgänge sind also auf jeden Fall nötig (wobei CMAE das Ganze deutlich beschleunigt). Aber es lohnt sich auf jeden Fall: Du glaubst gar nicht, wie viele Trading Systeme mit ach so tollen Equity-Kurven im Walk-Forward Test kläglich versagen! Deshalb ist dieser für mich der beste Realitätscheck, den ich kenne. Ohne ich fasse ich kein Trading System an.

Edited by tlu
Link to comment
Share on other sites

  • 4 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...