Random-Forest-Vorhersage-Trends

СанСаныч Фоменко | 13 Juni, 2016

Einleitung

Das grundsätzliche Ziel beim Konstruieren eines Handelssystem ist immer dasselbe: Es geht darum, das Verhalten eines Marktinstruments vorherzusagen, zum Beispiel das eines Währungspaares. Die Ziele von Vorhersagen können dabei unterschiedlich sein. Wir sollten uns hierbei auf die Vorhersage von Trends beschränken. Oder, um präziser zu sein, das Vorhersagen eines Anstiegs (Long-Positionen) bzw. einer Abnahme (Short-Positionen) von Währungspaarkursen.

Um das Verhalten einer Währung vorherzusagen, wendet der Trader eine Reihe von Indikatoren auf den Chart eines Währungspaares an und begibt sich auf die Suche nach einem Muster, das eine vorhersagende Wirkung besitzt.

Dieser Artikel fokussiert die automatische Auswahl von Mustern und die vorläufige Bewertung selbiger mithilfe des sogenannten Rattle-Pakets. Hierbei handelt es sich um eine Bibliothek des R-Statistikenanalysesystems.

1. Über Rattle

Wir werden R zur Vorhersage des Verhaltens von Währungspaaren verwenden, da es sich ideal für eine Prognose der Finanzmärkte eignet. Bei R handelt es sich primär um eine Programmsprache für qualifizierte Statistiker, die in den Augen vieler Trader als unvergleichlich gilt. Die Komplexität von R wird ferner durch den Fakt unterstrichen, dass die Tools zur Vorhersage einerseits zahlreich und andererseits über viele verschiedene Pakete verstreut sind, die zu den Basisfunktionen von R zählen.

Rattle (R Analytical Tool To Learn Easily/R-Analysetool zum verständlichen Lernen) stellt eine Kombination mehrerer R-Pakete dar, die wichtig für die Entwicklung von Handelssystemen, die aber nicht leicht zu gebrauchen sind - zumindest dann nicht, wenn man als Anfänger Schwierigkeiten damit hat, separate Tools zu verwenden. Um mit Rattle zu arbeiten, muss man keine Ahnung von R haben. Die Ergebnisse des Arbeitens mit Rattle stellen einen R-Code dar, der dann zur Entwicklung eines realen Handelssystems genutzt werden kann. Allerdings sollte man an dieser Stelle dann ein wenig Ahnung von R besitzen.

In jedem Fall lässt sich festhalten, dass es sich bei Rattle um ein unverzichtbares Tool zum Designen eines Handelssystems handelt. Sogar Anfänger können damit relativ schnell ihre eigenen Ideen verwirklichen und diese Ergebnisse dann bewerten.

Rattle (Williams, 2009) ist eine kostenlose Software (Open-Source-Code), die als Paket konzipiert wurde und die als ein Teil von R fungiert. Da es sich um kostenlose Software handelt, kann der Source-Code von Rattle und R ohne Einschränkungen benutzt werden. Der Source-Code von Rattle ist dabei in C geschrieben. Außerdem ist es Benutzer nicht nur erlaubt, sondern sie werden sogar dazu ermuntert, den Code zu studieren bzw. zu erweitern.

2. Beschreibung der Source-Daten

Die Kalkulationen, die in diesem Artikel ausgeführt werden, basieren auf einem Datenset, dass sechs Währungspaarkurse aufweist: EURUSD, GBPUSD, USDCHF, USDJPY, EURGBP, USDCAD (Schlusskurse im H1-Zeitrahmen für die folgende Periode: 10.01.2011 bis 24.12.2013). Die Daten enthalten über 18.000 Balken, was die Kalkulation relativ verlässlich macht. Das Datenset, das auf den obigen Währungspaaren basiert, wurde dazu verwendet, nach Mustern zur Vorhersage von Long- und Short-Positionen zu suchen.

Das Datenset mit den anfänglichen Notierungen finden Sie in der angehängten Datei namens kot60_110101_131231_UA.txt.

2.1 Kreieren einer Zielvariable

In der ersten Phasen wird es zunächst darum gehen, zu definieren, was genau es ist, das wir vorhersagen wollen. Obgleich dies ziemlich simpel erscheinen mag, ist die Auswahl des richtigen Vorhersageziels bzw. der richtigen Vorhersagedaten, die dieses Ziel in Form eines Sets an Nummern repräsentieren werden, entscheidend.

Was die Idee der Vorhersage eines Trends betrifft, so basiert diese auf dem Wunsch, mit einem Trend handeln zu wollen.

Entsprechend der Definition eines „Trends“ gilt: „Unter einem Aufwärtstrend versteht man eine Situation, in der jeder sukzessiver Kurs höher als der vorherige ist“. Mit dem Abwärtstrend verhält es sich entsprechend umgekehrt. Das heißt, die Notwendigkeit des Vorhersagens eines Kurses eines Währungspaares folgt letztendlich aus dieser Definition heraus. Falls die anfängliche Rate für EURUSD 1,3500 und die vorhergesagte 1,3550 betragen sollte, dann handelt es sich um einen Aufwärtstrend, wodurch ein Kauf veranlasst wird.

Allerdings handelt es sich bei Grundaufträgen um „kaufen“ und „verkaufen“, wohingegen sich die Vorhersage auf ein Preislevel bezieht. So wird beispielsweise ein Preislevel dann benutzt, wenn innerhalb eines Handelssystems ein Breaklthrough-Level vorhergesagt werden soll. Um die Idee des Tradens mit Trends umzusetzen, muss ein zusätzliche Preisvergleich durchgeführt werden. Augenscheinlich sagen wir eine andere Sache vorher als die, mit der wir traden!

Wenn also ein Handelssystem auf einem Trendsystem basiert, dann muss das Modell Trends vorhersagen. Es muss „angelernt“ werden, Trends zu erkennen - die Zielvariable darf also nur die beiden Werte „kaufen“ und „verkaufen“ annehmen. In (kategorialer) Codeform muss die Zielvariable also entweder „1“ oder „-1“ sein.

Es gibt einen fundamentalen Unterschied zwischen verschiedenen Modellen, die Source-Daten zur Berechnung des Preises eines finanziellen Instruments benutzen, und Modellen, die Source-Daten einer Klasse hinzufügen. Modelle des ersten Typs gehören zu den Regressionsmodellen und Modelle des zweiten Typs gehören zu den Klassifizierungsmodellen.

