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

 
Dr. Trader:

Ich habe hier bereits Beispiele für Neuronik gepostet, ich werde nach etwas Passendem suchen und es für Ihre Daten (und mit einem Ausschuss) neu machen. Ich werde keine Einführungsvorlesungen schreiben, aber ich werde mehr Kommentare zum Code hinzufügen.


Entschuldigung, ich verstehe die Bedeutung der Variable with(F,T) in der Schleife nicht

for(i in c(1:nrow(table))[c(F,T)]){
   ..... table[i,] ..... 
}

Das heißt, diese Schleife funktioniert bei geraden Zeilen in der Tabelle, aber wie macht man das bei ungeraden Zeilen?

 

F und T sind Abkürzungen für boolesche Werte FALSE und TRUE, im Prinzip ist es egal, ob man c(T,F) oder c(TRUE,FALSE) schreibt, die erste Variante ist einfach kürzer.

Wenn die Tabelle 10 Zeilen hat, dann ist c(1:nrow(table)) einfach ein Vektor von c(1,2,3,4,5,6,7,8,9,10).
Und Arrays mit booleschen Werten werden in diesem Fall in einer Schleife bis zur gewünschten Länge durchlaufen, Sie erhalten c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE).

d.h. c(1:nrow(table))[c(F,T)] R wird verstanden als
c(1,2,3,4,5,6,7,8,9,10)[c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE]
und nimmt die Vektorelemente, die TRUE entsprechen, der Reihe nach.

Wenn wir zum Beispiel jedes dritte Element nehmen wollen, können wir es wie folgt schreiben
c(1,2,3,4,5,6,7,8,9,10)[c(FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,TRUE,FALSE]
oder abgekürzt
c(1:10)[c(F,F,T)]


Bei ungeraden Elementen werden T und F einfach vertauscht: c(1:nrow(table))[c(T,F)].

 
Dr. Trader:

F und T sind Abkürzungen für boolesche Werte FALSE und TRUE, im Prinzip ist es egal, ob man c(T,F) oder c(TRUE,FALSE) schreibt, die erste Variante ist einfach kürzer.

Wenn Sie 10 Zeilen in der Tabelle haben, dann ist c(1:nrow(table)) einfach c(1,2,3,4,5,6,7,8,9,10) Vektor.
Und Arrays mit booleschen Werten werden in diesem Fall in einer Schleife bis zur gewünschten Länge durchlaufen, Sie erhalten c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE).

d.h. c(1:nrow(table))[c(F,T)] R wird verstanden als
c(1,2,3,4,5,6,7,8,9,10)[c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE]
und nimmt die Vektorelemente, die TRUE entsprechen, der Reihe nach.

Wenn wir zum Beispiel jedes dritte Element nehmen wollen, können wir es wie folgt schreiben
c(1,2,3,4,5,6,7,8,9,10)[c(FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,TRUE,FALSE]
oder abgekürzt
c(1:10)[c(F,F,T)]


für ungerade Elemente einfach T und F vertauschen: c(1:nrow(table))[c(T,F)]

Danke, dass Sie sich nicht die Mühe gemacht haben, so detaillierte Beschreibungen zu schreiben. In der Tat wird vieles deutlich. Es ist mir peinlich, überhaupt zu fragen, aber ich werde mich entscheiden. Das Problem stellt sich im Wesentlichen wie folgt dar.....

Die Trainingsdatei besteht aus der gleichen Anzahl von Klassen pro Ziel. Mit anderen Worten: Ich habe 24 Einsen und 24 Nullen im Ziel. Auch hier möchte ich es wie Reshetov..... machen.

Ich habe die Trainingstabelle in zwei Tabellen aufgeteilt, eine mit allen Vektoren, bei denen das Ziel 1 ist, und die andere, bei der das Ziel 0 ist.

Ich nehme die Tabelle mit dem Ziel 1 und muss dann zwei Untertabellen erstellen, wobei die geradzahligen Vektoren in Train1 und die ungeradzahligen in Train2 stehen.

Zuerst machen wir es für die geraden Zahlen.

for(i in c(1:nrow(Qwe_true))[c(F,T)]){
  Train1[i,]<-Qwe_true[i,]
  }

Aber dann wird die Tabelle Train1 Zeilen c NA enthalten, und Train1 muss mit 12 Zeilen erstellt werden, weil nur 12 von 24 Zeilen gerade sind. Ich habe keine Ahnung, wie man das macht....

 

Ich bitte Sie.

Für R braucht man eine andere Denkweise, man muss gedanklich mit Vektoren arbeiten, dann ist der Code recht einfach zu schreiben. Fachleute schreiben in einer Zeile, was ich nicht einmal verstehe, und ich selbst würde Zyklen in mehreren Zeilen schreiben.

Train1 <- rbind(Qwe[which(Qwe[, "target"]==1)[c(T,F)], ], Qwe[which(Qwe[, "target"]==0)[c(T,F)], ])
Train2 <- rbind(Qwe[which(Qwe[, "target"]==1)[c(F,T)], ], Qwe[which(Qwe[, "target"]==0)[c(F,T)], ])

in Stufen -
which(Qwe[, "target"]==1) - die Anzahl der Zeilen mit Ziel 1
which(Qwe[, "target"]==1)[c(T,F)] - Anzahl der Zeilen mit target1, wobei 1 übersprungen wird
Qwe[which(Qwe[, "target"]==1)[c(T,F)], ] - die von Qwe erhaltene Tabelle, mit einem Ziel 1 mit einem Leerzeichen in 1
rbind(... , ...) - zwei Tabellen zusammenführen (mit Ziel 1 und mit Ziel 0)

 
Dr. Trader:

Ich bitte Sie.

Für R braucht man eine andere Denkweise, man muss gedanklich mit Vektoren arbeiten, dann ist der Code recht einfach zu schreiben. Fachleute schreiben Dinge in einer Zeile, die ich nicht einmal verstehe, und ich selbst würde Zyklen von mehreren Zeilen schreiben.

Train1 <- rbind(Qwe[which(Qwe[, "target"]==1)[c(T,F)], ], Qwe[which(Qwe[, "target"]==0)[c(T,F)], ])
Train2 <- rbind(Qwe[which(Qwe[, "target"]==1)[c(F,T)], ], Qwe[which(Qwe[, "target"]==0)[c(F,T)], ])

Du bist einfach ein Monster. Zwei Zeilen, das ist eine große Erleichterung für Sie. In Ordnung, ich werde weiter daran arbeiten... Danke!

 
Freitagabend... Meinem Kopf geht es nicht so gut. Wie wäre es, die Theorie gemeinsam zu testen.... Mit deinen R-Schreibfähigkeiten und meinen Problemlösungsfähigkeiten (Genauigkeit) hätten wir das alles in einer halben Stunde überprüfen können? Haben Sie Zeit? Dr.Trader
 
Nein, lernen Sie weiter. Ich werde Ihnen helfen, wenn Sie Fragen haben.
 

Zu diesen beiden Proben müssen noch zwei weitere hinzugefügt werden.

MLP1=Train1+Test(Train2)

MPL2=Train2+Test(Train1)

Wenn wir Test(Train2)+Test(Train1) addieren, erhalten wir das Ergebnis des gesamten Trainingsabschnitts, und dieser Abschnitt wird ein Test für jedes der Polynome sein.

Vielleicht nehmen Sie sich die Zeit, wenn es im Moment nicht möglich ist. Aber es ist eine halbe Stunde und Sie haben sich vergewissert. Ich möchte nur einen Spiegel machen. Ich werde dieselbe Datei nehmen und sie auf zwei Arten unterrichten. Dann stellen wir alles auf die Kontrollseite und wir werden alles sehen. Was sagen Sie dazu?

 

können Sie die Tabellen mit der Funktion rbind() kombinieren
MLP1 <- rbind(Train1, Test)

Was ist Test(Train2)? Und warum sollten die Trainingstabelle und die Testtabelle kombiniert werden? Der Test sollte separat sein, um das trainierte Modell darauf zu testen.

Es wird nicht alles so einfach und schnell gehen, wie Sie es sich wünschen. In Reshetovs Modell kann man einfach die Daten einspeisen, und das Modell selbst wird die Prädiktoren aussieben, die Gewichte und die Anzahl der Neuronen bestimmen und so weiter. Aber man kann das nicht mit einem normalen Neuron machen, man muss die Parameter für das Neuron durch Kreuzvalidierung auswählen, zum Beispiel wie in dem Beispiel, das ich heute hier geschrieben habe, oder wie in den Artikeln von Vladimir Perervenko.


Lesen Sie noch einmal, was ich dort geschrieben habe -https://www.mql5.com/ru/forum/86386/page753#comment_6821981
Fügen Sie einfach Ihre Daten wie beschrieben in diesen Code ein und führen Sie ihn aus. Wenn alle Prädiktoren einzeln genommen und nicht eliminiert werden, dann wird es beim ersten Mal wahrscheinlich zu schlecht sein. Nachdem Sie den Code ausgeführt haben, führen Sie zusätzlich den Befehlmax(gaResult@fitness) aus, der den R2-Wert des besten von der Genetik gefundenen Modells anzeigt. Wenn die Schätzung nahe bei 1 oder darunter liegt, ist sie gut, wenn sie nahe bei 0 oder sogar negativ ist, ist sie schlecht.

Geben Sie dann inPREDICTOR_COLUMNS die genaue Anzahl der Spalten an, die Sie als gut identifiziert haben, und führen Sie den Code erneut aus, damit das Modell nur auf diese Prädiktoren trainiert wird. Idealerweise sollte die beste Modellbewertung durch die Genetik nahe bei 1 liegen und die Genauigkeit in der Trainings- und Testtabelle sollte 1,00 betragen.

Die Testtabelle sollte zeitlich genau nach den Trainingsdaten liegen, so als ob das Modell bereits auf dem Markt gehandelt würde.

Wenn mit diesem Code nichts Gutes passiert (auch nicht mitKFOLDS=10) - dann ist er nicht gut. Wenn es funktioniert, dann gibt es eine gute Alternative zu Reshetovs Modell und wir können den Code weiter ausarbeiten und das Modell nach mql exportieren.

 

Ich will damit sagen, dass, wenn man etwas wie in Reschetows Modell macht, etwas Zusätzliches hinzufügt, dann ein gewöhnliches Neuron nimmt und es irgendwie mit den vorherigen Schritten vermischt und darauf wartet, dass alles wie bei Reschetow funktioniert, es sich als ein vergeblicher langer Prozess herausstellen wird, was ich definitiv nicht befürworte.

Wenn ich das gleiche Ergebnis wie bei Reshetov haben will, aber in R, dann muss ich den gesamten Java-Code des Modells in R umschreiben.

Aber es gibt viele Alternativen. Wenn sie noch besser funktionieren als die von Reshetov, dann ist es perfekt, dann braucht man nichts mehr, dann ist alles fertig.