Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 7

 
Dr. Trader:

Danke, ich habe es versucht. Ich kann sehen, dass Sie viel getan haben, um die Prädiktoren auszuwählen, denn die Neuronen konnten leicht auf sie trainiert werden, und das Ergebnis wurde auch im Testdatensatz gespeichert.

Die folgenden Ergebnisse beziehen sich auf die Ausbildung auf R1.F3

1) Es gibt ein lustiges Ergebnis mit Rattle. HH mit der Standardkonfiguration zeigte Zug/Validierung/Testfehler von 30%/29%/33%. Der Fehler bei R2.F3 beträgt 35 %. Aber das alles ist wirklich nur ein Glücksfall, in einer anderen Konfiguration wäre es leicht unter- oder übertrainiert gewesen, hier hatte es einfach Glück.

2) Dann habe ich einen einfachen Ansatz mit unüberwachtem Lernen gewählt, 200 versteckte Neuronen, das Netzwerk wurde trainiert, bis es sich nicht mehr verbesserte. Fehler trainieren/validieren/prüfen/R2.F3 - 2%/30%/27%/45%. Natürlich wird das Netz neu trainiert.

3) Überwachtes Lernen. Das ist etwas anderes als bei Bäumen, aber man sollte dies immer mit einem Neuron tun, um es nicht zu überfordern. Im Wesentlichen geht es darum, das Training von Zeit zu Zeit zu unterbrechen und die Trainings-, Validierungs- und Testergebnisse zu überprüfen. Ich kenne die goldene Regel für die Zusammenstellung von Ergebnissen nicht, aber es ist ein ganz normaler Ansatz, mit einem Trainingsdatensatz zu trainieren, dann nach Fehlern in den Validierungs- und Testdatensätzen zu suchen und das Training zu beenden, wenn die Fehler in den Validierungs-/Testdatensätzen nicht mehr abnehmen. Dies bietet eine gewisse Garantie gegen Übertraining. R2.F3 wird während des gesamten Prozesses als nicht verfügbar betrachtet, und der Test wird erst nach dem Ende der Ausbildung durchgeführt. In diesem Fall betragen die Fehler von Train/Validate/Testing/R2.F3 27%/30%/31%/37%. Auch hier gibt es Übertraining, aber nicht viel. Sie hätten den Lernprozess frühzeitig stoppen können, nachdem der Zugfehler merklich kleiner geworden ist als der Validierungs-/Testfehler, aber das ist reine Spekulation... geholfen haben könnte oder auch nicht.

Die Zielvariable "R1.F1" hat drei Werte, Rattle kann das nicht mit Neuronics machen und man muss seinen eigenen Code in R schreiben, ich habe diesen Datensatz übersprungen.

"R1.F4" "R1.F5" "R1.F6" ergab für alle 4 Fehler in Rattle neuronka ungefähr die gleichen Ergebnisse, ich denke, ein angemessener Ansatz mit neuronka wird auch ungefähr die gleichen Ergebnisse liefern, ich habe mich nicht weiter mit ihnen beschäftigt.

Ich habe ähnliche Zahlen für forest und ada.

Wenn wir nun zu unseren "Widdern" zurückkehren - wie kann man das Rauschen aus einer willkürlichen Liste von Prädiktoren entfernen? Ich habe einen empirischen Algorithmus, der meine 27 Prädiktoren aus 170 ausgewählt hat. Ich habe es auch verwendet, um die Prädiktoren anderer Leute zu analysieren, und das ebenfalls mit Erfolg. Aufgrund dieser Erfahrung behaupte ich, dass alle R-Methoden, die "Wichtigkeits"-Variablen in ihren Algorithmen verwenden, den Prädiktorensatz nicht von Rauschen befreien können.

Ich appelliere an alle Leser des Threads: Ich bin bereit, die entsprechende Analyse durchzuführen, wenn die Rohdaten als RData oder als Excel-Datei vorliegen, die nicht bearbeitet werden müssen.

Abgesehen davon.

Anbei füge ich eine Reihe von Artikeln bei, die angeblich das Problem lösen, den ursprünglichen Satz von Prädiktoren von Rauschen zu befreien, und zwar mit viel besserer Qualität. Leider habe ich im Moment keine Zeit, es auszuprobieren. Vielleicht versucht es jemand und veröffentlicht das Ergebnis?

 
SanSanych Fomenko:

In der Anlage finden Sie eine Reihe von Artikeln, die angeblich das Problem lösen, den ursprünglichen Satz von Prädiktoren von Rauschen zu befreien, und zwar mit wesentlich höherer Qualität. Leider habe ich im Moment keine Zeit, es auszuprobieren. Vielleicht probiert es jemand aus und veröffentlicht das Ergebnis?

Danke, ich habe das Dokument durchgeblättert, aber nicht gefunden, was ich brauche. Ich versuche, mein Modell für Forex zu trainieren, irgendwo zwischen M15 und H4. Es reicht mir nicht aus, einfach die Daten für den letzten Balken zu nehmen, ich muss sie für Dutzende von Balken auf einmal nehmen und einen nach dem anderen in ein langes Array für Modelleingaben legen. Zum Beispiel (open_bar1, close_bar1, hh_bar1, open_bar2, close_bar2, hh_bar2, open_bar3, close_bar3, hh_bar3,...). Wenn eine Auswahlmethode mir sagt, dass ich die Zeit des zweiten Balkens entfernen soll, wird mir das nicht helfen. Die Methode sollte mir sagen, dass ich zum Beispiel alle Daten über die Zeit (Indizes 3, 6, 9...) entfernen soll.

Verstehe ich das richtig, dass Sie in Ihrer Datei ALL_cod.RData auch Rat_DF1 für das Training verwenden können (unter Angabe des erforderlichen Ziels) und dann Rat_DF2 und Rat_DF3 für die Überprüfung verwenden? Für Interessierte habe ich meinen Code in R beigefügt, der ein fehlergesteuertes neuronales Netztraining implementiert. Um eine andere Zielvariable zu wählen, können Sie einfach "Short_Long.75" in der Datei durch etwas aus "Short_Long.35", "Flet_Long", "Short_Flet", "Flet_In" ersetzen. Es ist bequemer, als verschiedene Datensätze zu ersetzen.

Dateien:
 
Dr. Trader:
Ich versuche, mein Modell für den Devisenhandel zu trainieren, irgendwo im Bereich M15-H4. Es reicht mir nicht aus, nur die Daten für den letzten Balken zu nehmen, ich muss sie für Dutzende von Balken auf einmal nehmen und sie nacheinander in ein langes Array für Modelleingaben einfügen. Zum Beispiel (open_bar1, close_bar1, hh_bar1, open_bar2, close_bar2, hh_bar2, open_bar3, close_bar3, hh_bar3,...). Wenn eine Auswahlmethode mir sagt, dass ich die Zeit des zweiten Balkens entfernen muss, hilft mir das nicht weiter. Die Methode sollte mir sagen, dass ich zum Beispiel alle Zeitdaten entfernen kann (Indizes 3, 6, 9...).

mmm Zeitangaben können erforderlich sein, da die Märkte je nach Sitzung unterschiedlich funktionieren.

Sehen Sie sich meine Forex-Funktionen an:

> names(sampleA)

  [1] "lag_diff_2"        "lag_diff_3"        "lag_diff_4"        "lag_diff_6"        "lag_diff_8"        "lag_diff_11"       "lag_diff_16"     

  [8] "lag_diff_23"       "lag_diff_32"       "lag_diff_45"       "lag_diff_64"       "lag_diff_91"       "lag_diff_128"      "lag_diff_181"    

 [15] "lag_diff_256"      "lag_diff_362"      "lag_diff_512"      "lag_diff_724"      "lag_mean_diff_2"   "lag_mean_diff_3"   "lag_mean_diff_4" 

 [22] "lag_mean_diff_6"   "lag_mean_diff_8"   "lag_mean_diff_11"  "lag_mean_diff_16"  "lag_mean_diff_23"  "lag_mean_diff_32"  "lag_mean_diff_45"

 [29] "lag_mean_diff_64"  "lag_mean_diff_91"  "lag_mean_diff_128" "lag_mean_diff_181" "lag_mean_diff_256" "lag_mean_diff_362" "lag_mean_diff_512"