Vorhersagende Modelle des Regressionstyps werden zur Kalkulierung einiger zukünftiger Werte benutzt. Sobald sich diese Zukunft einstellt, werden wir einen tatsächlichen Wert in unseren Händen halten, den wir mit dem ersten vergleichen können.

Vorhersagende Modelle des Klassifizierungstyps werden dazu benutzt, die Klasse zu berechnen, der empfangene Source-Daten während des Moments der Vorhersage hinzugefügt werden. Hierzu zählen beispielsweise die beiden Klassen „Long“ und „Short“. Wie bei jedem anderen Modell eines qualifizierenden Typs auch, weisen diese beiden Klassen keine spezifische Größe auf. Ergo: Die Klasse „Long“ kann nicht mit der „Short“-Klasse verglichen werden. Obwohl wir aus Gründen der Bequemlichkeit „Long“ als „1“ und „Short“ als „0“ darstellen werden, bedeutet dies nicht, dass „Long“ größer als „Short“ ist. Um dies zu unterstreichen, besitzen R und Rattle für solche qualitativen Variablen einen spezialisierten Typ kategorialer (normaler) Variablen.

Long- und Short-Positionen existieren nicht als Zielvariablen. Und das ist auch der Hauptunterschied zu den unabhängigen Variablen, die sich unten befinden. Dieser Aspekt steht im Zusammenhang mit dem Umstand, dass wir eine Zukunft vorhersagen werden, die für den Moment noch nicht existiert. Da wir die Zukunft im Verhältnis zur Vergangenheit kennen, können wir sehr gute historische Datentrends zeichnen.

Um Trends und historische Daten zu unterscheiden, werden wir ZigZag benutzen. Dies ist ein brillanter Indikator für historische, aber zugleich nutzlos für tatsächliche Daten, da die letzte Verbindung (und manchmal auch die vorherige) neu gezeichnet wird. Da es keine Dynamiken hinsichtlich historischer Daten gibt, können wir mit diesem Indikator wirklich sehr schöne Trends zeichnerisch zustande bringen.

Um die Zielvariable zu berechnen, wurde der ZigZag-Indikator mit dem Parameter „Abstand zwischen den Wende-/Umkehrpunkten“, der mit 0,0035$ identisch ist, benutzt. Abb. 1 zeigt die Ergebnisse

Abb. 1 Der ZigZag-Indikator:

Abb. 1 Der ZigZag-Indikator:

Nun müssen die Indikatorwerte in kategoriale Werte konvertiert werden: „Long“ = 1, „Short“ = 2. 

Die Resultate finden sich in Abb. 2.

Abb. 2 Der ZigZag-Indikator in kategorialer Form

Abb. 2 Der ZigZag-Indikator in kategorialer Form

Lassen Sie uns die letzte Operation mit der Zielvariable durchführen. Wenn wir den ZigZag-Indikator nach links verschieben, so wird der aktuelle Balken mit dem zukünftigen Wert des ZigZag-Indikator korrespondieren. In diesem Artikel erfolgt der Shift durch einen Balken, der identisch mit der Vorhersage ist, die den Daten einen Schritt voraus ist, die eine Stunde vorher benutzt wurden.

Der Shift kann für eine größere Nummer an Balken vorgenommen werden und er wird mit einer Vorhersage für eine größere Menge an Balken korrelieren. Dieser Ansatz unterscheidet sich von anderen vorhersagenden Ansätzen, bei denen der vorherige Wert benutzt werden kann, um verschiedene Zukunftswerte vorherzusagen, was zu einer Summierung von Vorhersagefehlern führt.

Modelle, die in diesem Artikel hervorgehoben werden, als auch Klassifizierungsmodelle im Allgemeinen summieren keine Fehler auf. In den Klassifizierungsmodellen hat eine Vorhersage für zwei Balken weiter ihren eigene Vorhersagefehler, der mit dem Vorhersagefehler für einen Balken weiter in keiner Weise in Beziehung steht.

2.2 Das Kreieren einer unabhängigen Variable

Unabhängige Variablen und Prädiktoren werden so genannt, da sie von außen an das Modell überführt werden. Es handelt sich bei ihnen um externe, messbare Variablen oder Variablen, deren Berechnung auf externen Variablen basiert. Jede Finanzdatei einschließlich Notierungen von Währungspaaren stellen unabhängige Variablen dar, da ihre Werte das Resultat des Wirkens verschiedener Marktakteure darstellen. Daten, die von technischen Indikatoren erhalten wurden, gehören zur selben Kategorie, da auch sie auf der Grundlage von Notierungen berechnet werden.

Die Auswahl unabhängiger Variablen ist genauso wichtig wie die Wahl der Zielvariable. Genau genommen gilt: Die Wahl der unabhängigen Variablen definiert den Erfolg des Modells. Der Hauptteil der Zeit, die für die Entwicklung eines Modells aufgewendet werden muss, stellt eine Analyse und Auswahl eines Sets unabhängiger Variablen dar.

Variablen der Source-Datei kot60_110101_131231_UA enthalten sechs Notierungen von Währungspaaren, wobei Zeit und Datum als Prädiktoren definiert werden können.

Zeit und Datum sind wesentlich interessanter, wenn man es aus dem Blickwinkel dieser Methode betrachtet. Es gab schon immer Bestrebungen, Zeit und Datum in einem Handelssystem zu verwenden. In unseren Modellen ziehen wir in Betracht, dass einige verborgene Daten bzgl. der Notierungsabhängigkeit der Tageszeit und des Wochentags mithilfe des Klassifizierungsmodells automatisch aufgedeckt werden können. Das Einzige, das hier getan werden muss, ist die Konvertierung dieser beiden Variablen in eine kategoriale Form. Die Zeit muss zu einer aus 24 Levels bestehenden Kategorie und das Datum zu einer kategorialen Variable mit 5 Levels (um den Wochentagen zu entsprechen) werden.

Neben den Source-Prädiktoren werden wir ferner zusätzliche Prädiktoren generieren, die meiner Meinung nach die Existenz von Trends in den Source-Notierungen offenbaren. Wir werden an dieser Stelle relativ bekannte Indikatoren zur Erstellung zusätzlicher Prädiktoren verwenden.

