L'apprentissage automatique dans la négociation : théorie, modèles, pratique et algo-trading - page 2

 

Je vais clarifier les conditions pour le prix en espèces :

5 crédits à la première personne à résoudre le problème

Date limite pour les solutions : 30 juin 2016

 

Il existe un exemple d'application d'un algorithme de sélection de traits informatifs pour mettre en œuvre une stratégie de trading.

Vous avez probablement lu mes blogs sur la grande expérience : https://www.mql5.com/ru/blogs/post/661895.

Et voici une photo comme celle-ci :

J'ai essayé de trouver un modèle pour cinq paires et de détecter le pourcentage de transactions correctement devinées sur un échantillon de validation de 25 ans environ. Ça n'a pas marché tout de suite. Je n'ai pas atteint la précision souhaitée pour un horizon de prévision donné.

Ensuite, prenons une seule paire, l'eurusd. J'ai trouvé une dépendance du mouvement des prix 3 heures à l'avance sur un sous-ensemble de mes prédicteurs.

J'ai réduit les prédicteurs à une forme catégorielle et j'ai commencé ma fonction de recherche de prédicteurs significatifs. Je l'ai fait maintenant, pendant que j'étais au travail, en 20 minutes.

[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"   

Je n'ai pas obtenu une convergence aussi rapide, mais j'ai obtenu un certain résultat au niveau d'un pouvoir explicatif d'un et demi pour cent.

Le graphe de convergence (minimisation).

Vient ensuite la construction du modèle.

Nous avons plusieurs prédicteurs catégoriels. Nous construisons un "livre de règles" ou quel type de relation il y a entre les prédicteurs et la sortie - longue ou courte dans un horizon temporel de 3 heures.

A quoi ressemble le résultat ?

уровни предикторов
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

Nous voyons l'asymétrie du nombre d'achats et de ventes dans chaque ligne et la valeur correspondante de la valeur p du critère du chi-deux pour la correspondance avec la distribution 50/50. Nous ne retenons que les lignes dont la probabilité est inférieure à 0,01.

Et le code de toute l'expérience, à partir du moment où les entrées ont déjà été sélectionnées :

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)

Ensuite, il y a 49 échantillons de validation, chacun couvrant environ 5 ans. Validons le modèle sur eux et comptons le pourcentage de directions de transaction correctement devinées.

Voyons le pourcentage de transactions correctement devinées par échantillons et l'histogramme de cette valeur :

Et comptez combien au total nous avons deviné le sens de la transaction sur tous les échantillons :

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

[1] 0.5361318

Environ 54%. Mais sans tenir compte du fait que nous devons surmonter la distance entre Ask et Bid. Autrement dit, le seuil selon le graphique ci-dessus est d'environ 53%, en supposant que le spread = 1 pip.

C'est-à-dire que nous avons concocté un modèle simple en 30 minutes, qui est facile à coder dans le terminal, par exemple. Et ce n'est même pas un comité. Et je cherche des dépendances depuis 20 minutes au lieu de 20 heures. Dans l'ensemble, il y a quelque chose.

Et tout cela grâce à une sélection judicieuse d'attributs informatifs.

Et des statistiques détaillées pour chaque échantillon valide.

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
 

Toutes les données brutes sont disponibles sur les liens du blog.

Et ce modèle n'est guère rentable. Le MO est au niveau d'un demi-point. Mais c'est la direction que je prends.

 
SanSanych Fomenko:

Toujours apprendre du passé.

Nous regardons pendant des siècles un graphique. Ensuite, nous voyons "trois soldats", puis "tête et épaules". Combien de ces chiffres nous avons déjà vus et nous croyons en ces chiffres, nous échangeons...

Et si la tâche est définie comme ceci :

1. trouver automatiquement de tels chiffres, non pas pour tous les graphiques, mais pour une paire de devises particulière, ceux qui se sont produits récemment, et non pas il y a trois siècles dans le commerce du riz japonais.

2) Les données initiales sur lesquelles nous recherchons automatiquement de telles figures - modèles.

Pour répondre à la première question, considérons l'algorithme appelé "forêt aléatoire". Cet algorithme prend comme données d'entrée les cours d'une ou plusieurs devises, des indicateurs, des incréments de prix - tout ce qui a été inventé par l'homme. 10-5-100-200 ... les variables d'entrée. Il prend ensuite l'ensemble des valeurs des variables se référant à un moment donné correspondant à une barre et recherche une combinaison de ces variables d'entrée qui correspondrait, sur les données historiques, à un certain résultat, par exemple un ordre BUY. Et une autre série de combinaisons pour un autre ordre - VENDRE. Un arbre distinct correspond à chacun de ces ensembles. L'expérience montre que pour un ensemble d'entrée de 18000 barres (environ 3 ans) l'algorithme trouve 200-300 arbres. C'est l'ensemble des motifs, presque analogues aux "têtes et épaules", et aux bouches entières des soldats.

Le problème avec cet algorithme est que de tels arbres peuvent capter certaines spécificités qui ne seront pas rencontrées dans le futur. C'est ce qu'on appelle ici dans le forum le "superfitting", dans l'apprentissage machine le "overfitting". Nous savons qu'un grand ensemble de variables d'entrée peut être divisé en deux parties : celles qui sont liées à la variable de sortie et celles qui ne sont pas liées au bruit. Burnakov essaie donc d'éliminer celles qui ne sont pas pertinentes pour le résultat.

PS.

Lors de la construction d'une tendance TS (BUY, SELL) toutes les variétés de wagons sont liées au bruit !

Ce que vous voyez n'est qu'une petite partie du marché et ce n'est pas le plus important. Personne ne construit la pyramide à l'envers.
 
yerlan Imangeldinov:
Ce que vous voyez n'est qu'une petite partie du marché et non la plus importante. Personne ne construit une pyramide à l'envers.
Et plus précisément, qu'est-ce que je ne vois pas ?
 
yerlan Imangeldinov:
Ce que vous voyez n'est qu'une petite partie du marché et non la plus importante. Personne ne construit une pyramide à l'envers.
Vous pouvez ajouter des informations au système en dehors de l'historique des prix. Mais vous devez quand même vous entraîner sur l'histoire. Ou - Flair.
 

J'ai essayé d'entraîner le neurone sur les données d'entrée, puis j'ai regardé les poids. Si les données d'entrée ont un faible poids, il semble qu'elles ne soient pas nécessaires. Je l'ai fait avec R (Rattle), merci à SanSanych pour son article https://www.mql5.com/ru/articles/1165.

entrée entrée_1 entrée_2 entrée_3 entrée_4 entrée_5 entrée_6 entrée_7 entrée_8 entrée_9 entrée_10 entrée_11 entrée_12 entrée_13 entrée_14 entrée_15 entrée_16 entrée_17 entrée_18 entrée_19 entrée_20
poids -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
sous-ensemble oui oui oui oui oui oui

Je n'ai pas testé cette approche en pratique, je me demande si elle a fonctionné ou non. Je prendrais l'entrée_1 entrée_3 entrée_5 entrée_7 entrée_9 entrée_11

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

J'ai essayé d'entraîner le neurone sur les données d'entrée, puis j'ai regardé les poids. Si les données d'entrée ont un faible poids, il semble qu'elles ne soient pas nécessaires. Je l'ai fait avec R (Rattle), merci à SanSanych pour son article https://www.mql5.com/ru/articles/1165.

entrée entrée_1 entrée_2 entrée_3 entrée_4 entrée_5 entrée_6 entrée_7 entrée_8 entrée_9 entrée_10 entrée_11 entrée_12 entrée_13 entrée_14 entrée_15 entrée_16 entrée_17 entrée_18 entrée_19 entrée_20
poids -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
sous-ensemble oui oui oui oui oui oui

Je n'ai pas testé cette approche en pratique, je me demande si elle a fonctionné ou non. Je prendrais l'entrée_1 entrée_3 entrée_5 entrée_7 entrée_9 entrée_11

) hmm. très intéressant.

Question de clarification. Pourquoi ne pas inclure d'autres entrées où le poids est faible, par exemple 13, 14, 16 ? Pourriez-vous montrer un diagramme des entrées et des poids classés par poids ?

Désolé, je n'ai pas compris au début. Oui, les entrées spécifiées ont un poids modulo important, comme il se doit.

 

Visuellement, tous les poids sont divisés en deux groupes. Si l'on veut les diviser en fonction de leur importance ou de leur non-significativité, alors 5,11,7,1,3,9 se détachent clairement, cet ensemble me semble suffisant.