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

 

Die Dimensionalität des Arrays X

> dim(X1)
[1] 7000    8
X <- array( c(X1,X2), dim=c(7000, 8, 2) )

In Ihrem Fall wäre das

X <- array( c(X1,...X100), dim=c(7000, 8, 100) )
#или, что равнозначно
X <- array( c(X1,...X100), dim=c(dim(X1), 100) )

Natürlich, wenn die Anzahl der Beispiele 7000 und die Konvertierungslänge = 8 ist.

 

Dieses "rnn"-Paket ist eher eine Programmierübung als ein Produkt zur Verwendung. Siehe stattdessen Paket "RSNNS".

Es gibt einige rekurrente Netze auf dem Markt. Nun, mehr in die Tiefe, PyBrain, keras in Ruthon

Viel Glück!

 
Danke! Ich werde es mir ansehen.
 

Ich habe einige seltsame Probleme mit der Kreuzvalidierung des trainierten Modells. Oder besser gesagt, es stellt sich heraus, dass es schon immer Probleme gegeben hat, ich habe es nur nicht bemerkt.

Mein Vorgehen ist in etwa wie folgt: Es gibt verschiedene Indikatoren für eurusd für das Jahr. Ich teile die Daten nach dem Zufallsprinzip in Zeilen im Verhältnis 70%/15%/15% für Training/Validierung/Validierung.

Außerdem enthalten diese Daten 9000 Prädiktoren. Ich durchsuche ihre Varianten genetisch und trainiere ein PCA-Modell auf der Grundlage der einzelnen Teilmengen von Prädiktoren. Ich trainiere das Modell anhand einer Trainingsstichprobe und bestimme den Fehler. Testen Sie dasselbe Modell an beiden Validierungsstichproben, und ermitteln Sie den Fehler an ihnen.

Ich berechne das Endergebnis einer Fitnessfunktion auf folgende Weise:
max(error_train,error_validate1,error_validate2) - min(error_train,error_validate1,error_validate2)
Es geht darum, dass die Differenz zwischen minimalem und maximalem Fehler so klein wie möglich sein sollte (das so genannte "Fomenko-Kriterium" :) ).

Alles scheint gut zu sein, denn das Modell erreicht bei allen drei Stichproben einen Fehler von etwa 25 %. Doch beim Fronttest steigt der Fehler plötzlich auf 40 % an. Ich habe ein bisschen nachgedacht, random.seed für die Erzeugung von Stichproben von Zeichenfolgen (nicht Prädiktoren, nur Zeichenfolgen) geändert, und für einen zuvor definierten Satz von Prädiktoren (die beste) bekam Training/Validierung/Validierungsfehler 25%/35%/35% statt 25%/25%/25%, und wieder die gleichen 40% für Fronttest. Der Fehler bei den Validierungsproben hat sich um +10 % erhöht, was sehr schlecht ist.

Es stellt sich also heraus, dass die Genetik die beste Version der Prädiktoren für eine bestimmte Trainings- und spezifische Validierungsstichprobe findet. Wenn wir die Zeilen in einer anderen Reihenfolge über die Stichproben streuen, funktioniert das trainierte Vorhersagemodell bereits mit denselben Prädiktoren unzureichend.

Gibt es eine Standardmethode, um damit umzugehen, so dass das trainierte Modell für jede Verteilung der Zeilen über die Stichproben ungefähr die gleichen Fehler liefert? Dies ist ein ernstes Problem. Ich kann zum Beispiel Trainings- und Validierungsproben für jede Generation von Genetikern neu erzeugen. Oder erstellen Sie zwei verschiedene Sätze von Reihenproben, trainieren Sie zwei PCA-Modelle darauf und nehmen Sie das schlechteste Ergebnis für die Fitnessfunktion. Ergibt das einen Sinn?

 
Dr. Trader:

Ich habe einige seltsame Probleme mit der Kreuzvalidierung des trainierten Modells. Genauer gesagt, es stellte sich heraus, dass es schon immer Probleme gab, ich habe sie nur nicht bemerkt.

(sogenanntes "Fomenko-Kriterium" :) ).

Das Kriterium hat mir sehr gut gefallen. Ich danke Ihnen.

Aber es ist nicht vollständig von Ihnen angegeben.