Die folgenden Indikatoren sollen verwandt werden: 5,10 und 15; MACD(12,26,9), RSI mit den Perioden 14,21,28. Hinzu kommen noch eine Erhöhung von Notierungen als auch Moving-Averages. All diese Konversionen werden auf alle sechs Währungspaarkurse angewendet.

Der ZigZag-Indikator wird ebenfalls in der Nummer der unabhängigen Variablen enthalten sein - aus unterstützenden Gründen. Er wird allerdings nicht dafür verwendet werden, ein Modell zu entwickeln, da der Wert auf dem am weitesten rechts befindlichen Balken unbekannt ist.

Wir haben also 88 unabhängige Variable, eine Zielvariable und eine Servicevariable (ZigZag). Die Menge an Daten für jede Variable beträgt 18083 Balken.

Dieses Datenset hat die Form des R-Arbeitsplatzes und kann im Anhang dieses Artikels unter dem Namen TC.RData gefunden werden. Dieses Datenset kann folgendermaßen benutzt werden:

  • lade R;
  • lade die Rattle-Bibliothek;
  • Tab: Datei/Arbeitsplatz
  • finde die Datei TC.RData auf der Platte und lade sie.

3. Intelligente Analyse der Source-Daten

Das Rattle-Paket stellt ein Set für die Verarbeitung vorläufiger oder intelligenter Daten zur Verfügung - Datenschürfung.

3.1 Eingabe und Vorschau

Lassen Sie uns einige Möglichkeiten in Betracht ziehen, die zur Verfügung stehen, sobald Sie die Aktionen obigen Abschnitts durchgeführt haben.

Die Resultate finden Sie in der Abb. 3.

Abb. 3 Rattle-Hauptfenster

Abb. 3 Rattle-Hauptfenster

Die Entwicklung eines Modells in Rattle findet statt, wenn wir uns vom Datei-Tab in Richtung des Log-Tabs bewegen.

Das erste Tab von Rattle ist das Datei-Tab. Wie der Name schon sagt, erlaubt dieses Tab, Daten zu laden, mit denen in Zukunft gearbeitet werden kann.

Die beiden Buttons Tabellenkalkulation und R-Datenset sind für uns von besonderem Interesse.

Der Tabellenkalkulationsbutton erlaubt das Hochladen von Excel-Dateien. Falls ein geneigter Leser seine Ideen testen möchte, so kann er seine eigene Excel-Datei hochladen und dann Rattle austesten.

Um Aktionen, die in diesem Artikel beschrieben wurden, zu wiederholen oder um zusätzliche Aktionen mit einer Datei, die Rohdaten enthält bzw. an diesen Artikel angeheftet ist, durchzuführen, benutzen Sie bitte den R-Datensetbutton. Dieser Button lädt die Datei im R-Format. Diese Datei wird als „Arbeitsverzeichnis“ oder „Arbeitsdatei“ bezeichnet und sie weist eine .RData-Disk-Erweiterung auf. Die Datei kann auf R hochgeladen werden. Klickt man den darauffolgenden Button, steht sie zur Verfügung.

Wenn Sie die von uns vorbereitete Datei hochladen, dann müssten sie den oberen Teil von Abb. 4 und den unteren von Abb. 5 erhalten.

Abb. 4 Oberer Teil der Source-Datei

Abb. 4 Oberer Teil der Source-Datei

Abb. 5 Unter Teil der Source-Datei

Abb. 5 Unter Teil der Source-Datei



3.2 Korrelation der Zielvariable mit unabhängigen Variablen

Hinweis. Der „Ausführen“-Button spielt eine gewichtige Rolle. Die Aktion wird zwar vorbereitet, sie wird allerdings nicht ausgeführt. Um eine Aktion tatsächlich auch auszuführen, müssen Sie den „Ausführen“-Button drücken. Dies muss mit jeder einzelnen Aktion, die in diesem Artikel beschrieben wird, separat geschehen.

Die Abb. 4 zeigt eine Liste von Variablen, deren Charakteristika und die Rolle dieser Variablen an. Da wir den ZigZag-Indikator in den Modellen nicht verwenden werden (selbst wenn wir es wollten, könnten wir es nicht), werden wir ihn ignorieren, indem wir ihn auf Ignorieren setzen.

Andere Variablen werden als Eingabevariablen benutzt. Bis auf die letzte, sie dient uns als Zielvariable.

Der Partitionsbutton spielt für die Begründung des Vertrauenslevels eine wichtige Rolle. Mithilfe dieses Buttons kann das Datenset, falls nötig, in drei Teile eingeteilt werden. Die Proportionen des Datensets, die für das Training, die Validierung und das Testen des Modells verwendet werden sollen, können in dieser Phase spezifiziert werden.

Im nächsten Feld wird der Seed für den Sensor von Pseudozufallszahlen spezifiziert. Beispiel: 70% der Source-Daten, die für das Trainingsdatenset gesammelt werden, werden vom Source-Datenset zufällig ausgewählt. Hieraus ergibt sich, dass die anderen zwei Teile (je 15%, genau wie in unserem Fall) ebenfalls zufällige Balkensequenzen darstellen.

Wenn man also den Seed vom Source-Datenset ändert, kann man eine nicht definierte Menge an verschiedenen Trainungs- und Datensets erhalten.

Abb. 6 Korrelation der Variablen

Abb. 6 Korrelation der Variablen

Finden Sie eine Spalte mit dem Namen ZZ.35 in der erhaltenen Tabelle. Das gezeigte Beispiel in der Tabelle unten wurde dieser Spalte entnommen.

VariableZZ.35
 RSI_cad.14 -0,0104122177
 JPY.dif2 -0,0088412685
 EUR.dif3 -0,0052379279
 CHF.dif3 -0,0049692265
 GBP.dif3 -0,0047409208
 GBP.dif1  0,0044691430
 MA_cad.15.dif1 -0,0039004722
 JPY.dif1 -0,0023831247
 GBP.dif2 -0,0015356091
 EUR.dif2 -0,0013759749
 CHF.dif2 -0,0012447101
 EUR.dif1 0,0005863149
 MA_cad.10.dif1 0,0023981433
 CHF.dif1 0,0024543973
 MA_gbp.5.dif1 0,0043757197
 MA_cad.5.dif1 0,0075424397
 MA_gbp.10.dif1 0,0094964069
 EURGBP.dif1 0,0095990416
 CAD.dif1 0,0110571043

