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

 
mytarmailS:
Das habe ich bereits getan, aber das neuronale Netz lernt nicht auf einen größeren Horizont mit dem Ziel, das ich ihm gegeben habe.

Ich lächle über Ihre Worte.

Es handelt sich nicht um ein neuronales Netz, das nicht lernt, sondern Sie sorgen dafür, dass es nicht lernt, im wahrsten Sinne des Wortes. Das neuronale Netz lernt, wenn es neben dem Rauschen auch ein Signal gibt, aber Ihre Aufgabe ist es, dieses Signal mit Hilfe des großen neuronalen Netzes vom Rauschen zu trennen, ohne es neu lernen zu lassen.

 
Alexey Burnakov:
Dies ist die korrektere Antwort.) Ich muss verschiedene Methoden ausprobieren.

Ich habe einmal diesen Ansatz vorgeschlagen.

Wir nehmen einen Expert Advisor, er kann von kodobase sein. Die Hauptsache ist, dass sie vollblütig ist und es keine Rolle spielt, ob sie verliert. Sie können die Vorbedingungen festlegen. Zum Beispiel: Trending, drei Fenster, ohne SL und TP, MM, Fehlerbehebung von Zuständen...

Wir sollten den Grund für den Verlust suchen und versuchen, ihn mit R zu lösen. In den niedrigen Fenstern lösen wir Probleme durch Extrapolation, im hohen Fenster sagen wir den nächsten Takt durch Klassifizierung voraus.

 
Alexey Burnakov:

Mein Artikel über die Auswahl von Merkmalen.

https://habrahabr.ru/company/aligntechnology/blog/303750/

Es war interessant zu lesen, vielen Dank für die harte Arbeit. Ich verstehe das Experiment 6 nicht - warum wurden am Ende die Prädiktoren Y und Z ausgewählt? Z ist die Zielvariable, sie sollte nicht in der Liste der Prädiktoren stehen.

Mir gefällt die Idee, ein 3D-Kaninchendiagramm zu nehmen und das Modell darauf zu trainieren. Um ehrlich zu sein, dachte ich zuerst, dass es sich bei "Kaninchen" um eine Art Pseudo-Zufallsdaten handelt, die auf dem Diagramm schön aussehen und nur für einen Menschen mit seiner Fähigkeit, das Kaninchen in einer Zahlenreihe zu sehen, Sinn ergeben. Es gibt jedoch keine Funktion, die das Kaninchen beschreibt. Für jedes Modell ist es nur eine Menge von Punkten, die im 3-D-Raum spezielle Formen bilden. Aus meiner Sicht haben alle drei Koordinaten jedes Punktes keine Beziehungen und Abhängigkeiten untereinander, so dass ich davon ausging, dass kein Algorithmus damit umgehen kann. Am Ende des Artikels war ich überrascht.

Ich habe dasselbe Experiment mit PCA versucht, und die Ergebnisse sind wie folgt:
Ich benötige eine Komponente für eine Genauigkeit von 95 %, sie verwendet X und Y. Aber der Vorhersagealgorithmus funktioniert nicht mit einer Komponente, ich brauche mindestens zwei. Im Grunde genommen verwenden beide X und Y (im Code wird es nicht angezeigt, aber man kann es im Diagramm sehen), also ist es in Ordnung.
Modell auf Probe A trainieren, dann Z für Probe A vorhersagen: R^2 = 0,04759303
Modell auf Probe A trainieren, dann Z für Probe B vorhersagen: R^2 = 0,05325888

Ich habe eine 3D-Darstellung des vorhergesagten Z für Probe B gezeichnet, die schlecht ausgefallen ist. Das Modell hat keine wirklichen Abhängigkeiten gefunden, es hat einfach alle Z-Werte in einer Ebene gemittelt. Das Kaninchen kam flach heraus. Haben Sie versucht, einige Modelle zu trainieren und ein voraussichtliches Kaninchen zu zeichnen? Ich frage mich, wie sich das bei den verschiedenen Modellen auswirkt.

Im Anhang finden Sie den Code für das Kaninchen und die y-aware pca. Es gibt einen kleinen Fehler: Das Diagramm der Prädikatorladungen sortiert die Komponenten aus irgendeinem Grund. D.h. sie sind 1,10,11,12,2,3,4,5,... aber in der Reihenfolge der Wichtigkeit sollten wir in dieser Reihenfolge suchen: PC1, PC2, PC3,...