Mein Kriterium MUSS den Fronttest beinhalten. Wenn Sie sich alle meine Beiträge ansehen, habe ich immer genau über den Fronttest geschrieben, der nach meinem Verständnis an einem Teil der Beobachtungen durchgeführt werden sollte, die zeitlich (durch den Index) von den ersten drei Gruppen getrennt sind.

Das habe ich schon bei rattle gesehen, das den mitgelieferten Satz so aufteilt, wie Sie es getan haben. Sie erhalten gute Daten, ich habe bei allen drei Stichproben weniger als 10 %, und dann nehmen Sie eine neue Datei, und Ihre 40 % Fehler sind immer noch ein gutes Ergebnis! Ich hatte schon Schlimmeres.

Mein Kriterium für Übertraining ist also:

1. wir teilen die ursprüngliche Menge in zwei Teile, OHNE irgendwelche Zufallstricks, rein mechanisch, in aufsteigender Indexreihenfolge

2. Wir unterteilen den ersten Teil mit einer der Zufallsmethoden in drei Teile: Lernen, Testen und Validieren.

3. Wenn der Fehler bei diesen drei Teilen ungefähr gleich ist, fahren Sie mit Schritt 4 fort.

4. Führen Sie das trainierte Modell auf dem zweiten Teil aus. Der Fehler sollte wieder ungefähr gleich sein. Dies ist von grundlegender Bedeutung, weil wir beim Handel immer außerhalb der Trainingsstichprobe handeln und konsequent (nicht zufällig) Balken für Balken erhalten.

Wenn wir an allen 4 Punkten ungefähr den gleichen Fehler erhalten, wird das Modell nicht neu trainiert.

Bei signifikanten Diskrepanzen wird das Modell neu trainiert. Ich habe in R keine Werkzeuge gefunden, um das Geräusch zu beseitigen. Ich habe mein eigenes selbstgebautes, hier ist ein weiterer Artikel über PCA.

 
mytarmailS:

Anton Zverev

Lassen Sie uns diese Art von Gespräch nicht führen. Menschen, die hier lernen und ihre Erfahrungen austauschen, sind bereit, sich gegenseitig zu helfen, während Sie die Position einnehmen, dass Sie dumm sind und ich alles weiß.) Helfen Sie mir lieber zu verstehen, was Sie denken und was Sie für richtig halten.

Ich stimme mit Ihnen überein, dass es nicht ausreicht, nur den BP anzugeben. Sie müssen die Informationen komprimieren und unnötige Dinge weglassen, die eine gute Entscheidung verhindern, idealerweise auf 0 oder 1 die kaufen/verkaufen, d.h.Wenn wir 10 Indikatoren haben (an die ich nicht glaube) und 9 davon herausgefiltert haben, so dass nur der RSI übrig bleibt, wird das nicht ausreichen, da der Indikator einen Bereich hat und es sich herausstellt, dass er nicht mit Werten von -70 bis 70 funktioniert, also müssen wir sie komprimieren und so weiter.. Die Frage ist nur, wie man das macht.

Ich denke darüber nach, habe aber noch nicht genug Wissen, um einen solchen Selektor zu implementieren...

Mein erster Versuch ist schon lange her, ich habe vom aktuellen Kurs zurückgeschleift und nach einer fast identischen Situation in der Vergangenheit gesucht, dann wurden diese Situationen nach dem Ergebnis sortiert, wie sie ausgefallen sind, z.B. habe ich eine aktuelle Situation, dafür wurden 10 Analoga in der Vergangenheit gefunden, 8 Analoga haben sich als Preisanstieg herausgestellt, 2 endeten in einem Rückgang, es wird also wachsen ... Aber der Horror )) ist, dass es stellte sich heraus, das Gegenteil zu sein, der Preis fiel sehr oft und stark in diesen Situationen mit einer starken Tendenz zum Kauf, und dann oft wieder getestet Tick für Tick ...

Dann machte ich eine Art Indikator, nahm die kumulative Summe aller Kaufpreise und auch die Summe für den Gewinn, baute ihre Differenz und bekam einige Index, wenn ich es mit dem Preis verglichen stellte sich heraus, dass es entgegengesetzt zu dem Preis, die Korrelation war -0,7 bis -0,9, so, einfach gesagt, der Markt geht gegen seine eigenen Statistiken, das ist etwas zu denken und zu überdenken

