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

 
SanSanych Fomenko:

Ich sehe keinen Beweis dafür, dass die NS irgendetwas bewältigt hat.

Übermäßiges Lernen ist ein weltweites Übel in der Wissenschaft und insbesondere im Modellbau.

Daher wird ein Fehler für drei Sätze benötigt:

  • Lernsets. Die Art und Weise, wie Rattle es versteht (OOB, Test, Validierung), reicht völlig aus.
  • eine Menge, die in Bezug auf die Daten außerhalb der Trainingsmenge liegt.
  • Eine weitere Menge, die im Sinne von Daten außerhalb der Trainingsmenge liegt.

Die letzten beiden Sets werden bei ihrer Ankunft im Terminal nicht gemischt, die Basen befinden sich hinter der Theke.

Der Fehler sollte bei allen drei Sätzen etwa gleich groß sein. Dabei müssen Sie die Menge der Prädiktoren festlegen, die Sie beim Training des Modells verwenden.

Eine Umschulung für diese Aufgabe habe ich zunächst nicht in Erwägung gezogen, es war nicht nötig. Das erste Mal war neuronc mit nur einem Neuron in der inneren Schicht. Ich habe jetzt überprüft, dass der Fehler während des kontinuierlichen Lernens bei etwa 45 % liegt und nicht niedriger wird. Das Netz gibt den Eingängen 1,3,5,7,9,11 beim Training höhere Gewichte, kann aber wegen des Mangels an Neuronen nicht wirklich trainieren. Die Idee war, unter sehr eingeschränkten Bedingungen ein möglichst korrektes Ergebnis herauszuholen und zu sehen, welche Eingaben stärker gewichtet werden.

Mit der Validierungsdatei kann ich jetzt ernsthafter arbeiten. Jetzt habe ich die Quelldatei in 2 Teile aufgeteilt (85% und 15%), mit dem ersten Teil trainiert, das Training manchmal abgebrochen und den Fehler in beiden Teilen gemessen. Die Beispiele aus der 15 %-Datei wurden nicht in das Training übernommen, aber der Fehler in diesen Beispielen ist in etwa so stark zurückgegangen wie im Trainingsteil. Als der Fehler in beiden Teilen der Datei 0 % betrug, beendete ich das Training und testete die Neuronen in der zweiten Datei, der Fehler lag dort bei ~0 %. Es stellt sich heraus, dass bei dieser Aufgabe nicht einmal ein Übertraining erreicht wurde, das ist schon komisch.


Aber die Neuronen auf dem Forex sind schlimmer als bei diesem Problem. Zunächst sinkt der Fehler sowohl bei den Trainings- als auch bei den Validierungsproben. Wenn der Fehler bei der Trainingsstichprobe weiter sinkt, bei der Teststichprobe jedoch zunimmt, ist es an der Zeit, das Training zu beenden. Dann prüfe ich das Ergebnis in der Regel anhand des Verlaufs vor der Stichprobe und erneut anhand des Verlaufs nach der Stichprobe. Für mich sind das drei Datensätze, wie bei Ihnen. Allerdings ist der Fehler in allen drei Sätzen bisher unterschiedlich (und außerhalb des Trainingszeitraums groß).

Ich hatte verschiedene Ideen, wie man die Ergebnisse verbessern könnte, z. B. durch Glätten der Ergebnisse oder durch Hinzufügen eines Filters (<0,1 - verkaufen, >0,9 - kaufen, und alles dazwischen - Zeitraum ohne Handel). Man kann die Ergebnisse verbessern, indem man der neuronalen Ausgabe Filter hinzufügt und sie ebenfalls optimiert, aber für den Fronttest hat das überhaupt nicht geholfen. Eine weitere gute Idee war, dass man, wenn das Neuron für einen bestimmten Zeitraum trainiert wurde, den Filter für den Zeitraum vor diesem Zeitraum optimieren kann. Denn ein Fehler vor dem Optimierungszeitraum ist wahrscheinlich mit einem Fehler nach dem Optimierungszeitraum verbunden. Aber es hat nicht funktioniert - wenn es drei Perioden der Geschichte gibt - "vor dem Neuron" - "lernendes Neuron" - "nach dem Neuron", dann werden alle drei ihre optimalen Filter haben, die in keiner Weise miteinander verbunden sind.

Bisher bin ich zu dem Schluss gekommen, dass das Modell einen kleinen Fehler (<10%) für die Trainings- und Teststichproben haben sollte. Es sollten keine Filter auf das Modellergebnis angewandt werden, und es sollten keine Vermutungen wie "das Ergebnis jede vierte Woche umkehren" angestellt werden. Nicht in Zeiträume kleiner als M15 fallen. Ich probiere verschiedene neue Ideen aus, und es ist gut, wenn mindestens eine von zehn Ideen das Ergebnis verbessert. Und irgendwie sollte dies zu einem rentablen Modell führen.

 
Dr. Trader:

Eine Umschulung für diese Aufgabe habe ich zunächst nicht in Betracht gezogen, es bestand keine Notwendigkeit. Beim ersten Mal gab es nur ein Neuron in der inneren Schicht. Ich habe jetzt überprüft, dass der Fehler bei langem Training bei etwa 45 % liegt und nicht niedriger wird. Das Netz gibt den Eingängen 1,3,5,7,9,11 beim Training höhere Gewichte, kann aber wegen des Mangels an Neuronen nicht wirklich trainieren. Die Idee war, unter sehr eingeschränkten Bedingungen das maximal korrekte Ergebnis herauszuholen und zu sehen, welche Eingaben stärker gewichtet werden.

Mit der Validierungsdatei kann ich jetzt ernsthafter arbeiten. Jetzt habe ich die Quelldatei in 2 Teile aufgeteilt (85% und 15%), mit dem ersten Teil trainiert, das Training manchmal abgebrochen und den Fehler in beiden Teilen gemessen. Die Beispiele aus der 15 %-Datei wurden nicht in das Training übernommen, aber der Fehler in diesen Beispielen ist in etwa so stark zurückgegangen wie im Trainingsteil. Als der Fehler in beiden Teilen der Datei 0 % betrug, beendete ich das Training und testete die Neuronen in der zweiten Datei, der Fehler lag dort bei ~0 %. Es stellt sich heraus, dass bei dieser Aufgabe nicht einmal ein Übertraining erreicht wurde, das ist schon komisch.


Aber die Neuronen auf dem Forex sind schlimmer als bei diesem Problem. Zunächst sinkt der Fehler sowohl bei den Trainings- als auch bei den Validierungsproben. Wenn der Fehler in der Trainingsstichprobe weiter sinkt, in der Teststichprobe jedoch zunimmt, ist es an der Zeit, das Training zu beenden. Dann prüfe ich das Ergebnis in der Regel anhand des Verlaufs vor der Stichprobe und erneut anhand des Verlaufs nach der Stichprobe. Für mich sind das drei Datensätze, wie bei Ihnen. Allerdings ist der Fehler in allen drei Sätzen bisher unterschiedlich (und außerhalb des Trainingszeitraums groß).

Ich hatte verschiedene Ideen, wie man die Ergebnisse verbessern könnte, z. B. durch Glätten der Ergebnisse oder durch Hinzufügen eines Filters (<0,1 - verkaufen, >0,9 - kaufen, und alles dazwischen - Zeitraum ohne Handel). Man kann die Ergebnisse verbessern, indem man der neuronalen Ausgabe Filter hinzufügt und sie ebenfalls optimiert, aber für den Fronttest hat das überhaupt nicht geholfen. Eine weitere gute Idee war, dass man, wenn das Neuron für einen bestimmten Zeitraum trainiert wurde, den Filter für den Zeitraum vor diesem Zeitraum optimieren kann. Denn ein Fehler vor dem Optimierungszeitraum ist wahrscheinlich mit einem Fehler nach dem Optimierungszeitraum verbunden. Aber es hat nicht funktioniert - wenn es drei Perioden der Geschichte gibt - "vor dem Neuron" - "lernendes Neuron" - "nach dem Neuron", dann werden alle drei ihre optimalen Filter haben, die in keiner Weise miteinander verbunden sind.

Bisher bin ich zu dem Schluss gekommen, dass das Modell einen kleinen Fehler (<10%) für die Trainings- und Teststichproben haben sollte. Wenden Sie keine Filter auf das Modellergebnis an und stellen Sie keine Vermutungen an, wie z. B. "kehren Sie das Ergebnis jede vierte Woche um". Nicht in Zeiträume kleiner als M15 fallen. Ich probiere verschiedene neue Ideen aus, und es ist gut, wenn mindestens eine von zehn Ideen das Ergebnis verbessert. Und irgendwie sollte dies zu einem rentablen Modell führen.

Es ist alles in den Daten )

Die Daten in allen Sätzen sollten voneinander unabhängige Erfassungen enthalten. Aber auch in diesem Fall wird die Validierung das schlechteste Ergebnis liefern.
 

Ich habe verschiedene Modelle von Rattle ausprobiert, auch der Wald brachte gute Ergebnisse.

Schritt 1 - der Wald hat etwas trainiert, und in den Statistiken sehen die Eingaben 1,3,5,7,9,11 irgendwie getrennt aus. Fehler in der Trainingsdatei 0%, in der Validierungsdatei 46%.

Schritt 2 - nur noch die Eingaben 1,3,5,7,9,11 in der Datei und das Ergebnis. Ich habe den Wald erneut mit der neuen Datei trainiert, jetzt liegt der Fehler sowohl in der Trainings- als auch in der Validierungsdatei bei 0 %, alles ist in Ordnung. Die einzige Nuance war, dass Rattle für den zweiten Schritt den Parameter "Anzahl der Variablen" auf 2 setzte, wahrscheinlich weil die Datei kleiner ist. Ich habe sie wie im ersten Schritt auf 4 geändert.

 

Dr.Trader

Es ist schön, einen Bruder im Geiste zu sehen, der auf Rasseln basiert. Zumindest können wir die Ergebnisse vergleichen.

So und meine eigene Erfahrung.

Wir machen daraus Rasseln und Modelle.

Auf der Registerkarte "Modell" lernen wir, indem wir den Wert der AOB erhalten, und auf der Registerkarte "Auswerten" werten wir die Validierungs- und Testmengen aus. Wir erhalten drei Zahlen.

Ich behaupte, dass die Ergebnisse, die erzielt werden, wenn der Prädiktorensatz nicht zuvor von Rauschprädiktoren bereinigt wurde, nichts aussagen, sondern höchstwahrscheinlich nur eine Ansammlung von Zahlen sind.

Auf der Registerkarte Auswerten werden nicht nur die Ergebnisse aufgelistet, sondern die Menge muss auch in das R-Datensatzfenster eingefügt werden. Es ist sehr wichtig, dass dieser Satz durch mechanische Teilung der Originaldatei, d. h. der ersten Datei für alle drei Ziffern, z. B. vom 1. Januar 2014 bis zum 1. Januar 2015, erhalten wird, aber die Datei im

R-Datensatz notwendigerweise nach dem 1. Januar 2015 ohne Zufallsstichproben und andere in R verwendete Tricks. Es ist einfach stumpf und mechanisch.

Ich kenne keine anderen Möglichkeiten, den Erfolg der Trennung signifikanter Prädiktoren von verrauschten Prädiktoren zu bewerten, da die von mir vorgeschlagene Methode den realen Handel imitiert.

Könnten Sie bitte alle vier Zahlen veröffentlichen? Einschließlich des Ergebnisses in der Datei aus dem R-Datensatz-Fenster?

 
Dr. Trader:

Ich habe verschiedene Modelle von Rattle ausprobiert, auch der Wald brachte gute Ergebnisse.

Schritt 1 - der Wald hat etwas trainiert, und in den Statistiken sehen die Eingaben 1,3,5,7,9,11 irgendwie getrennt aus. Der Fehler in der Trainingsdatei liegt bei 0 %, in der Validierungsdatei bei 46 %.

Schritt 2 - nur noch die Eingänge 1,3,5,7,9,11 in der Datei und das Ergebnis. Ich habe den Wald erneut mit der neuen Datei trainiert, jetzt liegt der Fehler sowohl in der Trainings- als auch in der Validierungsdatei bei 0 %, alles ist in Ordnung. Die einzige Nuance war, dass Rattle für den zweiten Schritt den Parameter "Anzahl der Variablen" auf 2 setzte, wahrscheinlich weil die Datei kleiner ist. Ich habe sie wie im ersten Schritt auf 4 geändert.

Interessant... Die Tiefe muss auf 6 Variablen eingestellt werden, damit alle relevanten Variablen erfasst werden.
 
Dr. Trader:

Ich habe verschiedene Modelle von Rattle ausprobiert, auch der Wald brachte gute Ergebnisse.

Schritt 1 - der Wald hat etwas trainiert, und in den Statistiken sehen die Eingaben 1,3,5,7,9,11 irgendwie getrennt aus. Der Fehler in der Trainingsdatei liegt bei 0 %, in der Validierungsdatei bei 46 %.

Schritt 2 - nur noch die Eingänge 1,3,5,7,9,11 in der Datei und das Ergebnis. Ich habe den Wald erneut mit der neuen Datei trainiert, jetzt liegt der Fehler sowohl in der Trainings- als auch in der Validierungsdatei bei 0 %, alles ist in Ordnung. Die einzige Nuance war, dass Rattle für den zweiten Schritt den Parameter "Anzahl der Variablen" auf 2 setzte, wahrscheinlich weil die Datei kleiner ist. Ich habe sie wie im ersten Schritt auf 4 geändert.

Im ersten Fall wurde der Wald mit Geräuschen trainiert, was nicht gut ist.
 
SanSanych Fomenko:

Könnten Sie bitte alle vier Zahlen veröffentlichen? Ergebnis aus dem R-Datensatz-Fenster in die Datei aufnehmen?

Habe dies mit neuronka gemacht - dummy_set_features.csv ist in 3 Teile aufgeteilt 70%/15%/15%; dummy_set_validation.csv wird in der Registerkarte evaluate als "csv-Datei" verwendet (es ist im Wesentlichen das gleiche wie R Dataset, nur ein anderes Dateiformat).

Ich habe das Protokoll von Rattle genommen, diese beiden Einschränkungen aus dem Neuronics-Aufruf entfernt, über den ich vorhin geschrieben habe, und es in R ausgeführt, aber das Modell ist immer noch untertrainiert (35 % Fehler bei der Trainingsstichprobe). Es ist also so, dass das Trainingsergebnis schlechter wird, wenn man die Trainingsstichprobe reduziert. Aber man kann die Anzahl der Neuronen in der inneren Schicht erhöhen, das sollte das Lernen verbessern.

Ich änderte die Anzahl der Neuronen von 10 auf 20, führte das Training erneut durch und der Fehler beim Training lag nun bei 0%. Der Fehler der Validierungsstichprobe beträgt 0,6 %, der Fehler der Teststichprobe 0,1 %. Der Fehler in der Datei dummy_set_validation.csv beträgt 0,3 %. Alles gut, R in der Anwendung.

Interessanterweise stellt sich heraus, dass sich die Trainingsprobleme von Neuronka stark von den Baumproblemen unterscheiden. Für mich besteht das Problem bei nn darin, die richtige Anzahl interner Neuronen zu wählen und das Lernen zu unterbrechen, bevor das Netz mit dem Retraining beginnt. Im Prinzip gilt: je mehr Neuronen, desto besser, aber das wirkt sich stark auf den erforderlichen Arbeitsspeicher und die Trainingszeit aus. Überflüssige Prädiktoren sind kein großes Hindernis für das Lernen, die Neuronen lernen in der Regel genauso gut mit ihnen, aber sie erhöhen die Trainingszeit, und es ist besser, sie loszuwerden, damit es schneller geht.

Sobald ich selbst geschriebene mt4 Netzwerk verwendet, könnte ein EA lernen und Handel sofort. Es gab Probleme mit der Lerngeschwindigkeit, der Initialisierung der Gewichte und den Lernalgorithmen. Es gab zu viele kleine Probleme, und es war schwer, selbst mit einer Trainingsstichprobe gute Ergebnisse zu erzielen, so dass ich schließlich aufgab und jetzt in R arbeite. Das nnet-Paket kann mit dem bfgs-Algorithmus trainieren, der all diese kleinen Probleme beseitigt. Das Paket darf jedoch nur 1 innere Lage enthalten. Ich möchte mindestens 3 interne Schichten haben, aber mit bfgs-Algorithmus, sonst gibt es eine Menge Probleme mit dem Lernen wieder.

Dateien:
r_nnet2.txt  10 kb
 
Dr. Trader:

Habe dies mit Neuron gemacht - dummy_set_features.csv ist standardmäßig in 3 Teile aufgeteilt 70%/15%/15%; dummy_set_validation.csv wird in der Registerkarte evaluate als "csv-Datei" verwendet (dies ist im Wesentlichen dasselbe wie R Dataset, nur ein anderes Dateiformat).

Nein, das ist nicht dasselbe.

Erstaunlich ist, dass ich mit vielen Leuten über dieses Thema diskutiere und NIEMAND macht es so, wie ich es schreibe. Und ich weiß, was ich schreibe, denn ich habe ein halbes Jahr mit Übungen wie der Ihren verbracht, und zwar außerhalb von rattle(). Was ich nicht in den Tester eintrage, bekomme ich einen ganz anderen Fehler. Dann habe ich getan, was ich oben beschrieben habe, und der Fehler im Prüfprogramm stimmte praktisch mit dem Fehler in der R-Datensatzdatei überein.

Ich habe Alexey drei Dateien gegeben, die man erhält, wenn man eine große Datei mechanisch in drei Teile zerlegt. Im ersten Teil üben wir, lernen, bewerten... Und bei den anderen beiden überprüfen wir die Zahlen, die wir bei der ersten erhalten haben. Wenn alle drei Dateien Fehler von mehr als 20 %(!) oder genauer gesagt von mehr als 40 % aufweisen, wird das Modell nicht neu trainiert und Sie können damit arbeiten.

Die obigen 3 Dateien enthalten 27 Prädiktoren und 6 Zielvariablen. Die 27 Prädiktoren wurden von meinen eigenen Algorithmen aus 170 Prädiktoren ausgewählt. Bis heute führen diese 27 Prädiktoren nicht zu übertrainierten Modellen. Die verbleibenden 143 Prädiktoren aus meinem Satz sind jedoch Rauschen, und bei diesem Rauschen kann man leicht einen Fehler erhalten, der mit dem Ihren vergleichbar ist, aber das Modell ist übertrainiert und nicht für die weitere Verwendung geeignet.

Warum ist der Fehler bei den Rauschprädiktoren geringer als bei den aussagekräftigen Prädiktoren?

Da der Algorithmus zur Modellanpassung dazu tendiert, den Anpassungsfehler zu reduzieren, ist er meiner Meinung nach immer in der Lage, unter den verrauschten, zufälligen Werten etwas zu finden, das besser ist als die sinnvollen Prädiktoren. Je kleiner der Fehler ist, desto weniger aussagekräftige Prädiktoren sind an der Modellbildung beteiligt!

PS

Dem Irrtum nach zu urteilen, ist NS entweder zu 100 % übertrainiert, oder er schaut voraus.

 

Die "CSV-Datei" und der "R-Datensatz" auf der Registerkarte "Auswerten" sind einfach unterschiedliche Arten der Angabe der Datenquelle. Wenn Sie sie mit denselben Daten füttern, werden Sie beim Testen des Modells dasselbe Ergebnis erhalten.

Wenn vor dem Rasseln ausführen

dataset_validate <- read.csv("file:///C:/dummy_set_validation.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")

dann ist dieses dataset_validate jetzt auf der Registerkarte evaluate als R-Datensatz verfügbar. Das Ergebnis der Modellprüfung wird jedoch dasselbe sein, wie wenn Sie nur die Option csv-Datei auswählen und die Datei C:/dummy_set_validation.csv angeben, da die Daten für den Test in beiden Fällen identisch sein werden.

Das Training selbst fand in einer anderen Datei statt, dummy_set_features.csv, so dass ein Blick in die Zukunft hier nicht möglich ist, da die Daten in beiden Dateien unterschiedlich und überhaupt nicht zeitabhängig sind (sondern formelabhängig). Ich denke, dass die Neuronen eine großartige Arbeit geleistet haben. Sie haben 6 Eingänge gefunden, die das Ergebnis bestimmen, den Einfluss anderer Eingänge reduziert und mit etwas neuronaler Logik die gewünschte Formel beschrieben.

Vorsichtshalber habe ich beide Dateien überprüft, um doppelte Zeichenfolgen zu finden, falls es welche gibt. Hier ist der Code in R:

#читаем  данные из файлов для обучения и валидации
dataset_train <- read.csv("file:///C:/dummy_set_features.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")
dataset_validate <- read.csv("file:///C:/dummy_set_validation.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")

anyDuplicated(dataset_train) #количество  повторных строк в первом файле - 567
anyDuplicated(dataset_validate) #количество  повторных строк во втором файле - 202
#  это покачто просто повторные строки в обоих файла по отдельности. Это не вредит, но и ничего не улучшает, лучше их убрать.
dataset_train <- unique(dataset_train)
dataset_validate <- unique(dataset_validate)

#Теперь  можно узнать сколько строк из dataset_train повторяются в dataset_validate
dataset_combined <- rbind(dataset_train, dataset_validate) #Объединяем  оба файла в один
nrow(dataset_combined) - nrow(dataset_combined[!duplicated(dataset_combined), ]) #количество  повторенных строк - 23. Таких повторов быть не должно, их надо удалить.
#Удаление  повторенных строк из dataset_validate
dataset_validate <- dataset_validate[!(tail(duplicated(dataset_combined), nrow(dataset_validate))), ]
#Удаление  из памяти объединённого файла, он больше не нужен
rm(dataset_combined)

Wenn dies vor dem Rattle geschieht, stehen die Tabellendataset_train unddataset_validate für das Training und die Modellprüfung zur Verfügung, und es gibt keine Duplikate. Ruhm R.

Die Modellvalidierungsdatei enthielt 23 Wiederholungen aus der Trainingsstichprobe, aber darüber hinaus enthält sie weitere 3000 eindeutige Zeilen, so dass die Modellbewertung nicht wesentlich beeinflusst werden konnte.

 
So sollte es auch sein. Die Datei wird durch Zufallszahlen erzeugt.

Im Allgemeinen habe ich die Komplexität der Aufgabe überschätzt. Der Wald hat das Problem bereits gelöst. Sie werden sich fragen, wie dies angesichts der Funktionsweise des Waldes möglich ist.