Dateien:
bunny_pca.txt  5 kb
 
mytarmailS:
Ich habe das schon einmal gemacht, das neuronale Netz lernt nicht auf einen größeren Horizont mit dem Ziel, das ich ihm gesetzt habe

Ich habe noch nicht versucht, das Neuron über einen Balken hinaus zu trainieren, aber ich gehe davon aus, dass das Prinzip dasselbe sein wird. Ich arbeite damit wie folgt:

1) Sammeln Sie so viele Rohdaten wie möglich von mt5 - Ohlc, Zeit, Indikatoren. Da ich nicht weiß, was nützlich ist und was nicht, nehme ich alles und versuche, den Müll auszusieben. Ich kann nicht alles an neuronka senden, weil neuronka auf Müll umlernt und in diesem Fall einen Fehler im Fronttest macht. Es ist nicht leicht, den Müll auszusortieren. In diesem Thread geht es auf 28 Seiten darum, wie man das macht, und bisher ist alles zweideutig. Ich füge den Daten eine Zielvariable hinzu - 0 oder 1, je nachdem, ob der Preis für den nächsten Balken fällt oder steigt.

2) Die eigentliche Sichtung von Schutt. Es sollte eine Funktion geben, die die Ausgangsdaten analysiert und eine Bewertung vornimmt. Je höher die Schätzung - desto weniger Müll. Wir versuchen, die Bewertungsfunktion mit verschiedenen Kombinationen von Quellprädiktoren (Spalten aus der Trainingstabelle) zu füttern und das Ergebnis zu verbessern. Schließlich wird ein bestimmter Satz von Prädiktoren gefunden, der theoretisch nicht zu einem Übertraining führt.

3) Angenommen, der Müll wird beseitigt. Nun ist es an der Zeit, das neuronale Netz zu trainieren. Ich verwende das nnet-Paket von R. Es hat den Vorteil, dass es keine Hyperparameter wie Trainingsgeschwindigkeit, Beschleunigung, Verzögerung und Arten von Trainingsfunktionen gibt. Weniger Hyperparameter bedeuten weniger Probleme. Sie müssen mit Kreuzvalidierung trainieren. Ich nehme die ursprüngliche Tabelle und unterteile sie in drei Zeilen mit einem Verhältnis von 70 %/15 %/15 % (die neuen Tabellen heißen train/test/validate) (der Code kann dem Rattle Log entnommen werden, ich habe damit angefangen). Dann führe ich z.B. 10 Iterationen von Trainingsneuronen auf dem Trainingstisch durch. Ich berechne den Vorhersagefehler R^2. Ich sage Ergebnisse für Test- und Validierungstabellen voraus und berechne R^2 für sie. Ich führe 10 weitere Iterationen des Trainings durch, wiederhole die Vorhersage für 3 Tabellen und betrachte den neuen R^2. Beenden Sie das Training in dem Moment, in dem R^2 auf einigen der Tische zu fallen beginnt (es wird immer nur auf dem Zugtisch wachsen). Erledigt. Nun können Sie das Ganze noch einmal wiederholen, wobei Sie eine andere Anzahl von versteckten Neuronen und eine andere Anzahl von Trainingsiterationen zwischen den Kreuzvalidierungen verwenden, in der Hoffnung, dass der minimale R^2 der drei Tabellen am Ende höher ist als beim letzten Mal.

All dies mag ein wenig kompliziert erscheinen, aber in Wirklichkeit ist es noch komplizierter :), denn jeder dieser Schritte birgt eine Reihe von Problemen in sich. Aber sie liefert konsistente Ergebnisse.

 
SanSanych Fomenko:

Es ist gut, dass du es nicht gelernt hast, denn du unterrichtest über Lärm. Aber wenn Sie das täten, würden Sie auf dem Gral lernen, auf der real....

Ich bin damit beschäftigt, den Lärm zu beseitigen. Deshalb nehmen wir so viele Prädiktoren, in der Hoffnung, dass wenigstens etwas übrig bleibt.

Sie versuchen, Rauschen als Trainer zu benutzen. Sie sollten verstehen, dass, wenn die Stochastik (zum Beispiel) die magische Zahl 90 hätte und der Markt fallen würde, wenn der Indikator einen solchen Wert hätte, wir keine Netzwerke bräuchten, es wäre für das Auge sichtbar.