[36] "lag_mean_diff_724" "lag_max_diff_2"    "lag_max_diff_3"    "lag_max_diff_4"    "lag_max_diff_6"    "lag_max_diff_8"    "lag_max_diff_11" 

 [43] "lag_max_diff_16"   "lag_max_diff_23"   "lag_max_diff_32"   "lag_max_diff_45"   "lag_max_diff_64"   "lag_max_diff_91"   "lag_max_diff_128"

 [50] "lag_max_diff_181"  "lag_max_diff_256"  "lag_max_diff_362"  "lag_max_diff_512"  "lag_max_diff_724"  "lag_min_diff_2"    "lag_min_diff_3"  

 [57] "lag_min_diff_4"    "lag_min_diff_6"    "lag_min_diff_8"    "lag_min_diff_11"   "lag_min_diff_16"   "lag_min_diff_23"   "lag_min_diff_32" 

 [64] "lag_min_diff_45"   "lag_min_diff_64"   "lag_min_diff_91"   "lag_min_diff_128"  "lag_min_diff_181"  "lag_min_diff_256"  "lag_min_diff_362"

 [71] "lag_min_diff_512"  "lag_min_diff_724"  "lag_sd_2"          "lag_sd_3"          "lag_sd_4"          "lag_sd_6"          "lag_sd_8"        

 [78] "lag_sd_11"         "lag_sd_16"         "lag_sd_23"         "lag_sd_32"         "lag_sd_45"         "lag_sd_64"         "lag_sd_91"       

 [85] "lag_sd_128"        "lag_sd_181"        "lag_sd_256"        "lag_sd_362"        "lag_sd_512"        "lag_sd_724"        "lag_range_2"     

 [92] "lag_range_3"       "lag_range_4"       "lag_range_6"       "lag_range_8"       "lag_range_11"      "lag_range_16"      "lag_range_23"    

 [99] "lag_range_32"      "lag_range_45"      "lag_range_64"      "lag_range_91"      "lag_range_128"     "lag_range_181"     "lag_range_256"   

[106] "lag_range_362"     "lag_range_512"     "lag_range_724"     "symbol"            "month"             "day"               "week_day"        

[113] "hour"              "minute"            "future_lag_2"      "future_lag_3"      "future_lag_4"      "future_lag_6"      "future_lag_8"    

[120] "future_lag_11"     "future_lag_16"     "future_lag_23"     "future_lag_32"     "future_lag_45"     "future_lag_64"     "future_lag_91"   

[127] "future_lag_128"    "future_lag_181"    "future_lag_256"    "future_lag_362"    "future_lag_512"    "future_lag_724"

Ich nehme sowohl die Daten der gleitenden Durchschnitte als auch die Höchst- und Tiefstwerte und die Preisspannen im Fenster. Und Zeit, und Tage und sogar Monate).

Meine Algorithmen können realistischerweise 10 oder sogar 5 von 114 Prädiktoren übrig lassen. Das ist normal. In solchen Daten gibt es eine starke Korrelation zwischen den PREDICTORS und somit eine starke Redundanz.

 

Ich werde Ihnen einen kurzen Überblick über meine Methode zur Auswahl informativer Merkmale geben. Der Code ist beigefügt.

Die Frage, wie die Teilmengen auszuwählen sind und wie die Relevanz der ausgewählten Prädiktoren für die Ausgangsvariable zu messen ist, hat zwei Seiten.

Die erste Frage. Ich löse sie durch stochastische Aufzählung von Prädiktorenkombinationen mit der Methode des Simulated Annealing. Ähnliche Ergebnisse wie in der Genetik und beim nicht-deterministischen Gradientenabstieg. Der Vorteil ist, dass er aus lokalen Minima auswählt und nach dem Prinzip der Natur arbeitet. Kann mit einer nicht glatten Fehleroberfläche arbeiten, aber hier ist alles bedingt.

Die Befürworter der Methode halten sie bei vielen Problemen für besser als die Genetik, zum Beispiel. Es wird durch ein Paket in R als ein Standard fast implementiert. Der Trick ist, dass es sich um kontinuierliche Daten handelt, und ich habe Indizes von Prädiktoren, also erstelle ich einen kontinuierlichen Vektor mit der Länge der Gesamtzahl der Prädiktoren, und wenn ein Skalar den vorgegebenen Schwellenwert überschreitet, wird der Index des Prädiktors zu eins.

Die zweite Frage ist noch subtiler. Fitness-Funktion.

Wie lässt sich messen, dass der Prädiktor (und die Menge der Prädiktoren) den Output beeinflusst? Die Abhängigkeit kann nichtlinear sein. Die Standardregression kann bei einigen nichtlinearen Problemen zu großen Verzögerungen führen. Ich spreche hier nicht von Blackbox-Training und der Verwendung eines eingebauten Wichtigkeitsschätzers. Ich spreche von einer separaten Methode.

Sie müssen verstehen, dass Abhängigkeiten sehr komplex sein können und Wechselwirkungen, Redundanzen und Nichtlinearität beinhalten. All diese Dinge können sowohl auf kategorische als auch auf numerische Daten angewendet werden.

Ich habe mich für kategoriale Daten entschieden, da es dafür gute informationstheoretische Werkzeuge gibt. Einfach ausgedrückt: Es gibt einen Input und einen Output. Wenn der Ausgangszustand zumindest ein wenig vom Eingang abhängt (probabilistisch), dann sind sie abhängig. Es gibt so etwas wie gegenseitige Information. Sie misst dies.

Gehen Sie nun tiefer. VI misst etwas an der beobachteten Verteilung in einer Stichprobe mit endlichem Umfang. Dies ist natürlich eine Punktschätzung.

Wir müssen also die statistischen Grenzen der Information im Falle eines unabhängigen Input-Output-Paares schätzen. Dies geschieht durch eine selbst geschriebene Funktion unter Verwendung numerischer Methoden.

Noch tiefer. Wenn wir zwei oder mehr Prädiktoren haben - was machen wir dann mit ihnen?

Erstens können sie selbst miteinander verwandt sein, und je mehr sie miteinander verwandt sind, desto mehr Redundanz gibt es in ihrer Menge. Diese Redundanz wird durch die so genannte Multi-Information gemessen. Aber auch die Mehrfachinformation ist eine Punktschätzung für eine Stichprobe. Dafür wird das Verteilungsquantil auch numerisch durch eine andere selbstgeschriebene Funktion berechnet.

Zweitens kann die Anzahl der Ebenen der Prädiktorenkategorien so groß sein (z. B. 2 ^ 15), dass nichts über die Abhängigkeit auf diesen Ebenen gesagt werden kann. Es gibt nur sehr wenige Beobachtungen pro Ebene.

Schließlich können wir, wenn wir all dies zusammengenommen haben, jede Art von Abhängigkeit von einer beliebigen Anzahl von Prädiktoren und Outputs bei einem beliebigen Stichprobenumfang mit vorgegebener statistischer Signifikanz messen. Die zugrundeliegenden Funktionen selbst stammen aus dem Paket Informationstheorie.

Es ist alles in der beigefügten Datei enthalten. Natürlich ist es nicht einfach, das ohne 100 Gramm zu verstehen. Außerdem gibt es einen vollständigen Code für die Erstellung von Handelsregeln und deren Validierung. Alles zu Ihrer Information und zur Vertiefung Ihrer Kenntnisse.

Im Grunde genommen ist das Ergebnis wie immer:

[1] "1.69%"

> final_vector <- c((sao$par >= threshold), T)

> names(sampleA)[final_vector]

 [1] "lag_diff_23"      "lag_diff_45"      "lag_mean_diff_2"  "lag_mean_diff_8"  "lag_max_diff_11"  "lag_max_diff_181" "lag_min_diff_3"   "lag_min_diff_724"

 [9] "lag_sd_724"       "lag_range_32"     "symbol" "future_lag_181"  

Nach anderthalb Tagen Arbeit und der Aufzählung von Zehntausenden von Prädikatorenkombinationen gibt die Funktion einen Fitness-Funktionswert aus - das ist eine aussagekräftige gegenseitige Information, die um die Redundanz in der Prädikatormenge bereinigt ist. Und die Prädiktoren selbst.

All dies, ich wiederhole es, ist kategorisch und ermöglicht die Erstellung von für den Menschen lesbaren Regeln. Ermöglicht die Interpretation des gefundenen Musters.

Zum Beispiel habe ich oben 1,7 % vollständigen Determinismus (was für Forex nicht schlecht ist) und eine Menge Eingaben, die zusammen signifikant auf dem 0,1-Konfidenzniveau (ich habe das Experiment so formuliert) den (binären) Ausgangszustand bestimmen. Das heißt, die Informationen in den Forex-Daten sind eindeutig vorhanden. Die Frage ist experimentell bewiesen.

Danach können wir nach der Validierung die Rentabilität bewerten und das Handelssystem codieren.

Alexej

 
Dr. Trader:


Habe ich richtig verstanden, dass Sie in Ihrer Datei ALL_cod.RData auch Rat_DF1 für das Training verwenden können (indem Sie das gewünschte Ziel angeben) und dann Rat_DF2 und Rat_DF3 für die Überprüfung verwenden? Für Interessierte habe ich meinen Code in R beigefügt, der ein fehlergesteuertes neuronales Netztraining implementiert. Um eine andere Zielvariable zu wählen, können Sie einfach "Short_Long.75" durch etwas aus "Short_Long.35", "Flet_Long", "Short_Flet", "Flet_In" ersetzen. Dies ist bequemer als das Ersetzen verschiedener Datensätze.

Ja, genau aus Gründen der Bequemlichkeit beim Klappern.

Eine weitere Nuance.

Alle Zielvariablen werden von zwei ZZ abgeleitet: ZZ(35) und ZZ(25). Und hier ist eine sehr unangenehme Nuance, die mit Ihrer übereinstimmt.

Die Zielvariable ist eine Folge von 0 und 1, die dem ZZ-Arm entspricht. Aber wir sagen IMMER ein einzelnes Element des ZZ-Arms voraus, nicht den Arm selbst. Es ist also falsch zu sagen, dass wir Trends vorhersagen. Es ist richtig, wenn wir sagen, dass wir ein Element eines Trends vorhersagen. Und wenn man alle vorhergesagten Trendelemente zusammenzählt, wird der Trend wahrscheinlich nicht funktionieren.

 

Danke für feature_selector_modeller.zip, ich werde es mir ansehen.

SanSanych Fomenko:

Ich wende mich an alle Leser der Branche: Ich bin bereit, die entsprechende Analyse durchzuführen, wenn die Ausgangsdaten in Form einer RData- oder Excel-Datei vorgelegt werden, die keine Bearbeitung erfordert.

Ich habe die Datei angehängt, es handelt sich um eine Reihe von Daten aus dem Forex-Bereich. Innerhalb von RData mit zwei Datensätzen, für das Training und für die Validierung. Physikalisch gesehen laufen die Daten in den beiden Datensätzen hintereinander, sie sind nur der Einfachheit halber für den Test des Modells in zwei Dateien aufgeteilt. Das Modell kann auf diesem Datensatz trainiert werden, ich habe die Prädiktoren manuell ausgesiebt und das Neuron trainiert, am Ende war der minimale Fehler auf dem Validierungsdatensatz 46%, was nicht wirklich profitabel ist. Sie können sich einen echten Gewinn vorstellen, wenn der Fehler unter 40 % fällt. Versuchen Sie bitte, die Prädiktoren aus dieser Datei herauszufiltern.

SanSanych Fomenko:

Die Zielvariable ist eine Folge von 0 und 1, was der Hebelwirkung ZZ entspricht. Aber wir sagen IMMER ein einzelnes Element des ZZ-Arms voraus, nicht den Arm selbst. Es ist also falsch zu sagen, dass wir Trends vorhersagen. Es ist richtig, wenn wir sagen, dass wir ein Element eines Trends vorhersagen. Und wenn man alle vorhergesagten Trennelemente zusammenzählt, kommt man wahrscheinlich nicht einmal auf einen Trend.

Ich habe verschiedene Zielvariablen ausprobiert. Einerseits können Sie den Preis einen Balken voraussagen, und die Zielvariable wird dann 1 oder 0 sein, je nachdem, ob der Preis für den nächsten Balken nach oben oder nach unten geht. Bei kleinen Zeitrahmen habe ich nie ein Ergebnis erhalten, der Schlusskurs scheint dort eine eher zufällige Zahl zu sein. Aber auf H1 und darüber gibt es bereits einige positive Ergebnisse.

Eine weitere Variante sind Zickzack- oder andere Trendindikatoren. Ich habe damit einige positive Ergebnisse erzielt, allerdings unter der Bedingung, dass das Ergebnis der Neuronen durch den Filter geht. Zum Beispiel, um den Durchschnitt der Ergebnisse für die letzten Balken zu nehmen oder nur die Ergebnisse über einem bestimmten Schwellenwert zu verwenden. Meiner Meinung nach lohnt es sich nicht, all das anzuwenden, denn es ist eher ein Rätselraten als eine präzise Berechnung. Das Problem besteht darin, dass das Modell nur Kaufsignale für die nächsten 10-20 Balken geben soll, während es dazwischen manchmal Verkaufssignale gibt. In einem solchen Fall wird das Geschäft rückabgewickelt, die Provision und der Spread werden gezahlt, und so weiter, mehrmals pro Trend. Daher sollten wir entweder eine hohe Genauigkeit erreichen oder die Ergebnisse glätten, um solche Umkehrungen bei nur einem Balken zu vermeiden. Das heißt, wie Sie sagten, wird nur ein Element eines Trends vorhergesagt; der Trend selbst kann sich nicht aus solchen Elementen zusammensetzen.

Dateien:
set56.RData.zip  525 kb
 
Dr. Trader:


Ich habe verschiedene Zielvariablen ausprobiert. Einerseits können Sie den Preis einen Balken voraussagen, und die Zielvariable wird dann 1 oder 0 sein, je nachdem, ob der Preis für den nächsten Balken gestiegen oder gefallen ist. Bei kleinen Zeitrahmen habe ich nie ein Ergebnis erhalten, der Schlusskurs scheint dort eine eher zufällige Zahl zu sein. Aber auf H1 und darüber gibt es bereits einige positive Ergebnisse.


Meine Ergebnisse sind durchweg das Gegenteil. Ich kann die Kursentwicklung problemlos einige Minuten im Voraus (bis zu einer Stunde) mit einer Genauigkeit von 55 % vorhersagen (Ask to Ask). Bestes Ergebnis seit 23 Minuten. Es handelt sich um eine binäre Klassifizierung anhand von Validierungsproben.

Und mit zunehmendem Vorhersagehorizont sinkt die Genauigkeit langsam auf 51 % bei 12 Stunden Vorhersage. Und diese Korrelation besteht in der gesamten Geschichte. Aber die Genauigkeit muss noch höher sein, um auf die Plus-Seite zu gelangen (um den Abstand zwischen Ask und Bid zu überwinden).

Wir werden später darauf eingehen.

 
Dr. Trader:

Danke für die feature_selector_modeller.zip, ich werde sie mir ansehen.

Ich habe die Datei beigefügt, es handelt sich um einen Forex-Datensatz. Innerhalb von RData mit zwei Datensätzen, für das Training und für die Validierung. Physikalisch gesehen folgen die Daten in den beiden Datensätzen einander, sie sind nur der Einfachheit halber in zwei Dateien aufgeteilt, um das Modell zu testen. Das Modell kann auf diesem Datensatz trainiert werden, ich habe die Prädiktoren manuell ausgesiebt und das Neuron trainiert, am Ende war der minimale Fehler auf dem Validierungsdatensatz 46%, was nicht wirklich profitabel ist. Sie können sich einen echten Gewinn vorstellen, wenn der Fehler unter 40 % fällt. Versuchen Sie bitte, die Prädiktoren aus dieser Datei herauszufiltern.


Ich habe keinen einzigen Prädiktor gefunden - alle sind Rauschen. Ihre Prädiktoren haben keine Vorhersagekraft für Ihre Zielvariable. Einige Hinweise 54,55,56. Vielleicht können Sie ja etwas aus ihnen herausholen... Ansonsten kann meiner Meinung nach alles weggeworfen werden.
 
Verstehe, danke, ich werde mich nach weiteren Inputs umsehen.
 
Dr. Trader:
Ich verstehe, danke, ich werde nach weiteren Rohdaten suchen.

Bleiben Sie dran. Ich werde Ihre Daten auch auf Abhängigkeiten überprüfen.

Eine Frage, bevor ich anfange. Umfassen Ihre Daten alle Balken in einer Reihe, oder wurden die Balken vor der Erstellung der Stichproben ausgedünnt?