Tabelle 1.  Korrelation der Variablen

Wie wir sehen, gibt es eine ziemlich lange Liste an Variablen, deren Relation zu ZZ.35 0,01 oder weniger beträgt. Beträgt der Korrelationslevel weniger als 0,1, so kann daraus kein Schluss hinsichtlich des Einflusses der unabhängigen Variablen auf die Zielvariable gezogen werden.

Während dieser Phase werden wir diesen Umstand festhalten, um ihn nach der Bewertung des Modells angemessen zu benutzen.

Was das Klassifizierungsmodell betrifft, so spielt der Grad des Einflusses eines Prädiktors auf die Zielvariable eine nicht zu unterschätzende Rolle. Für ein geringes Korrelationslevel gilt, dass der passende Prädiktor als Noise des Modells fungiert, wodurch es zu einer Umschulung (Retraining) kommt. Die Umschulung eines Modells bedeutet, dass ein Modell damit beginnt, Kontodetails und Prädiktoren in Betracht zu ziehen, die für die Zielvariable nicht signifikant sind.

Für das Korrelationslevel gibt es hierbei eine Empfehlungen. Für gewöhnlich wird die magische Nummer von Statistiken - 5% - bemüht. Sie ist allerdings im Wesentlichen inkorrekt. Das Entfernen von Prädiktoren, die als Noise des Modells fungieren, führt zu einer Reduzierung des Vorhersagefehlers. Das Entfernen eines Prädiktors, der nicht als Noise des Modells fungiert, führt hingegen zu einer Zunahme des Vorhersagefehlers. Die minimale Liste an für das Modell nützlichen Prädiktoren kann daher nur durch Experimente bestimmt werden.

3.3 Skalierung

Einige Modelle, wie beispielsweise das von Support-Vector-Machines (SVM) reagieren äußerst empfindlich auf Prädiktoren unterschiedlicher Skalierungen. Das bedeutet das Folgende. So ändern sich beispielsweise die Daten des Währungspaars EURUSD innerhalb eines Limits von 0,5, wohingegen USDJPY-Änderungen innerhalb eines Limit stattfinden, das mehrerer Dutzend Einheiten umfasst. Um verschiedene Skalierungen von Prädiktoren auszuschließen, werden Sie im Transformieren-Tab auf eine gemeinsame Skalierung gebracht. Hierbei wird eine Fluktuation der Prädiktoren innerhalb eines Limits von [0-1] bevorzugt.

Um eine Skalierung vorzunehmen, wählen Sie bitte Transformieren/Neuskalieren/Skalieren [0-1]. Danach „ticken“ wir alle Variablen und betätigen den „Ausführen“-Button.

3.4 Konvertierung in kategoriable Werte

Eine Konversion in die kategoriale Form erlaubt das Konvertieren des Werts einer nummerischen Variable in einen Faktor mit mehreren Levels. Der RSI-Indikator ist der erste, der in einen Multi-Level-Faktor konvertiert werden muss. Es wird angenommen, dass eine Trendumkehr vorliegt, wenn sein Wert sich der 0 oder der 100 annähert.

Um Werte eines RSI-Indikators in eine kategoriale Form zu überführen, wählen Sie bitte: Transformieren/Recoden/KMeans. Setzen Sie danach die Zahl des Faktorlevels auf 8. „Ticken“ Sie nun alle RSI-Indikatoren und gehen Sie auf „Ausführen“.

Stellen Sie nun noch die ZZ.35-Variable auf Ignorieren und wir können mit der Modellentwicklung weitermachen.

4. Genereller Algorithmus des Klassifizierungsmodells

Die folgenden Modelle stehen in Rattle zur Verfügung:

  • Modell einer baumartigen Klassifizierung (Baum);
  • Random-Forest-Modell (forest);
  • Boosting-Trees-Modell (ada);
  • Support-Vector-Machine-Modell (SVM):
  • generalisiertes, lineares Modell (grim);
  • Neuronales-Netzwerk-Modell (NNET).

Trotz fundamentaler Unterschiede zwischen den Klassifizierungsmodellen (wir reden hierbei nicht über die, die via Rattle verfügbar sind), weisen alle von ihnen gemeinsame, bereits beschriebene Features auf.

Sehen wir uns das Trainingsset an, das aus Strings (bei uns: 18030) besteht, Prädiktorwerte (bei uns: 80) sowie den Wert der Zielvariable aufweist („Long“ und „Short“).

Ein jeder der Klassifizierungsalgorithmen adressiert das Problem der Separierens von Kombinationen von Prädiktorwerten, die mit „Long“, und Prädiktorwertkombinationen, die mit „Short“ korrespondieren. Dies ist die Phase des Schulens, des Trainierens und des Anlernens eines Modells.

Später erwartet uns die darauffolgende Phase der Verifizierung des Modells.

Da wir das Source-Datenset in drei Teile eingeteilt haben, nehmen wir uns ein weiteres Datenset und ziehen Kombinationen von Prädiktoren in Betracht, die mit den verglichen werden, die wir während der Trainingsphase erhielten. Jede Kombination an Prädiktoren wird ermittelt, wenn sie zu „Long“ oder zu „Short“ dazugehört. Da das Verifizierungsdatenset diese unbekannten Werte enthält, wird das Resultat mit den tatsächlichen Daten verglichen. Das Verhältnis zwischen tatsächlichen „Long“- & „Short“-Positionen und den vorhergesagten ist der sogenannte Vorhersagefehler.

Falls uns das Ergebnis nicht zusagt, können wir zur Phase der Analyse der intelligenten Daten zurückkehren, um das Resultat zu verbessern. Bedauerlicherweise wird die Qualität dieser Phase durch die Erfahrung des Traders beeinflusst. Änderungen werden im Source-Datenset vorgenommen. Daraufhin wird ein Modell entwickelt.