1) Im besten Fall wählt man die besten 10 Indikatoren von 100 möglichen nach bestimmten Kriterien aus, und der Indikator hat einen Wertebereich - sagen wir, von diesen 100 Werten funktionieren nur 3, und zwar nicht immer, aber in einigen Situationennur diese 3 Werte sind kein Rauschen und nur sie sollten anstelle des Indikators beibehalten werden, da die übrigen Werte das gleiche Rauschen sind, so dass alle diese Ablehnungen qualitativ nicht tief sind und daher nicht sehr effizient

2) Darüber hinaus gibt es einen solchen Begriff als Inkonsistenz der Attribute, zum Beispiel, nehmen Sie den Preis, es ist objektiv und nicht widersprüchlich, das heißt, wenn der Preis steigt, ist es steigend und es gibt keine zweite (wenn wir ignorieren die Nuancen der Trend Kraft, etc.), nehmen Sie die gleichen stochastischen, kann es 90 Werte, wenn der Trend ist flach und nach oben und unten, das heißtAndererseits hilft dieser Indikator dem Netzwerk nicht, im Gegenteil, er verwirrt immer den Markt, weil seine Messwerte inkonsistent sind, so dass gewöhnliche Indikatoren nicht auf den Markt anwendbar sind, und Sie denken nicht einmal darüber nach, Sie füllen einfach alles auf, und dann erzählen Sie mir von dem Rauschen.

Wie ich oben geschrieben habe, bin ich mit dem Prognosehorizont nicht zufrieden.

 
Dr. Trader:

Es war interessant zu lesen, danke für die Mühe. Ich verstehe das Experiment 6 nicht - warum wurden am Ende die Prädiktoren Y und Z ausgewählt? Z ist die Zielvariable, sie sollte nicht in der Liste der Prädiktoren stehen.

Mir gefällt die Idee, ein 3D-Kaninchendiagramm zu nehmen und das Modell darauf zu trainieren. Um ehrlich zu sein, dachte ich zuerst, dass es sich bei "Kaninchen" um eine Art Pseudo-Zufallsdaten handelt, die auf dem Diagramm schön aussehen und nur für einen Menschen mit seiner Fähigkeit, das Kaninchen in einer Zahlenreihe zu sehen, Sinn ergeben. Es gibt jedoch keine Funktion, die das Kaninchen beschreibt. Für jedes Modell ist es nur eine Menge von Punkten, die im 3-D-Raum spezielle Formen bilden. Aus meiner Sicht haben alle drei Koordinaten jedes Punktes keine Beziehungen und Abhängigkeiten untereinander, so dass ich davon ausging, dass kein Algorithmus damit umgehen kann. Am Ende des Artikels war ich überrascht.

Das gleiche Experiment wurde mit PCA durchgeführt, die Ergebnisse sind wie folgt:
Für eine Genauigkeit von 95 % ist eine Komponente erforderlich, die X und Y verwendet. Aber der Vorhersagealgorithmus funktioniert nicht mit einer Komponente, man muss mindestens zwei nehmen. Im Grunde genommen verwenden beide X und Y (im Code wird es nicht angezeigt, aber man kann es im Diagramm sehen), also ist es in Ordnung.
Modell auf Probe A trainieren, dann Z für Probe A vorhersagen: R^2 = 0,04759303
Modell auf Probe A trainieren, dann Z für Probe B vorhersagen: R^2 = 0,05325888

Ich habe eine 3D-Darstellung des vorhergesagten Z für Probe B gezeichnet, die schlecht ausgefallen ist. Das Modell hat keine wirklichen Abhängigkeiten gefunden, es hat einfach alle Z-Werte in einer Ebene gemittelt. Das Kaninchen kam flach heraus. Haben Sie versucht, einige Modelle zu trainieren und ein voraussichtliches Kaninchen zu zeichnen? Ich frage mich, wie sich das bei den verschiedenen Modellen auswirkt.

Im Anhang finden Sie den Code für das Kaninchen und die y-aware pca. Es gibt einen kleinen Fehler: Das Diagramm der Prädikatorladungen sortiert die Komponenten aus irgendeinem Grund. D.h. sie sind 1,10,11,12,2,3,4,5,... aber in der Reihenfolge der Wichtigkeit sollten Sie in dieser Reihenfolge suchen: PC1, PC2, PC3,...

