L'Apprentissage Automatique dans le trading : théorie, modèles, pratique et trading algo - page 2
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
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 ?
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.
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.
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 non la plus importante. Personne ne construit une pyramide à l'envers.
Ce que vous voyez n'est qu'une petite partie du marché et non la plus importante. Personne ne construit une pyramide à l'envers.
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.
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
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.
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.