anDr.Trader

Vielleicht hilft Ihnen das ein wenig zu verstehen.....

Ich habe einen schnelleren und einfacheren Weg gefunden, um diesen Effekt zu sehen, bei Interesse kann ich mehr darüber schreiben

 
SanSanych Fomenko:

4. Führen Sie das trainierte Modell auf dem zweiten Teil aus. Der Fehler sollte wieder ungefähr gleich groß sein. Dies ist von grundlegender Bedeutung, weil wir beim Handel immer außerhalb der Trainingsstichprobe handeln und konsequent (nicht zufällig) Balken für Balken erhalten.

Verstanden, danke. Es stellt sich heraus, dass es nicht 2, sondern 3 Validierungsmuster gibt - eines davon wird ausschließlich aus den letzten Einträgen der Quelldatei ohne Zufallsgenerator gezogen. Die anderen Stichproben sind zufällig. Ich werde es ausprobieren.

Ich habe einmal versucht, den ersten Teil der Trainingsdatei für die Validierung zu nehmen, auch streng nach Indizes, auch ohne Zufall. Der Gedanke war, dass wenn das trainierte Modell einen kleinen Fehler in den Daten der Vor-Trainingsperiode zeigt, dann wird es den gleichen Fehler in den Daten der Nach-Trainingsperiode zeigen. Es stellte sich heraus, dass dies falsch war, denn die Fehler vor und nach dem Trainingszeitraum korrelierten überhaupt nicht.

mytarmailS:

Dann implementierte ich einen solchen Indikator, nahm die kumulative Summe aller Kauf- und Verkaufsprognosen, berechnete ihre Differenz und erhielt einen Index, und als ich ihn mit dem Preis verglich, stellte er fast das Gegenteil des Preises fest, die Korrelation war -0,7 bis -0,9, einfach gesagt, der Markt bewegt sich gegen seine eigenen Statistiken,das ist etwas zum Nachdenken und Überdenken

Funktioniert diese Methode bei Ihnen immer und in jedem Zeitintervall? Natürlich sieht es seltsam aus, aber die Hauptsache ist, dass es funktioniert. Ähnliche Beobachtungen habe ich bei meinem untrainierten Modell gemacht. Manchmal wurden Ergebnisse vorhergesagt, die genau das Gegenteil der tatsächlichen Ergebnisse waren. Aber manchmal funktionierte es trotzdem richtig. Während eines sehr langen Tests, bei dem ich das Modell trainierte und in verschiedenen Zeitintervallen überprüfte, stellte ich fest, dass es im Durchschnitt in etwa 50 % der Fälle richtig lag, so dass es nutzlos war; man hätte eine Münze werfen können, um das gleiche Ergebnis zu erhalten. Danach habe ich überprüft und richtig verstanden, dass das Modell ohne jegliche Inversion, Filterung und kollektive Lösungen vieler anderer Modelle richtige Ergebnisse liefern sollte. Andernfalls könnte ich im Chaos und im Zufall gefangen sein.

 
Dr. Trader:

Funktioniert diese Methode bei Ihnen immer und in jedem Zeitrahmen? Das ist natürlich seltsam, aber die Hauptsache ist, dass es funktioniert. Ähnliche Beobachtungen habe ich bei meinem untrainierten Modell gemacht. Manchmal wurden Ergebnisse vorhergesagt, die genau das Gegenteil der tatsächlichen Ergebnisse waren. Aber manchmal funktionierte es trotzdem richtig. Während eines sehr langen Tests, bei dem ich das Modell trainierte und in verschiedenen Zeitintervallen überprüfte, stellte ich fest, dass es im Durchschnitt in etwa 50 % der Fälle richtig lag, so dass es nutzlos war; man hätte eine Münze werfen können, um das gleiche Ergebnis zu erzielen. Danach habe ich überprüft und richtig verstanden, dass das Modell ohne jegliche Inversion, Filterung, kollektive Lösungen vieler anderer Modelle richtige Ergebnisse liefern sollte. Andernfalls kann man in eine Falle geraten, in der Chaos und Zufälligkeit herrschen.