Haben Sie also X und Y in den Hauptkomponenten? Das wäre wichtig zu verstehen.

Zweitens: die Annäherung an das Kaninchen. Natürlich sollte es das sein! Es ist ein lineares Modell. Es wird einfach eine Ebene (bei X und Y) mit einer gewissen Steigung oder eine Linie (bei einem Prädiktor) gezeichnet. Das ist das ganze lineare Kaninchenmodell. Deshalb versuche ich, nicht lineare Modelle zu verwenden.

So lässt sich das Kaninchen mit einer anderen Methode (auf der Grundlage diskreter Werte) rekonstruieren.

 
Alexey Burnakov:

Sind also X und Y in den Hauptkomponenten enthalten? Es wäre wichtig, das zu verstehen.

Ja, nur X und Y. Ich habe noch nicht herausgefunden, wie man das mit Code macht, alle Artikel darüber arbeiten mit Diagrammen. Die Anzahl der zu entnehmenden Komponenten kann in der Variable componentsToUse eingesehen werden. In diesem Fall bedeutet componentsToUse = 2, dass Sie nur die Prädiktoren nehmen müssen, die breite horizontale Linien im Diagramm für PC1 und PC2 aufweisen.

Achten Sie in der obigen Grafik auf die Spalten PC1 und PC2 (die erste und zweite Hauptkomponente) und dann auf die grünen horizontalen Linien. Wenn die Linie von 0 weggeht (egal ob positiv oder negativ), dann wird dieser Prädiktor in der entsprechenden Hauptkomponente verwendet. PC1 verwendet y_clean ("_clean" wird bei der Skalierung der Daten automatisch hinzugefügt, um Verwechslungen mit dem ursprünglichen Prädiktor zu vermeiden), PC2 verwendet x_clean. Dies ist das Ergebnis der PCA-Komponentenanalyse - Sie müssen x_clean und y_clean nehmen.

In Zukunft würde PC3 input_noise_3_clean verwenden. Dies ist nur ein Beispiel, PC3 ist in diesem Fall nicht erforderlich.

Das hat tatsächlich sehr gut funktioniert. X und Y sind in der Grafik deutlich zu erkennen. Ich habe bereits früher dieselbe Grafik für den Devisenhandel gepostet, wo alles schlecht ist.

 
Dr. Trader:

Ja, nur X und Y. Ich habe noch nicht herausgefunden, wie man das mit Code macht, alle Artikel darüber arbeiten mit Diagrammen. Die Anzahl der zu entnehmenden Komponenten kann in der Variable componentsToUse eingesehen werden. In diesem Fall bedeutet componentsToUse = 2, dass Sie nur die Prädiktoren nehmen müssen, die breite horizontale Linien im Diagramm für PC1 und PC2 aufweisen.

Schauen Sie sich im obigen Diagramm die Spalten PC1 und PC2 (die erste und zweite Hauptkomponente) und dann die grünen horizontalen Linien an. Wenn die Linie von 0 weggeht (egal, ob sie positiv oder negativ ist), wird dieser Prädiktor in der entsprechenden Hauptkomponente verwendet. PC1 verwendet y_clean ("_clean" wird bei der Skalierung der Daten automatisch hinzugefügt, um Verwechslungen mit dem ursprünglichen Prädiktor zu vermeiden), PC2 verwendet x_clean.

In Zukunft würde PC3 input_noise_3_clean verwenden. Dies ist nur ein Beispiel, PC3 muss in diesem Fall nicht verwendet werden.

Das hat tatsächlich sehr gut funktioniert. X und Y heben sich in der Grafik deutlich ab. Ich habe das gleiche Diagramm für Forex schon einmal gepostet, aber dort ist es nicht so gut.

Die Auswahl der Prädiktoren erfolgte hier nach der linearen Methode. Nun, ich bin froh, dass Sie überrascht sind. Es bedeutet, dass Sie etwas Neues gesehen haben)
 
Dr. Trader:

Ich habe noch nicht versucht, das Neuron über einen Balken hinaus zu trainieren, aber ich gehe davon aus, dass das Prinzip dasselbe sein wird. Ich arbeite damit wie folgt:

1) Sammeln Sie so viele Rohdaten wie möglich von mt5 - Ohlc, Zeit, Indikatoren. Da ich nicht weiß, was nützlich ist und was nicht, nehme ich alles und versuche, den Müll auszusieben. Ich kann nicht alles an neuronka senden, weil neuronka auf Müll umlernt und in diesem Fall einen Fehler im Fronttest macht. Es ist nicht leicht, den Müll auszusortieren. In diesem Thread geht es auf 28 Seiten darum, wie man das macht, und bisher ist alles zweideutig. Ich füge den Daten eine Zielvariable hinzu - 0 oder 1, je nachdem, ob der Preis für den nächsten Balken fällt oder steigt.

2) Die eigentliche Sichtung von Schutt. Es sollte eine Funktion geben, die die Ausgangsdaten analysiert und eine Bewertung vornimmt. Je höher die Schätzung - desto weniger Müll. Wir versuchen, die Bewertungsfunktion mit verschiedenen Kombinationen von Quellprädiktoren (Spalten aus der Trainingstabelle) zu füttern und das Ergebnis zu verbessern. Schließlich wird ein bestimmter Satz von Prädiktoren gefunden, der theoretisch nicht zu einem Übertraining führt.

3) Angenommen, der Müll wird beseitigt. Nun ist es an der Zeit, das neuronale Netz zu trainieren. Ich verwende das nnet-Paket von R. Es hat den Vorteil, dass es keine Hyperparameter wie Trainingsgeschwindigkeit, Beschleunigung, Verzögerung und Arten von Trainingsfunktionen gibt. Weniger Hyperparameter bedeuten weniger Probleme. Sie müssen mit Kreuzvalidierung trainieren. Ich nehme die ursprüngliche Tabelle und unterteile sie in drei Zeilen mit einem Verhältnis von 70 %/15 %/15 % (die neuen Tabellen heißen train/test/validate) (der Code kann dem Rattle Log entnommen werden, ich habe damit angefangen). Dann führe ich z.B. 10 Iterationen von Trainingsneuronen auf dem Trainingstisch durch. Ich berechne den Vorhersagefehler R^2. Ich sage Ergebnisse für Test- und Validierungstabellen voraus und berechne R^2 für sie. Ich führe 10 weitere Iterationen des Trainings durch, wiederhole die Vorhersage für 3 Tabellen und betrachte den neuen R^2. Beenden Sie das Training in dem Moment, in dem R^2 auf einigen der Tische zu fallen beginnt (es wird immer nur auf dem Zugtisch wachsen). Erledigt. Nun können Sie das Ganze noch einmal wiederholen, wobei Sie eine andere Anzahl von versteckten Neuronen und eine andere Anzahl von Trainingsiterationen zwischen den Kreuzvalidierungen verwenden, in der Hoffnung, dass der minimale R^2 der drei Tabellen am Ende höher ist als beim letzten Mal.

All dies mag ein wenig kompliziert erscheinen, aber in Wirklichkeit ist es noch komplizierter :), denn jeder dieser Schritte birgt eine Reihe von Problemen in sich. Aber sie liefert konsistente Ergebnisse.

Ich habe eine andere Sichtweise und Sie verstehen sie nicht.
 

SanSanych Fomenko:
Wie wäre es, wenn Sie die ersten 10 vor dem Schritt nehmen und den Rest wegwerfen?

Ich habe ein Diagramm von R^2 und dem Prozentsatz der erfolgreichen Fälle in Abhängigkeit von der Anzahl der verwendeten Komponenten erstellt. Das beste Ergebnis beim Fronttest wurde mit 41 Komponenten erzielt (Gewinn von etwa 70 %, sehr gut). Aber das kann man aus den Backtest-Charts nicht ablesen, sie steigen einfach immer weiter. Wenn wir uns auf die Bedeutung der Komponenten verlassen, müssten wir 73 nehmen, was nicht das beste Ergebnis im Fronttest ist.

R^2 des Fronttests kann negativ sein, auch wenn er >50% der Fälle gewinnt, aufgrund der unausgewogenen erforderlichen Ergebnisse, die Anzahl der Klassen "0" unterscheidet sich von "1", so dass ihr Durchschnitt nicht 0,5 ist, und R^2 ist daher etwas schlechter.

Grund der Beschwerde: