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

 
Aleksey Vyazmikin #:

Sie haben einmal ein Skript erstellt, das ich wieder verwenden möchte.

Ich habe es auf einem Beispiel ausgeführt, und es gibt einen Fehler - ich kann nicht verstehen, wo der Fehler zu finden und wie es zu beheben - vielleicht wissen Sie, da Sie diese Bibliotheken / Pakete verwenden?

Bei einem binären Beispiel hat alles gut funktioniert.

Der Fehler besagt, dass undefinierte Werte (NA) in der Korrelationsmatrix aufgetaucht sind und die Funktion findCorrelation sie nicht verwenden kann. Öffnen Sie das Paket und lesen Sie die Funktionsbeschreibung.

Die Skripte sind unübersichtlich und ein Meer von unnötigen Zwischenergebnissen. Nachfolgend das korrigierte Skript

#=====================================================================
 require(tidyft)
#--get  df1------------------------------------------------------------
way <-         "D:\\FX\\MT5_CB\\MQL5\\Files\\Po_Vektoru_TP_0_SL_0\\EURUSD_0\\Setup"
df1 = read.csv(paste0(way, "train.csv"), header = TRUE, sep = ";",dec = ".")
#df1 = fread(paste0(way, "train1.csv"))
#fst::write_fst(df1, "train1.fst")
#-----archiv--------------------------------
 ft <- as_fst(df1) #
 rm(df1)


#---constanti--------------------------------------------
 cor.test.range <- seq(from = 0.1,to = 0.9,by = 0.1)  #  диапазон перебора в коеф корр
not.used.colums = c("Target_100_Buy","Target_100_Sell","Target_P","Time","Target_100")

ft %>% select_fst(cols = not.used.colums, negate = TRUE)-> dt
#--function--------------------------------------------
 get.findCor<- function(data , cor.coef = cor.test.range){
    import::here(.from = caret, findCor = findCorrelation)
    data %>%
        cor(method = "kendall", use = "pairwise" ) %>%
        findCor(cutoff = cor.coef, exact = FALSE, names = TRUE)->nms
        if(nms!= 0)
        select_dt(data, cols = nms, negate = TRUE)
}
#----Calculate--------------------------------------------------------------
for(i in seq_len(length(cor.test.range))){
    get.findCor(dt, cor.coef = cor.test.range[i])-> dt.n
    paste0("train2_" , cor.test.range[i]*10 , ".csv") %>%
        paste0(way , .) %>% fwrite(dt.n, .)
    rm(dt.n)
}

Erklärungen in der Reihenfolge:

1. Sie brauchen das "caret"-Paket nicht in den globalen Bereich zu laden. Es ist sehr schwer und zieht eine Menge Abhängigkeiten und Daten mit sich. Sie brauchen nur eine Funktion davon. Sie importieren es direkt in die Funktion get.findCor.

Das Paket "tidyft" ist ein sehr schnelles Paket zur Manipulation von Datenrahmen. Verwenden Sie es.

 

Zur Kontrolle habe ich mein Kit mit diesem Skript getestet. Ergebnis:

# patch <- "C:/RData/Project/FEDOT/"
# df1 <- fread(paste0(patch, "DF_train_M5.csv"))
# object.size(df1) #780184 bytes
# dim(df1) #[1] 4030   25
# ft <- as_fst(df1)#
# rm(df1)
#ft %>% select_fst(cols = c(1:3,25), negate = TRUE)-> dt
#dim(dt) [1] 4030   21
bench::workout({
    for(i in seq_len(length(cor.test.range))){
        get.findCor(dt, cor.coef = cor.test.range[i])-> dt.n
        paste0("train2_" , cor.test.range[i]*10 , ".csv") %>%
            paste0(patch , .) %>% fwrite(dt.n, .)
        rm(dt.n)
    }
})->t1 #(12.9  m)
setwd(patch)
dim(fread("train2_1.csv"))
#[1] 4030    3
dim(fread("train2_2.csv"))
#[1] 4030    6
dim(fread("train2_3.csv"))
#[1] 4030   10
dim(fread("train2_4.csv"))
#[1] 4030   13
dim(fread("train2_5.csv"))
#[1] 4030   16
dim(fread("train2_6.csv"))
#[1] 4030   17
dim(fread("train2_7.csv"))
#[1] 4030   18
dim(fread("train2_8.csv"))
#[1] 4030   18
dim(fread("train2_9.csv"))
#[1] 4030   18

Es zählt ziemlich lange (12,9 min). Aber der Rahmen ist auch nicht klein. Natürlich müssen wir es parallelisieren und nach einer schnelleren Cor-Funktion suchen.

Aus den anfänglichen 21 Prädiktoren mit verschiedenen Schwellenwerten haben wir eine unterschiedliche Anzahl von Prädiktoren ausgewählt.

Aber das ist nicht der richtige Weg.

Viel Erfolg!

 
СанСаныч Фоменко #:

Sie haben nicht auf die Variabilität von sd geachtet

Ich werde das nächste Mal darauf achten, ich werde sd von sd von sd von sd %) zählen

 

Die Bindung des Offsets des Feature-Fensters an einen Indikator (z.B. std) hat nichts gebracht

je größer der Wert, desto größer das Vielfache des Offsets dieses Wertes.

oder andersherum. Habe beides probiert.

es gibt auch eine Variante des Expandierens-Verschmälerns (+ Offset?), ich habe es noch nicht ausprobiert.

Eine Aufzählung solcher Varianten sehe ich nur im Rahmen von Fraktalen.

 
Vladimir Perervenko #:

1. Sie brauchen das Paket "caret" nicht in den globalen Bereich zu laden. Es ist sehr schwer, zieht eine Menge von Abhängigkeiten und Daten. Sie brauchen nur eine Funktion davon. Sie importieren es direkt in die Funktion get.findCor.

Wow, ist das hohl

Vladimir Perervenko #:

Vladimir, wissen Sie, ob es ein Paket für Backtest gibt, das ein Protokoll der Transaktionen und alles (nun, nicht primitiv zu sein), außer für langsame "quantstrat" und "SIT" hält

 
Maxim Dmitrievsky #:

Das Binden des Offsets des Feature-Fensters an einen Indikator (z.B. std) hat nichts gebracht

je größer der Wert, desto größer das Vielfache des Offsets dieses Wertes.

oder andersherum. Ich habe beides ausprobiert.

Es gibt auch die Möglichkeit, den Wert zu vergrößern und zu verkleinern (+ Offset?), ich habe es noch nicht ausprobiert.

Ich sehe nur ein Überschießen solcher Varianten im Rahmen von Fraktalen

Ja, absolut.

Alles muss bei jedem Schritt neu berechnet werden.

 
СанСаныч Фоменко #:

Ganz genau.

Alles muss bei jedem Schritt neu berechnet werden.

Ich finde es einfacher, die Möglichkeiten der Neuberechnung von Beschriftungen und Merkmalen bei einem großen Datensatz durchzugehen, als jeden Balken neu zu trainieren, da ich dann lange feststecke.

Und durch häufiges Neutrainieren stellt man ein allgemeines Muster fest, wenn man es global betrachtet. Es sei denn, dieses Muster ist natürlich fließend.
 
Maxim Dmitrievsky #:

Es ist einfacher für mich zu gehen über Möglichkeiten zur Neuberechnung von Etiketten gegen Chips auf einem großen Datensatz als jeden Balken neu zu trainieren, würde ich für eine lange Zeit stecken bleiben

Ich stimme zu, das ist der Grund, warum ich nicht zu EA wechseln kann.

Aber es ist eine Frage des Prinzips. Ich bin auf das Schema "teach every step" umgestiegen wegen der versteckten Vorausschau, die durch die Aufbereitung des gesamten Datensatzes entsteht. Ich habe genau dieses Problem, und es ist mir nicht gelungen, Prädiktoren zu finden, die den "Vorausschau-Effekt" erzeugen.

 
СанСаныч Фоменко #:

Das ist der Grund, warum es nicht an EA geht.

Aber es ist eine Grundsatzfrage. Ich bin wegen der versteckten Vorausschau, die durch die Aufbereitung des gesamten Datensatzes entsteht, zum "Teach at every step"-Schema übergegangen. Ich habe genau dieses Problem, und es ist mir nicht gelungen, Prädiktoren zu finden, die den "vorausschauenden" Effekt erzeugen.

Machen Sie eine Lücke zwischen dem Trainingsabschnitt und dem Test. Wenigstens ein paar Tage. Die letzten Balken haben die gleiche Zukunft wie die erste Unbekannte.
Das Embargo-Diagramm wird sozusagen genannt.
Einmal Training auf 1 Tag reduziert und der Test war 1 Tag. Und beobachtete die Prognose für den Aufschlag ein paar Tage im Voraus. D.h. er sah, was für neue Balken sein werden. Die Ergebnisse waren sehr gut.
Mit der Erhöhung des Trainingsintervalls bis zu einer Woche, war das Ergebnis auch höher als 50/50. Nun, je mehr - desto schlechter, die Linien mit Peeking wurden zu den Linien ohne Peeking addiert und sie verdarben alles))))
.


Im Allgemeinen sollte diese Embargoplotte nicht weniger als ein Peek-ahead für den Lehrer sein.

 
mytarmailS #:

Wow, das ist eine hohle Sache

Vladimir, wissen Sie, ob es ein Paket für Backtest gibt, das ein Protokoll der Transaktionen und alles andere (na ja, nicht primitiv zu sein), mit Ausnahme der langsamen "quantstrat" und "SIT" hält.

Ich weiß es nicht. Ich habe nicht getroffen