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

 

Der aktuelle Stand meines Experiments.

Nachdem ich die Fehler im Code behoben habe, erhalte ich bei der Validierung meiner Daten tatsächlich die folgenden Ergebnisse.

Das Diagramm zeigt Währungspaare, Prognosehorizonte und so genannte Grauzonen - Intervalle von Werten am Ausgang der Prognosemaschine, in denen keine Entscheidungen zum Einstieg in den Markt getroffen werden.

Wie Sie sehen können, habe ich bereits einen positiven MO für eine Reihe von Paaren. Für EURUSD das Maximum. Gleichzeitig mache ich das Experiment noch genauer, indem ich die tatsächlichen Spreads für alle Paare (aus meinem DC) verwende:

spreads <- as.data.frame(cbind(

c('audusd'

, 'eurusd'

, 'gbpusd'

, 'usdcad'

, 'usdchf')

, c(0.00018

, 0.0001

, 0.00014

, 0.00013

, 0.00012)

)

)

Jetzt habe ich ein wirklich starkes Verallgemeinerungsexperiment gestartet, bei dem noch mehr Parameter überprüft werden sollen, und das etwa eine Woche dauern wird. Es wird etwa 60 Mal mehr Schätzungen geben. Aber dann werde ich auf jeden Fall einige gute Ergebnisse zum Vergleich haben. Und, wie ich irgendwo versprochen habe, werde ich den Expert Advisor (trainiert) mit der Grundlogik zum Testen bereitstellen. Sie können es weiter ausbauen. Ich werde es für mich selbst verbessern, indem ich verschiedene Enhancer direkt in den MQL-Code einfüge.

Wir sprechen uns bald wieder.

 
Alexey Burnakov:

Nein, Sie verstehen die Bedeutung der Nicht-Stationarität sicher nicht ganz. Es spielt keine Rolle, ob es sich um ein NS- oder lineares Modell oder um mein Modell handelt, wenn Ihre Daten nicht stationär sind, dann ist garantiert, dass die gefundenen Abhängigkeiten nicht außerhalb der Stichprobe auftreten. Alle Daten, die Sie in Form von Rohpreisen, MA(Rohpreisen), Bar Opening(Rohpreisen) usw. haben, müssen aus dem Modell entfernt werden. Sie müssen die Differenz zum letzten bekannten Preis nehmen.

Eine Skalierung in ein Intervall ist hier nicht möglich.

Das ist gar nicht so schlimm. Wenn Sie jedes Trainingsbeispiel separat betrachten (d.h. wenn Sie nach einer Zeile aus der Trainingstabelle normalisieren), können Sie alle Daten nach Gruppen normalisieren, und zwar separat in jedem Trainingsbeispiel. Nehmen Sie z. B. die Spalten o,h,l,c für alle 100 Balken (insgesamt 400) innerhalb eines Übungsbeispiels, suchen Sie deren Minimum und Maximum und scannen Sie sie. Dies sollte für jedes Trainingsbeispiel separat wiederholt werden. Durch diese Normalisierung wird sichergestellt, dass der Preis in der Trainingstabelle für jede Zeile immer im Bereich [0...1] liegt. Wenn wir nun in der Zukunft ein neues Beispiel erhalten, dessen Preis weit über die Preise während des Trainings hinausgeht, wird er durch die Normalisierung wieder in den Bereich [0..1] zurückgeführt und stellt keine neue unbekannte Datenregion für das neuronale Netz dar. Das trainierte Modell kann durchaus Regeln finden und erkennen wie "der Preis war mindestens einmal während der letzten N Balken höher als 0,8", und diese Regel wird auf alle neuen Daten angewandt, selbst wenn der Preis um die Hälfte gefallen ist.

Wenn wir jede Spalte einzeln normalisieren, wie wir es normalerweise tun, werden die Ergebnisse des Modells im Fronttest schlechter ausfallen. Die Abhängigkeiten zwischen gleichartigen Prädiktoren innerhalb eines Trainingsbeispiels gehen verloren. (z.B. Open[1], Open[2], Open[3]... aus demselben Trainingsbeispiel werden in unterschiedlichen Intervallen gescannt, entsprechend allen Trainingsbeispielen). Darüber hinaus besteht das Problem, dass die Normalisierung während des Trainings auf Tausenden von Trainingsbeispielen basiert, während wir im realen Handel nur eine Linie haben, die in Wellen mit sich selbst skaliert werden sollte, was unklar und seltsam ist.

Wenn Sie überhaupt keine Normalisierung vornehmen, können Sie sich das sparen. Fällt/steigt der Preis jedoch über das für das Training zur Verfügung stehende Intervall hinaus, handelt es sich um einen neuen und völlig unbekannten Bereich von Daten für das Modell. Es lässt sich nicht herausziehen und stürzt ab.

All dies ist ausschließlich für neuronale Netze, aus Erfahrung.

 

Ich habe weiter mit der y-Skala pca gearbeitet. Ich habe einen guten Artikel mit Ausbreitungsformeln gefunden:http://www.chemometrics.ru/materials/textbooks/pca.htm. Ich habe eine in R erstellt.

Grundlegender Code aus demselben Artikelhttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/
Wir müssen den Code"princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" ausführenund anhalten. next:

extractProjection <- function(ndim,princ) {
  return(princ$rotation[,1:ndim]) #Эта функция уже была определена ранее, но в этот раз нельзя менять знаки в матрицах как раньше
}
countOfComponentsToUse <- ncol(princ$x) # сюда можно в цикле подставлять числа от 2 до ncol(princ$x), увеличивая число компонент до необходимой точности
PCnameList <- colnames(princ$x)[1:countOfComponentsToUse]
proj <- extractProjection(countOfComponentsToUse, princ)
residualsMatrix <- dmTrain - ((princ$x[,1:countOfComponentsToUse]) %*% (t(proj)))
V0 <- sum(residualsMatrix*residualsMatrix)/nrow(dmTrain)
TRV <- V0/ncol(dmTrain)                           #полная дисперсия остатков (средний квадрат ошибок)
ERV <- 1-nrow(dmTrain)*V0/sum(dmTrain*dmTrain)    #объяснённая дисперсия остатков, нужно увеличивать число компонент если ERV < 0.95

Der Kernpunkt ist folgender: Das Objekt princ enthält eine Matrix von Rechnungen (princ$x) und eine Matrix von Lasten (princ$rotation). Multipliziert man diese beiden Matrizen princ$x %*% t(princ$rotation), erhält man die ursprüngliche Tabelle mit den dmTrain-Daten (skaliert mit Y, keine Zielvariable).

Es ist möglich, die Anzahl der Hauptkomponenten zu begrenzen, und dann werden die ursprünglichen Daten mit einer gewissen Fehlermarge bestimmt. Wenn Sie sich an langsames Internet und spezielle jpeg-Bilder erinnern, die beim Laden schärfer werden, dann erhalten Sie etwas Ähnliches: Eine größere Anzahl von Hauptkomponenten führt zu einer exakten Anpassung an die Ausgangsdaten.

Für die Anzahl der Komponenten N werden die Ausgangsdaten wie folgt definiert: princ$x[,1:N] %*% t(princ$rotation[,1:N]). Der Fehler kann berechnet werden, indem die resultierende Matrix von dmTrain subtrahiert wird, man erhält die residualsMatrix. Dies sind die Fehler, d. h. wie stark die tatsächlichen Daten von den gefundenen Daten abweichen. TRV ist der Durchschnitt der Fehlerquadrate. ERV ist so etwas wie der durchschnittliche Fehler. Wenn ERV=0,8 ist, weichen die Quelldaten in jeder Zelle der Tabelle um ~20% von den gefundenen Daten ab. Das heißt, wenn Sie eine Zahl 10 gefunden haben, dann waren die ursprünglichen Daten höchstwahrscheinlich von 8 bis 12. Das ist eine sehr grobe Definition, aber sie macht mehr Sinn. Und das ERV sollte mindestens 0,95 betragen, damit das PCA-Modell genügend Komponenten enthält.

Was haben Sie davon? Sie können den neuen Parameter tol zu princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE, tol=0.01) hinzufügen, damit Sie nicht Tausende von Hauptkomponenten erzeugen und die Erzeugung aufhört, wenn sdev der neuen Komponente < sdev(PC1) * tol ist. Danach kann die Anzahl der verwendeten Komponenten mit der obigen Funktion eingestellt werden, beginnend mit 2 und schrittweise um 1 erhöht.

Ich habe versucht, herauszufinden, wie man es zum Aussieben von Prädiktoren anwenden kann, aber mir fällt noch nichts ein. Sie können zum Beispiel für einen Prädiktor in princ$rotation load durch 0 ersetzen, ERV neu berechnen und sehen, wie viel schlechter das Ergebnis ausfällt. Ich sehe jedoch keinen Sinn in dieser Aktion, es ist nicht klar, wie dieses Ergebnis anzuwenden ist. Vielleicht können wir so korrelierte Prädiktoren finden, die keine neuen Informationen enthalten und deren Eliminierung daher das Ergebnis wahrscheinlich nicht verschlechtern wird. Ich möchte gerne Rauschprädiktoren finden, aber in diesen Matrizen gibt es keine Verbindung zu den Zielvariablen, d. h. es gibt überhaupt kein Kriterium dafür, was Rauschen ist und was nicht.

 
Dr. Trader:

Ich habe weiter mit der y-Skala pca gearbeitet. Ich habe einen guten Artikel mit Ausbreitungsformeln gefundenhttp://www.chemometrics.ru/materials/textbooks/pca.htm, den ich in R erstellt habe.

Grundlegender Code aus demselben Artikelhttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

Ich habe den Artikel noch einmal durchgelesen. Es scheint, als ob Sie nicht versuchen, das Beispiel aus dem Artikel zu wiederholen, sondern es Punkt für Punkt durch Ihre Daten ersetzen. Oder habe ich etwas übersehen? Wenn nicht, warum nicht?
 

Ich habe das Beispiel wiederholt. Ich ersetzte sie durch meine eigenen Daten und erhielt 100+ Hauptkomponenten für eine Varianz von 0,95. Ich habe mir die Logging-Plots angeschaut und keine guten Prädiktoren gefunden, die hervorstechen. D.h. während der Autor bei seinen Daten sieht, dass er 2 Hauptkomponenten und 5 Prädiktoren beibehalten kann, sehe ich bei meinen Daten 100+ Komponenten und 1000+ Prädiktoren (wobei die Lowadings schrittweise abnehmen, es ist nicht einmal klar, was der Schwellenwert für die Eliminierung der Lowadings ist).

Ich sollte y-aware pca Kredit geben, obwohl, ich gerade meine Daten ohne vorheriges Screening ersetzte, ein Y-Aware PCA Modell auf ihm aufbaute und einen 45% Fehler im fronttest erhielt. Es ist nicht profitabel für Forex noch, aber der Artikel endet dort, so dass, wenn ich zu verwenden y-aware pca dann muss ich mit etwas anderes zu kommen.

Auf andere Weise kann ich nur ein Dutzend Prädiktoren belassen, nnet trainieren und einen Fronttestfehler von nur 30 % erzielen. Ich würde gerne ein ähnliches Ergebnis mit y-aware pca erzielen.
 
Dr. Trader:

Ich habe das Beispiel wiederholt. Ich ersetzte sie durch meine eigenen Daten und erhielt 100+ Hauptkomponenten für eine Varianz von 0,95. Ich habe mir die Logging-Plots angeschaut und keine guten Prädiktoren gefunden, die hervorstechen. D.h. während der Autor bei seinen Daten sieht, dass er 2 Hauptkomponenten und 5 Prädiktoren beibehalten kann, sehe ich bei meinen Daten 100+ Komponenten und 1000+ Prädiktoren (wobei die Lowadings schrittweise abnehmen, es ist nicht einmal klar, was der Schwellenwert für die Eliminierung der Lowadings ist).

Ich sollte y-aware pca Kredit geben, obwohl, ich gerade meine Daten ohne vorheriges Screening ersetzte, ein Y-Aware PCA Modell auf ihm aufbaute und einen 45% Fehler im fronttest erhielt. Für Forex ist es noch nicht profitabel, aber der Artikel endet dort, so dass, wenn ich y-aware pca verwenden, dann muss ich mit etwas anderem zu kommen.

Auf andere Weise kann ich nur ein Dutzend Prädiktoren belassen, nnet trainieren und einen Fronttestfehler von nur 30 % erzielen. Ich würde gerne ein ähnliches Ergebnis mit y-aware pca erzielen.
Ich denke, es muss Buchstabe für Buchstabe wiederholt werden. Es werden Pakete außer pca verwendet, die ich bei Ihnen nicht gesehen habe.
 

https://c.mql5.com/3/97/Principal_Components_Regression__1.zip

Hier ist der R-Code aus dem Artikel, Dateien _03.txt und _04.txt, ich habe all dies auf meine Daten vor laufen. Es wurde sogar eine Prüfung der Fronttest-Daten in _04.txt hinzugefügt. Der einzige Unterschied, den ich sehe, ist das am Ende des Artikels angebotene Etal-Paket. Aber es gibt nicht einmal Beispiele, sondern es wird nur vorgeschlagen, das Ergebnis mit dem von vtreat prune zu vergleichen.

 
Dr. Trader:

https://c.mql5.com/3/97/Principal_Components_Regression__1.zip

Hier ist der R-Code aus dem Artikel, Dateien _03.txt und _04.txt, ich habe all dies auf meine Daten vor laufen. Es wurde sogar eine Prüfung der Fronttest-Daten in _04.txt hinzugefügt. Der einzige Unterschied, den ich sehe, ist das am Ende des Artikels angebotene Etal-Paket. Aber es gibt nicht einmal Beispiele, sondern nur das Angebot, zu versuchen, das Ergebnis mit dem zu vergleichen, was vtreat prune tut.

Es sieht ziemlich solide aus.

Also kein brauchbares Ergebnis?

 

Mein Artikel über die Auswahl von Merkmalen.

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

Методические заметки об отборе информативных признаков (feature selection)
Методические заметки об отборе информативных признаков (feature selection)
  • habrahabr.ru
Всем привет! Меня зовут Алексей. Я Data Scientist в компании Align Technology. В этом материале я расскажу вам о подходах к feature selection, которые мы практикуем в ходе экспериментов по анализу данных. В нашей компании статистики и инженеры machine learning анализируют большие объемы клинической информации, связанные с лечением пациентов...
 

Hallo!

Ich habe eine Idee, die ich ausprobieren möchte, aber ich kenne das Werkzeug nicht, um sie umzusetzen... Ich brauche einen Algorithmus, der in der Lage wäre, für ein paar Punkte vorauszusagen, sagen wir für 3 oder 5 (vorzugsweise ein neuronales Netz)

Ich habe bisher nur mit Klassifizierungen gearbeitet, daher verstehe ich nicht einmal, wie das aussehen soll und kann niemandem raten, wie man das macht oder ein Paket in R empfehlen

p.s. Toller Artikel Alexey

Grund der Beschwerde: