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

 

Ich werde die Bedingungen für den Geldpreis klarstellen:

5 Punkte für die erste Person, die das Problem löst

Einsendeschluss für Lösungen: 30. Juni 2016

 

Es gibt ein Beispiel für die Anwendung eines Algorithmus zur Auswahl von informativen Merkmalen zur Umsetzung einer Handelsstrategie.

Sie haben wahrscheinlich meine Blogs über das Große Experiment gelesen: https://www.mql5.com/ru/blogs/post/661895

Und hier ist ein Bild wie dieses:

Ich habe versucht, ein Muster für fünf Paare zu finden und den Prozentsatz der richtig erratenen Geschäfte auf der Grundlage einer Validierungsstichprobe von 25 Jahren oder so zu ermitteln. Es hat nicht sofort geklappt. Ich habe die gewünschte Genauigkeit für einen bestimmten Vorhersagehorizont nicht erreicht.

Nehmen wir als nächstes nur ein Paar, den Eurusd. Ich habe eine Abhängigkeit der Kursbewegung 3 Stunden im Voraus von einer Teilmenge meiner Prädiktoren festgestellt.

Ich reduzierte die Prädiktoren auf eine kategoriale Form und begann mit der Suche nach signifikanten Prädiktoren. Ich habe es gerade jetzt, während ich auf der Arbeit war, in 20 Minuten geschafft.

[1] "1.51%"

> final_vector <- c((sao$par >= threshold), T)

> names(sampleA)[final_vector]

[1] "lag_diff_45_var"      "lag_diff_128_var"     "lag_max_diff_8_var"   "lag_max_diff_11_var"  "lag_max_diff_724_var" "lag_sd_362_var"      

[7] "output"   

Ich habe nicht so schnell Konvergenz erreicht, aber ich habe ein Ergebnis auf dem Niveau von eineinhalb Prozent Erklärungskraft.

Der Konvergenzgraph (Minimierung).

Als nächstes folgt die Konstruktion des Modells.

Wir haben mehrere kategoriale Prädiktoren. Wir erstellen ein "Regelwerk" oder eine Beziehung zwischen den Prädiktoren und dem Output - lang oder kurz in einem 3-Stunden-Zeithorizont.

Wie sieht das Ergebnis aus?

уровни предикторов
sell
buy
pval
concat
direction
121121
11
31
2.03E-03
121121
1
211112
3
15
4.68E-03
211112
1
222222
19
4
1.76E-03
222222
0
222311
8
0
4.68E-03
222311
0
321113
7
0
8.15E-03
321113
0
333332
53
19
6.15E-05
333332
0

Wir sehen die Schiefe der Anzahl der Käufe und Verkäufe in jeder Zeile und den entsprechenden Wert des p-value des Chi-Quadrat-Kriteriums für die Übereinstimmung mit der 50/50-Verteilung. Wir wählen nur die Zeilen aus, bei denen die Wahrscheinlichkeit unter 0,01 liegt.

Und der Code des gesamten Experiments, beginnend mit dem Moment, in dem die Eingänge bereits ausgewählt wurden:

dat_test <- sampleA[, c("lag_diff_45_var"      

  , "lag_diff_128_var"     

  , "lag_max_diff_8_var"   

  , "lag_max_diff_11_var"  

  , "lag_max_diff_724_var" 

  , "lag_sd_362_var"

  , "output")]


dat_test$concat <- do.call(paste0, dat_test[1:(ncol(dat_test) - 1)])


x <- as.data.frame.matrix(table(dat_test$concat

   , dat_test$output))


x$pval <- NA

for (i in 1:nrow(x)){

x$pval[i] <- chisq.test(x = c(x$`0`[i], x$`1`[i])

, p = c(0.5, 0.5))$p.value

}


trained_model <- subset(x

  , x$pval < 0.01)


trained_model$concat <- rownames(trained_model)


trained_model$direction <- NA

trained_model$direction [trained_model$`1` > trained_model$`0`] <- 1

trained_model$direction [trained_model$`0` > trained_model$`1`] <- 0


### test model


load('C:/Users/aburnakov/Documents/Private/big_experiment/many_test_samples.R')


many_test_samples_eurusd_categorical <- list()


for (j in 1:49){


dat <- many_test_samples[[j]][, c(1:108, 122)]

disc_levels <- 3

for (i in 1:108){

naming <- paste(names(dat[i]), 'var', sep = "_")

dat[, eval(naming)] <- discretize(dat[, eval(names(dat[i]))], disc = "equalfreq", nbins = disc_levels)[,1]

}

dat$output <- NA

dat$output [dat$future_lag_181 > 0] <- 1

dat$output [dat$future_lag_181 < 0] <- 0

many_test_samples_eurusd_categorical[[j]] <- subset(dat

   , is.na(dat$output) == F)[, 110:218]

many_test_samples_eurusd_categorical[[j]] <- many_test_samples_eurusd_categorical[[j]][(nrow(dat) / 5):(2 * nrow(dat) / 5), ]


}



correct_validation_results <- data.frame()


for (i in 1:49){

dat_valid <- many_test_samples_eurusd_categorical[[i]][, c("lag_diff_45_var"      

   , "lag_diff_128_var"     

   , "lag_max_diff_8_var"   

   , "lag_max_diff_11_var"  

   , "lag_max_diff_724_var" 

   , "lag_sd_362_var"

   , "output")]

dat_valid$concat <- do.call(paste0, dat_valid[1:(ncol(dat_valid) - 1)])

y <- as.data.frame.matrix(table(dat_valid$concat

   , dat_valid$output))

y$concat <- rownames(y)


valid_result <- merge(x = y, y = trained_model[, 4:5], by.x = 'concat', by.y = 'concat')

correct_sell <- sum(subset(valid_result

 , valid_result$direction == 0)[, 2])

correct_buys <- sum(subset(valid_result

     , valid_result$direction == 1)[, 3])

correct_validation_results[i, 1] <- correct_sell

correct_validation_results[i, 2] <- correct_buys

correct_validation_results[i, 3] <- sum(correct_sell

    , correct_buys)

correct_validation_results[i, 4] <- sum(valid_result[, 2:3])

correct_validation_results[i, 5] <- correct_validation_results[i, 3] / correct_validation_results[i, 4]


}


hist(correct_validation_results$V5, breaks = 10)


plot(correct_validation_results$V5, type = 's')

sum(correct_validation_results$V3) / sum(correct_validation_results$V4)

Dann gibt es 49 Validierungsstichproben, die jeweils etwa 5 Jahre abdecken. Überprüfen wir das Modell an ihnen und zählen wir den Prozentsatz der richtig erratenen Handelsrichtungen.

Sehen wir uns den Prozentsatz der richtig erratenen Abschlüsse nach Stichproben und das Histogramm dieses Wertes an:

Und zählen Sie, wie sehr wir insgesamt die Richtung des Handels bei allen Proben erraten haben:

> sum(correct_validation_results$`total correct deals`) / sum(correct_validation_results$`total deals`)

[1] 0.5361318

Etwa 54%. Aber ohne zu berücksichtigen, dass wir den Abstand zwischen Ask und Bid überwinden müssen. Das heißt, der Schwellenwert liegt laut obigem Diagramm bei etwa 53 %, wenn man davon ausgeht, dass der Spread = 1 Pip ist.

Das heißt, wir haben in 30 Minuten ein einfaches Modell ausgeheckt, das sich z. B. im Terminal leicht codieren lässt. Und es ist nicht einmal ein Ausschuss. Und ich habe 20 Minuten statt 20 Stunden lang nach Abhängigkeiten gesucht. Alles in allem gibt es also etwas.

Und das alles dank der richtigen Auswahl an informativen Attributen.

Und detaillierte Statistiken für jede gültige Stichprobe.

sample
correct sell correct buy total correct deals total deals share correct
1 37 10 47 85 0.5529412
2 26 7 33 65 0.5076923
3 30 9 39 80 0.4875
4 36 11 47 88 0.5340909
5 33 12 45 90 0.5
6 28 10 38 78 0.4871795
7 30 9 39 75 0.52
8 34 8 42 81 0.5185185
9 24 11 35 67 0.5223881
10 23 14 37 74 0.5
11 28 13 41 88 0.4659091
12 31 13 44 82 0.5365854
13 33 9 42 80 0.525
14 23 7 30 63 0.4761905
15 28 12 40 78 0.5128205
16 23 16 39 72 0.5416667
17 30 13 43 74 0.5810811
18 38 8 46 82 0.5609756
19 26 8 34 72 0.4722222
20 35 12 47 79 0.5949367
21 32 11 43 76 0.5657895
22 30 10 40 75 0.5333333
23 28 8 36 70 0.5142857
24 21 8 29 70 0.4142857
25 24 8 32 62 0.516129
26 34 15 49 83 0.5903614
27 24 9 33 63 0.5238095
28 26 14 40 66 0.6060606
29 35 6 41 84 0.4880952
30 28 8 36 74 0.4864865
31 26 14 40 79 0.5063291
32 31 15 46 88 0.5227273
33 35 14 49 93 0.5268817
34 35 19 54 85 0.6352941
35 27 8 35 64 0.546875
36 30 10 40 83 0.4819277
37 36 9 45 79 0.5696203
38 25 8 33 73 0.4520548
39 39 12 51 85 0.6
40 37 9 46 79 0.5822785
41 41 12 53 90 0.5888889
42 29 7 36 59 0.6101695
43 36 14 50 77 0.6493506
44 36 15 51 88 0.5795455
45 34 7 41 67 0.6119403
46 28 12 40 75 0.5333333
47 27 11 38 69 0.5507246
48 28 16 44 83 0.5301205
49 29 10 39 72 0.5416667
СОПРОВОЖДЕНИЕ ЭКСПЕРИМЕНТА ПО АНАЛИЗУ ДАННЫХ ФОРЕКСА: доказательство значимости предсказаний
СОПРОВОЖДЕНИЕ ЭКСПЕРИМЕНТА ПО АНАЛИЗУ ДАННЫХ ФОРЕКСА: доказательство значимости предсказаний
  • 2016.03.02
  • Alexey Burnakov
  • www.mql5.com
Начало по ссылкам: https://www.mql5.com/ru/blogs/post/659572 https://www.mql5.com/ru/blogs/post/659929 https://www.mql5.com/ru/blogs/post/660386 https://www.mql5.com/ru/blogs/post/661062
 

Alle Rohdaten sind über die Links im Blog verfügbar.

Und dieses Modell ist nicht sehr rentabel. MO ist auf dem Niveau eines halben Punktes. Aber das ist die Richtung, in die ich gehe.

 
SanSanych Fomenko:

Immer aus der Vergangenheit lernen.

Wir schauen uns jahrhundertelang ein Diagramm an. Beide auf und wir sehen "drei Soldaten", dann sehen wir "Kopf und Schultern". Wie viele dieser Zahlen haben wir bereits gesehen und wir glauben an diese Zahlen, wir handeln...

Und wenn die Aufgabe so eingestellt ist:

1. automatisch solche Zahlen zu finden, nicht für alle Charts, sondern für ein bestimmtes Währungspaar, die vor kurzem aufgetreten sind, nicht vor drei Jahrhunderten im japanischen Reishandel.

2) Die Ausgangsdaten, auf denen wir automatisch nach solchen Zahlen - Mustern - suchen.

Um die erste Frage zu beantworten, betrachten wir den "Random Forest" genannten Algorithmus, der die Kurse einer oder mehrerer Währungen, Indikatoren, Preissteigerungen - alles, was der Mensch erfunden hat - als Eingangsdaten für seine Arbeit verwendet. 10-5-100-200 ... Eingabevariablen. Dann nimmt es den gesamten Satz von Werten der Variablen, die sich auf einen Zeitpunkt beziehen, der einem Balken entspricht, und sucht nach einer solchen Kombination dieser Eingangsvariablen, die auf den Verlaufsdaten einem ganz bestimmten Ergebnis entsprechen würde, zum Beispiel einer BUY-Order. Und eine weitere Reihe von Kombinationen für einen anderen Auftrag - VERKAUFEN. Jeder dieser Gruppen entspricht ein eigener Baum. Die Erfahrung zeigt, dass der Algorithmus bei einer Eingabemenge von 18000 Balken (etwa 3 Jahre) 200-300 Bäume findet. Dies ist die Reihe von Mustern, fast Analoga von "Köpfen und Schultern", und ganze Münder von Soldaten.

Das Problem bei diesem Algorithmus ist, dass solche Bäume einige Besonderheiten aufgreifen können, die in Zukunft nicht mehr vorkommen. Dies wird hier im Forum "Superfitting" genannt, beim maschinellen Lernen "Overfitting". Wir wissen, dass eine große Menge von Eingangsvariablen in zwei Teile unterteilt werden kann: diejenigen, die mit der Ausgangsvariablen zusammenhängen, und diejenigen, die nicht mit dem Rauschen zusammenhängen. Burnakov versucht also, diejenigen auszusortieren, die für das Ergebnis irrelevant sind.

PS.

Beim Aufbau eines Trend-TS (KAUFEN, VERKAUFEN) sind alle Arten von Stäben mit Rauschen verbunden!

Was Sie sehen, ist ein kleiner Teil des Marktes und nicht der wichtigste. Niemand baut die Pyramide verkehrt herum.
 
yerlan Imangeldinov:
Was Sie sehen, ist ein kleiner Teil des Marktes und nicht der wichtigste. Niemand baut eine Pyramide auf dem Kopf stehend.
Und was genau sehe ich nicht?
 
yerlan Imangeldinov:
Was Sie sehen, ist ein kleiner Teil des Marktes und nicht der wichtigste. Niemand baut eine Pyramide auf dem Kopf stehend.
Sie können dem System neben der Preishistorie weitere Informationen hinzufügen. Aber man muss immer noch an der Geschichte üben. Oder - Flair.
 

Ich habe versucht, das Neuron anhand der Eingabedaten zu trainieren, und mir dann die Gewichte angesehen. Wenn die Eingabedaten ein geringes Gewicht haben, scheint es, dass sie nicht benötigt werden. Ich habe es mit R (Rattle) gemacht, danke an SanSanych für seinen Artikel https://www.mql5.com/ru/articles/1165.

Eingabe Eingabe_1 Eingabe_2 Eingabe_3 Eingabe_4 Eingabe_5 Eingabe_6 Eingabe_7 Eingabe_8 Eingabe_9 Eingabe_10 Eingabe_11 Eingabe_12 Eingabe_13 Eingabe_14 Eingabe_15 Eingabe_16 Eingabe_17 Eingabe_18 Eingabe_19 Eingabe_20
Gewicht -186.905 7.954625 -185.245 14.88457 -206.037 16.03497 190.0939 23.05248 -182.923 4.268967 196.8927 16.43655 5.419367 8.76542 36.8237 5.940322 8.304859 8.176511 17.13691 -0.57317
Teilmenge ja ja ja ja ja ja

Ich habe diesen Ansatz nicht in der Praxis getestet, ich frage mich, ob er funktioniert hat oder nicht. Ich würde Eingang_1 Eingang_3 Eingang_5 Eingang_7 Eingang_9 Eingang_11 nehmen

Случайные леса предсказывают тренды
Случайные леса предсказывают тренды
  • 2014.09.29
  • СанСаныч Фоменко
  • www.mql5.com
В статье описано использование пакета Rattle для автоматического поиска паттернов, способных предсказывать "лонги" и "шорты" для валютных пар рынка Форекс. Статья будет полезна как новичкам, так и опытным трейдерам.
 
Dr. Trader:

Ich habe versucht, das Neuron anhand der Eingabedaten zu trainieren, und mir dann die Gewichte angesehen. Wenn die Eingabedaten ein geringes Gewicht haben, scheint es, dass sie nicht benötigt werden. Ich habe es mit R (Rattle) gemacht, danke an SanSanych für seinen Artikel https://www.mql5.com/ru/articles/1165.

Eingabe Eingabe_1 Eingabe_2 Eingabe_3 Eingabe_4 Eingabe_5 Eingabe_6 Eingabe_7 Eingabe_8 Eingabe_9 Eingabe_10 Eingabe_11 Eingabe_12 Eingabe_13 Eingabe_14 Eingabe_15 Eingabe_16 Eingabe_17 Eingabe_18 Eingabe_19 Eingabe_20
Gewicht -186.905 7.954625 -185.245 14.88457 -206.037 16.03497 190.0939 23.05248 -182.923 4.268967 196.8927 16.43655 5.419367 8.76542 36.8237 5.940322 8.304859 8.176511 17.13691 -0.57317
Teilmenge ja ja ja ja ja ja

Ich habe diesen Ansatz nicht in der Praxis getestet, ich frage mich, ob er funktioniert hat oder nicht. Ich würde Eingang_1 Eingang_3 Eingang_5 Eingang_7 Eingang_9 Eingang_11 nehmen

) hmm. sehr interessant.

Klärende Frage. Warum fügen Sie dann nicht noch weitere Eingaben hinzu, bei denen das Gewicht gering ist, z. B. 13, 14, 16? Könnten Sie ein Diagramm der Eingänge und Gewichte, geordnet nach Gewicht, zeigen?

Entschuldigung, ich habe es zuerst nicht verstanden. Ja, die angegebenen Eingaben haben ein großes Modulo-Gewicht, wie es auch sein sollte.

 

Optisch sind alle Gewichte in zwei Gruppen unterteilt. Wenn man sie nach Bedeutung/Nicht-Bedeutung einteilen will, dann stechen 5,11,7,1,3,9 deutlich hervor, dieser Satz ist meiner Meinung nach ausreichend.