Jump to content
Tom Next - Daytrading Community

Recommended Posts

Posted (edited)

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
Posted

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.txtFetching info...

Walk_Forward_Equity_GFX.afl.txtFetching info...

OOS_Yearly_monthly_Profit_Chart.afl.txtFetching info...

  • Upvote 1
Posted
  tlu said:
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.

Posted
  Krümel said:
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 ...

Posted
  tlu said:
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.

Posted
  Krümel said:
Hab mir den Code noch nicht angeschaut.

 

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

Posted
  tlu said:
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.

Posted
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:
Posted
  Krümel said:
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.

Posted
  tlu said:
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.

Posted
  tlu said:
[*]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.

Posted (edited)
  oldschuren said:
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
  • 4 weeks later...

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...