Ja, immer und zu jeder Zeit (aber es gibt Nuancen beim Sampling) ist die Ausgabe fast eine exakte Kopie des Preises, aber umgekehrt korreliert. Mit dieser Methode können Sie sehen, wie ein Neuronetz trainiert wird und was Sie von ihm erwarten können, Sie können mehrere Schlussfolgerungen ziehen

1) Dies ist die typischste Situation - wenn ein Netz invers korreliert ist, bedeutet dies, dass es trainiert ist, sonst gäbe es keine inverse Korrelation, richtig?

2) es ist rein zufällig - es bedeutet, dass das Netz nichts gelernt hat

3) Ein Netz arbeitet mit dem Markt zusammen (ich habe es geschafft, diesen Effekt nur bei einem ziemlich untypischen Ziel zu erreichen) - das bedeutet, dass alles in Ordnung ist

4) Und die wichtigste Schlussfolgerung (dies ist wichtig für Sie, D. Trader), wenn Sie Ihr Netzwerk Prognosen zu bauen und es wird in die entgegengesetzte Richtung wie in Schlussfolgerung 1, keine Optimierung, Genetik, Cross-Validation und andere Reize werden Sie absolut nichts helfen - denken Sie darüber nach, es ist logisch und offensichtlich

 
mytarmailS:

1) Dies ist die typischste Situation - wenn das Netz invers korreliert ist, bedeutet dies, dass es trainiert ist, sonst gäbe es keine inverse Korrelation, richtig?

4) Und die wichtigste Schlussfolgerung (dies ist wichtig für Sie D. Trader), wenn Sie Ihr neuronales Netz Prognosen und es wird in die entgegengesetzte Richtung wie in der Schlussfolgerung 1, keine Optimierung, Genetik, crossvalidation und andere Reize werden Sie in absolut NICHTS helfen, denken Sie darüber nach, es ist logisch und offensichtlich

1) Eine stabile inverse Korrelation in verschiedenen Trainingsintervallen ist etwas seltsam, aber das Netzwerk hat etwas gelernt, ich stimme zu, dass das Ergebnis gut ist.

4) Ich bin mit dieser Frage nicht einverstanden. Bei binärer Klassifizierung (Zielvariable "0" oder "1") kann die Fitnessfunktion des Genetikers oder Optimierers leicht geändert werden, um ein "umgekehrtes" Ergebnis zu erzielen, indem das aktuelle Ergebnis einfach von 1 abgezogen wird.
Die Genetik zum Beispiel greift eine bestimmte Gruppe von Prädiktoren auf. Ich trainiere die Neuronen mit ihnen, führe eine Kreuzvalidierung durch und ermittle den durchschnittlichen Fehler. Ich erhalte einen Fehler von etwa 0,4. Das "inverse" Ergebnis der Fitnessfunktion kann als 1-0,4 = 0,6 definiert werden. Die Genetik wird versuchen, den Fehler von 0,6 auf Null zu reduzieren. Daraus ergibt sich eine Menge von Prädiktoren mit dem Fitnessfunktionswert 0. Das bedeutet aber, dass der tatsächliche Fehler des neuronalen Netzes 0+1 = 1 war. Das heißt, dass das erhaltene Neuronka in 100 % der Fälle falsch ist, und das ist die umgekehrte Korrelation.
Im Allgemeinen können Sie denselben genetischen Algorithmus und die Kreuzvalidierung verwenden, um ein Neuron zu trainieren, das ein Ergebnis liefert, das dem gewünschten entgegengesetzt ist, Sie werden es genauso erhalten wie Sie es erhalten haben, aber mit Absicht. Aber es ist nicht klar, warum. :)

Ich möchte noch hinzufügen, dass bei der binären Klassifizierung mit den Zielvariablen "0" und "1" der schlechteste Fehler 0,5 beträgt.
Fehler == 0 ist gut.
Error == 1 ist Ihr inverses Korrelationsneuron, Sie können das Ergebnis einfach umdrehen und es ist in Ordnung. Aber Sie sollten herausfinden, warum das so ist, es ist eine sehr untypische Situation.
Fehler 0,5 bedeutet, dass das Ergebnis völlig zufällig ist und das Modell überhaupt nichts taugt.

 

1