Falls wir mit den Resultaten des Trainings- und Verifizierungsdatensets zufrieden sein sollten, verifizieren wir das Modell anhand des Testdatensets - also des Sets, das bisher noch nicht verwendet worden ist.

Die Qualität des Modells wird nicht nur durch einen möglichst kleinen Vorhersagefehler, sondern ferner durch eine möglichst kleine Differenz zwischen den Fehlerwerten und verschiedenen Datensets definiert. Dies spiegelt die Robustheit des Modells, die Abwesenheit einer Umschulung oder aber auch - so verschiedene Trader - eine Ultrajustierung wider.

Im vorliegenden Artikel werden wir uns im Detail nur ein Random-Forest-Modell betrachten.

5. Random-Forest-Modell

5.1 Zusammenfassung

Ein Algorithmus der Arbeit eines Traders sieht wie folgt aus. Ein Set von Indikatoren wird dem Währungspaarkurs hinzugefügt, worauf eine Handelsentscheidung - basierend auf der Gesamtheit der aktuellen Notierungen und Indikatordaten - erfolgt.

Was das simpelste Handelssystem betrifft, also eins, das auf „Moving-Average“ basiert, so erfolgt ein Kauf bzw. Verkauf, falls der aktuelle Kurs höher bzw. tiefer als der Moving-Average ist. Außeredm können zusätzliche Bedingungen wie vom RSI-Indikator empfangene Daten hinzugefügt werden. Im Ergebnis heißt dies, dass ein Trader einen Entscheidungsbaum erhält. Die Blätter des Baums repräsentieren dabei die Notierungen des Währungspaares, die Moving-Average-Werte als auch den RSI-Indikator. Die Wurzel besitzt hingegen nur zwei Werte - „kaufen“ und „verkaufen“.

Der beschriebene Prozess des Anlegens eines Baums wurde bereits mit der Klassifikatonsbaummethode automatisiert. Das Ergebnis: Es gibt nur einen Baum - oder im Tradingslang - nur ein Muster.

Der Algorithmus eines einzigen Baums ist nicht dazu fähig, präzise Modelle zu konstruieren, da Diversität zu Instabilität führt, was als Generierung separater Entscheidungsbäume angesehen werden kann.

Diese Aussage kann ein jeder Leser selbst überprüfen, indem er ein Baummodell in Rattle benutzt. Dieses Modell setzt den beschriebenen Algorithmus des Kreierens eines Baumes um.

Die Idee des Random-Forest-Modells besteht darin, viele Klassifizierungsbäume (also Muster) in das Modell miteinzubeziehen, und nicht nur einen. Daher tendieren Random-Forest-Modelle auch dazu, eine höhere Resistenz gegen Datenänderung und gegen Noise-Variablen aufzuweisen (Variablen, die nur wenig Einfluss auf die Zielvariable haben).

Zufälligkeit, die seitens des Random-Forest-Algorithmus verwendet wird, manifestiert sich in der Wahl der Reihen der Tabelle (Beobachtungen) und der Vorhersagen. Diese Zufälligkeit bestimmt die signifikante Resistenz gegen Noise-Variablen, Ausreißer und Umschulung - verglichen mit einem einzelnen baumartigen Klassifizierer.

Die Wahrscheinlichkeit definiert ferner die signifikante rechnerische Effizienz. Bei der Konstruktion eines einzigen Entscheidungsbaums kann der Entwickler des Modells ein zufälliges Unterset an Beobachtungen des Trainingssets auswählen. Außerdem gilt, dass in jedem Knotenpunkt des Prozesses der Kreierung des Baums nur ein kleiner Teil aller Variablen beim Etablieren der besten Proportionen des Splittens eines Datensets in Betracht gezogen wird. Dies führt zu einer nicht unerheblichen Entspannung hinsichtlich der Bedingungen der Performance der Berechnungen.

Das Random-Forest-Modell ist also aus mehreren Gründen eine gute Alternative zur Entwicklung von Modellen. Sehr oft bedarf es des Verarbeitens vorläufiger Daten, da Daten nicht normalisiert werden sollen und der Ansatz relativ milde mit Ausreißern umgeht. Die Notwendigkeit der Auswahl von Variablen kann umgangen werden, da der Algorithmus effizient ganz eigene Variablensets wählt. Da sehr viele angelegte Bäume zwei Zufälligskeitslevels aufweisen (Beobachtungen und Prädiktoren) stellt jeder Baum ein unabhängiges, effizientes Modell dar. Ein derartiges Modell ist außerdem nicht besonders anfällig für einen Umschulungsprozess betreffend das Trainingsdatenset.

Algorithmen des Randem-Forest-Modells generieren oft zwischen 500-1000 Bäumen. Sobald das finale Modell entwickelt ist, werden die Entscheidungen, die von jedem einzelnen Baum getroffen werden, integriert, indem alle Bäume gleich verarbeitet werden. Die finale Entscheidung (alle Bäume zusammengenommen) stellt also eine Mehrheitsentscheidung der einzelnen Baumkomponenten dar. Falls 51 von 100 Bäumen auf „Long“ hindeuten, dann wird „Long“ auch akzeptiert werden, wenngleich mit einer geringeren Zuversicht.

5.2 Algorithmus

5.2.1 Bildung eines Beispiels anhand eines Datensets

Der Algorithmus zur Bildung eines zufälligen Baums generiert mithilfe der sogenannten Bagging-Methode viele Entscheidungsbäume, um Zufälligkeit in den Prozess der Bildung von Beispielen mit einfließen zu lassen. Bagging ist eine Idee, die darauf basiert, eine Probe zufällig herausgegriffener Beobachtungen in einer Art Tasche (daher: bag) zu sammeln. Viele Taschen, die in einer zufälligen Reihenfolge gebildet wurden, enthalten ausgewählte Beobachtungen, die sie von den ursprünglichen Beobachtungen des Trainingsdatensets erhalten haben.

Das Sortieren und Vergleichen dieser Taschen erfolgt durch eine Substitution. Das bedeutet, dass eine jede Beobachtung eine Chance auf ein multiples Auftreten innerhalb einer bestimmten Tasche hat. Die Größe der Probe entspricht oft der Größe des gesamten Datensets. Die Praxis lehrt uns, dass zwei Drittel aller Beobachtungen in einer Tasche (ohne Wiederholungen) enthalten sein werden und dass ein Drittel gar nicht in Betracht gezogen wird. Jeder Tasche voller Beobachtungen wird als Trainingsdatenset zum Kreieren eines Entscheidungsbaums verwendet. Die nicht beachteten Beobachtungen können dabei als unabhängige Probe zum Bewerten der Ergebnisse fungieren.

5.2.2 Bildung der Wahl der Prädiktoren

Das zweite Grundelement der Zufälligkeit ist die Wahl der Prädiktoren zum splitten eines Datensets. Während eines jeden Schritts bei der Generierung von separaten Entscheidungsknotenpunkten (also: Split-Punkten des Baums) wird ein zufälliges, gewöhnlich kleines Set an Prädiktoren ausgewählt. Hierbei werden nur Prädiktoren ausgewählt, die sich am Split-Punkt befinden. Für jeden Knotenpunkt beim Anlegen eines Baums wird ein anderes zufälliges Set an Prädiktoren in Erwägung gezogen.

5.2.3 Zufälligkeit

Bei der Bildung zufälliger Sets von Daten und Variablen, erhält man Entscheidungsbäume mit mannigfaltigen Ergebnissen, die auf den Daten eines Subsets basieren. Diese Änderung erlaubt die Behandlung der Bäume als eine Art von Team von kooperierenden Expert-Advisors unterschiedlichen Kompetenzlevels, die zu äußerst verlässlichen Vorhersagen fähig sind.

Das Erzeugen von Proben hat noch einen weiteren bedeutsamen Vorteil - rechnerische Effizienz. Wenn man nur einen kleinen Teil der gesamten Prädiktoren beim Splitten eines Datensets miteinbezieht, so reduziert sich das Volumen der benötigten Rechenoperationen um einen nicht zu unterschätzenden Betrag.

Während der Algorithmus zur Formung zufälliger Bäume Entscheidungsbäume erzeugt, sieht er für gewöhnlich davon ab, diese auch zu fällen. Ein Random-Forest-Modell mit ultra-justierten Bäumen ist ein rundum sehr gutes Modell, das ausgezeichnet mit neuen Daten hantieren kann.

5.2.4 Bewertungskalkulationen

Wenn man mehrere Entscheidungsbäume als ein Modell behandelt, dann ist jeder einzelne Baum bei der Entscheidungsfindung gleich wichtig. Folglich erfolgt eine Entscheidung aufgrund der Anwendung des Mehrheitswahlrechts. Das bedeutet, dass Splits von 51% und von 99% dieselbe Klasse generieren werden, beispielsweise „Long“.

Kalkulationen durch Rattle sind stets parteiisch, da der Benutzer die Resultate in Form einer Klasse erhält. Falls das Modell in R benutzt wird, können die Resultate in Form einer Klassenwahrscheinlichkeit erhalten werden.

5.3 Zur Entwicklung eines Random-Forest-Modells

Um ein Modell zu kreieren, wählen Sie bitte Modell/Forest. Die Startkalkulationen für die Source-Daten des Modells werden einige wenige Minuten in Anspruch nehmen.

Ich werde die Resultate der Berechnung in verschiedene Teile aufteilen und dann einzeln kommentieren.

Begutachten wir die Ergebnisse der Abb. 7.

Abb. 7 Der obere Teil der Justierungsergebnisse des Random-Forest-Modells

Abb. 7 Der obere Teil der Justierungsergebnisse des Random-Forest-Modells

Einige Informationen dieser Abbildung verdienen eine besondere Hervorhebung.

TREND ist eine Zielvariable.

500 Bäume wurden infolge der Erstellung dieses Modells generiert. Beim Splitten der Knotenpunkte eines jeden Baums kamen 9 Prädiktoren (Variablen) zum Einsatz. Außerdem sind für uns Buttonfehler und OOB ROC von Interesse.

Dann folgen die Vorhersagefehler, die wie folgt aussehen:

OOB-Schätzung der Fehlerrate: 15,97%

Konfusionsmatrix

01class.error
0496011630,1899396
18585677 0,1312930

Tabelle 2. Kontingenztabelle der Fehlermatrix für das Trainingsset.

Folgende Interpretation wäre hier angemessen: „Out-of-bag-Fehlerquote: 15.97%".

Der erhaltene Vorhersagefehler ist signifikant. Es ist wichtig, herauszubekommen, wie er erhalten wurde bzw., um präziser zu sein, ob eine „out-of-bag“-Erhaltung vorliegt. Nur ein Teil des Trainingsdatensets wurde zur Entwicklung dieses Modells verwendet. Diese Modell wiederum stellt 70% des gesamten Source-Datensets dar. Ungefähr 60% des Trainingsdatensets wurde dazu verwendet, dieses Modell zu konstruieren. Die restlichen 40% wurden nicht genutzt. Diese 40% werden auch als „out-of-bag“ (OOB) bezeichnet. Der Vorhersagefehler von 15,97% basiert auf diesen Daten.

Machen wir weiter.

Die Kontingenztabelle oder Fehlermatrix wird in folgender Weise interpretiert. 

Die erste Reihe enthält die vorhergesagten Short- und Long-Positionen. Die Spalte auf der linken Seite enthält die tatsächlichen Short- und Long-Positionen.

Der Wert von 4960 mit den Koordinaten (0,0) ist die Zahl, die die korrekt vorhergesagten Short- und Long-Positionen anzeigt. Der nächste Wert von 1163 ist die Zahl der Short-Positionen, die als Long-Positionen vorhergesagt wurden.

Der Wert von 858 mit den Koordinaten (1,0) ist die Zahl, der Long-Positionen, die als Short-Positionen vorhergesagt wurden. Der Wert 5677 ist die Zahl der korrekt vorhergesagten Long-Positionen.

Wir kommen nun zu den Ergebnissen der Modellierung.

Unten befinden sich einige Reihen der großen Tabelle mit den Variablen des Modells. Die Variablen dieser Tabelle sind für uns von äußerster Wichtigkeit.

01MeanDecreaseAccuracyMeanDecreaseGini
MA_eur.5.dif142,9741,8554,86 321,86
EUR.dif337,2146,3851,80177,34
RSI_eur.14 37,7040,1150,75254,61
EUR.dif2 24,6631,6438,24110,83
MA_eur.10.dif122,9425,3931,48193,08
CHF.dif3  22,9123,4230,1573,36
MA_chf.5.dif1  21,8123,2429,56135,34

Tabelle 3. Relevanz der Variablen im Random-Forest-Modell

Es gibt mehrere Bewertungsmaßstäbe der Relevanz von Variablen. Das Wort „Wichtigkeit“ steht hierbei für den Grad des Einflusses einer bestimmen Variable, den diese auf die Zielvariable ausübt. Je größer dieser Wert, desto „wichtiger“ ist die Variable.

Diese Tabelle enthält Daten, um die am wenigsten wichtigsten Werte vom Modell auszuschließen. Was Statistiken und die Klassifizierung im Besonderen betrifft, so ist ein simpleres Modell stets besser, solange man dafür keine Abstriche bei der Präzision des Modells machen muss.

Der „Fehler“-Button ist das letzte wichtige Element des Modell-Tabs. Wenn man ihn drückt, so sollte man - wenn alles korrekt funktioniert - Abb. 8 sehen können.

Abb. 8 Abhängigkeit des Modellfehlers auf die Zahl der Bäume

Abb. 8 Abhängigkeit des Modellfehlers auf die Zahl der Bäume

6. Modelleffizienz

Die Evaluation der Effizienz des Modells erfolgt durch das Evaluieren-Tab, in dem Rattle den Zugang zu dem Set mit den entsprechenden Optionen gewährt.

Wir werden aus der Liste der möglichen Optionen zur Evaluation der Modelleffizienz die Fehlermatrix - also die Kontingenztabelle - benutzen.

Wenn Sie sich vom Modell-Tab in Richtung des Evaluieren-Tabs bewegen, so wird das letzte der kreierten Modelle automatisch geflaggt werden. Dies entspricht dem generellen Arbeitsprinzip von Rattle: Wir kreieren ein Modell und erforschen danach dessen Effizienz via Evaluieren-Tab.

Zur Evaluation eines Modells muss zunächst das Datenset, das die Überprüfung vornehmen soll, spezifiziert werden. Die nächste Operationszeile des Rattle-Interfaces ist ein Set an alternativen Source-Daten.

Die ersten vier Optionen für Daten korrespondieren mit dem Aufteilen des Datensets, so wie im Daten-Tab spezifiziert. Zu den zur Verfügung stehenden Optionen zählen: Training, Validierung/Verifizierung, Testen und Alle Sets. Das Aufteilen eines Datensets in die Sets Training, Validierung und Testen wurde bereits diskutiert.

Die erste Option dient dazu, das Modell hinsichtlich des Trainingsdatensets zu validieren. Das ist normalerweise keine sehr gute Idee. Das Problem beim Bewerten eines Modells bzgl. des Trainingssets ist der Umstand, dass das Modell auf diesem Set basiert. Folglich wird das Modell für dieses Set immer gute Resultate erzielen - das war ja schließlich auch das Ziel. Das Modell wurde designet, um im Zusammenhang mit unbekannten Daten zu interagieren.

Es bedarf also eines geeigneten Ansatzes, um sicherzustellen, dass das Modell bei der Interaktion mit neuen Daten eine entsprechende Performance aufweist. Zur gleichen Zeit erhalten wir ein tatsächliches Rating der Modellfehler. Hieran zeigt sich die Schwierigkeit zwischen Vorhersagen und tatsächlichen Daten. Dieses Fehler-Rating (Set unbekannter Daten, nicht das Trainingsset) ist der beste Weg, um die Effizienz eines Modells zu evaluieren.

Wir benutzen das Validierungsdatenset zur Verifizierung der Modelleffizienz, und zwar während seiner Kreierung als auch seines Konfigurationsprozesses. Daher gilt, dass, nachdem das Modell kreiert wurde, seine Effizienz auf Basis dieses Validierungsdatensets verifiziert werden wird. Einige der Konfigurationsoptionen zur Kreierung eines Modells können verändert werden. Wir vergleichen das neue Modell mit dem alten, wobei seine Effizienz auf dem Verifizierungsdatenset basiert. In diesem Sinne wird das Verifizierungsdatenset im Modellierungsprozess der Entwicklung des finalen Modells Anwendung finden. Wir haben daher eine verschobene bzw. verzerrte Schätzung der Effizienz unseres Modells, falls wir auf das Verifizierungsdatenset vertrauen.

Das Testdatenset ist das einzige, das während des Entstehungsprozesses des Modells nicht verwendet worden ist. Sobald wird das „beste“ Modell unter Zuhilfenahme des Trainings- und Verifizierungsdatensets identifiziert haben, können wir die Effizienz des Modells für das Testdatenset bestimmen. Diese ist die Evaluation der erwarteten Effizienz eines jeden neuen Datensets. Die vierte Option benutzt ein vollständiges Datenset zur Bewertung des Modells. Ein vollständiges Set besteht aus sämtlichen Daten des Trainings-, Verifizierungs- und Testdatensets. Diese Option basiert lediglich auf einem persönlichen Interesse und dient nicht dazu, präzise Daten zu erhalten.

Eine andere zur Verfügung stehende Möglichkeit sind Source-Daten, die durch den Beispieleintrag bereitgestellt werden. Dieser Bewertungstyp kann in den Ergebnis/Punkte-Optionen ausgewählt werden. In diesem Fall wird sich ein Fenster zur Eingabe zusätzlicher Daten öffnen.

Die Fehlermatrix wird dazu verwendet werden, um die kategoriale Zielvariable vorherzusagen.

Die Fehlermatrix zeigt eine Gegenüberstellung tatsächlicher und vorhergesagter Resultate. Wir reden hier von zwei Tabellen: Die erste enthält qualitative Resultate und die zweite zeigt die Ergebnisse in Prozent.

Die Fehlermatrix finden Sie im Evaluieren-Tab von Rattle. Durch eine Betätigung des „Ausführen“-Buttons erfolgt eine Umsetzung des ausgewählten Modells für das spezifizierte Datenset, um die Resultate für jede Beobachtung dieses Datensets vorherzusagen. Danach werden die Vorhersagen mit den tatsächlichen Beobachtungen verglichen.

Die Abb. 9 repräsentiert die Fehlermatrix des Random-Forest-Modells, das zuvor berechnet wurde.

Abb. 9 Resultate der Evaluation des Random-Forest-Modells

Abb. 9 Resultate der Evaluation des Random-Forest-Modells

Die Abbildung zeigt, dass der durchschnittliche Fehler 0,167, also 16,7% beträgt. Während der Trainingsphase wurde der Fehler auf 15,97% geschätzt bzw. „vorhergesagt“. Wir können diese Werte, so denke ich, an dieser Stelle als identisch betrachten.

Lassen Sie uns eine Berechnung für das Testdatenset durchführen. Dies führt zu folgendem Ergebnis:

Fehlermatrix für das Random-Forest-Modell hinsichtlich TC [Test] (Anzahl):

VorhergesagtVorhergesagt
Tatsächlich  01
01016256
11931248

 Tabelle 4. Fehlermatrix für das Random-Forest-Modell in absoluten Zahlen (Testdatenset)


Fehlermatrix für das Random-Forest-Modell hinsichtlich TC [Test] (Proportionen):

VorhergesagtVorhergesagt
Tatsächlich01Fehler
00,370,090,20
10,070,460,13

Tabelle 5. Fehlermatrix für das Random-Forest-Modell in relativen Zahlen (Testdatenset)


Gesamtfehler: 0,1654994, durchschnittlicher Klassenfehler: 0,1649244

Der vorhergesagte Fehler beträgt 16,4%.

Alle drei Abbildungen sind in etwa gleich, was als ein Zeichen für einen vernünftigen Modellierungsprozess angesehen werden kann.

Nehmen Sie bitte zur Kenntnis, dass die Effizienz von Modellen, die via Rattle berechnet wurden, mit dem Strategietester von MetaTrader 4 oder MetaTrader 5 überprüft werden sollte. Dann sollte eine Prüfung mithilfe eines Demo- bzw. daraufhin eines richtigen Kontos mit kleinen Lots erfolgen. Nur nachdem alle Tests abgeschlossen sind, kann eine endgültige Aussage über das Modell getroffen werden.


7. Verbesserung des Modells

Als wir uns der Korrelation der Pseudovariable ZZ.35 (mit Prädiktoren) widmeten, haben wir herausgefunden, dass eine signifikante Anzahl von Prädiktoren eine schwache Korrelation mit der Zielvariable aufwies.

Lassen Sie uns all jene Prädiktoren entfernen, die einen Korrelationskoeffizienten von 0,01 oder weniger aufweisen. Hierfür müssen Sie die relevanten Prädiktoren im Datei-Tab auf Ignorieren setzen und die Kalkulationen des Random-Forest-Modells im Modell-Tab wiederholen.

Wir erhalten das folgende Ergebnis:

  • out-of-bag-Vorhersagefehler = 15,77%;
  • Vorhersagefehler für das Validierungsdatenset = 15,67%;
  • Vorhersagefehler für das Testdatenset = 15,77%.

Obwohl der Fehler nur unwesentlich reduziert wurde, hat sich die Lücke zwischen Vorhersagefehlern für unterschiedliche Datensets verkleinert. Dies ist ein Zeichen für die Stabilität eines Modells.

Sie können nun damit fortfahren, Prädiktoren mittels der folgenden Korrelationstabelle zu entfernen. Die Effektivität des Modells kann durch eine Abnahme des Vorhersagefehler noch weiter verbessert werden, indem Daten aus der Tabelle der wichtigen Prädiktoren verwendet werden, die man infolge der Berechnung des Modells erhielt.

In jedem Fall ist das Entfernen von Prädiktoren so lange möglich, bis die Entfernung eines Prädiktors zu einer Abnahme der Modelleffizienz führt. Sie können an dem Punkt aufhören, an dem Sie ein minimales, aber dennoch effektives Modell für eine gewissen Anzahl an Prädiktoren besitzen.

8. Verwendung des Modells in MetaTrader 4

In der Theorie kann das Trading via Rattle auf folgende Weise organisiert werden. Die Eingabedaten für Rattle in Excel werden durch externe Tools für die Tag- und Nachtperiode vorbereitet. Beim Schließen des Wechsels bekommt ein Trader die benötigten Preise und setzt diese in die Source-Datei ein. Einige wenige Minuten später ist die Vorhersage für den nächsten Tag bereit und kann direkt von Beginn an benutzt werden.

Für ein Intraday-Trading ist entweder ein MetaTrader-4-Terminal oder sein Gegenstück notwendig.

Um einen automatischen oder auch semi-automatischen Trade mithilfe von Rattle zu organisieren, werden die folgenden Komponenten benötigt:

  • ein zuvor angelerntes Modell, das als R-Arbeitsplatz gespeichert wurde;
  • eine Kooperationsbibliothek des Terminals und von R;
  • ein Code in R, der jeden Datenblock des Modells weitergibt, erhält das Ergebnis und sendet das Modellierungsergebnis zurück zum Terminal.

Das Anlernen eines der sechs Modelle, die in Rattle zur Verfügung stehen, wurde oben besprochen. Die Zahl der Klassifizierungsmodelle, die in R zur Verfügung stehen, beläuft sich auf 150 - allerdings können Sie mit Rattle gar nichts anfangen.

Die Interaktionsbibliothek von R und das MetaTrader-4-Terminal finden Sie in der CodeBase: mt4R für das neue MQL4.

Der R-Code, der mit dem angelernten Modell korrespondiert, befindet sich im Journal (Log-Tab). Alle Aktionen, die mit der Entwicklung des Modells zusammenhängen, werden in Codeform in R registriert, um später für reale Tradingvorgänge verwandt zu werden.

Fazit

Ich hoffe, dass sowohl Tradinganfänger als auch erfahrene Trader vorliegenden Artikel nützlich finden werden, behandelt er doch die vorläufige Evaluation als auch Selektion eines Handelssystems.

Mithilfe von Rattle liegt die größte intellektuelle Herausforderung beim Entwickeln eines Handelssystems darin, die richtige Zielvariable und die dazu passenden Prädiktoren zu wählen. Erfahrene Trader besitzen bereits ein gewisses Wissen in diesem Bereich und Anfänger werden es erlangen, wenn sie sich ein wenig mit Rattle auseinandersetzen.