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

 
Alexey Burnakov:
OK, vous pouvez penser. Imaginons par exemple qu'à chaque itération, le réseau neuronal n'effectue pas une rétropropagation de l'erreur standard basée sur l'écart cible par rapport à la prédiction, mais qu'il reçoit des données selon lesquelles, à la version précédente des pondérations, le commerce réel diffère de l'idéal de tant de points. Et met à jour les pondérations en fonction de ces informations. Autrement dit, l'information doit être un flux parallèle à la machine. Peut-être, c'est possible.

Pourquoi avez-vous besoin de poids ? Pourquoi parlez-vous d'eux en premier lieu ?

J'avais compris que vous aviez besoin de poids antérieurs, maintenant je comprends que je ne comprends rien)

 
mytarmailS:

Pourquoi avez-vous besoin de poids ? Pourquoi parlez-vous d'eux en premier lieu ?

J'avais compris qu'il fallait des poids précédents, maintenant je comprends que je n'ai rien compris)

Eh bien, on dirait que oui.)

Nous n'avons pas besoin des poids. Je les ai juste mentionnés pour que ce soit clair pour VOUS. Nous devons savoir comment le système s'est comporté par rapport aux poids précédents. Nous avons besoin du résultat du commerce d'une manière intégrée. Tout.

Les poids sont mis à jour par l'algorithme.

 

Ici, une simple fonction fonctionne. Il faut en essayer un plus complexe. Il faut encore le différencier, c'est la partie délicate.

library(neuralnet)


y <- as.data.frame(matrix(runif(n = 10000, min = -15, max = 15), ncol = 2))

y$V3 <- runif(n = 5000,  min = -15, max = 15)

y$V4 <- runif(n = 5000,  min = -15, max = 15)

y$V5 <- runif(n = 5000,  min = -15, max = 15)

y$V6 <- runif(n = 5000,  min = -15, max = 15)

y$V7 <- runif(n = 5000,  min = -15, max = 15)

y$V8 <- y$V1 ^ 2 + y$V2 ^ 2

colnames(y) <- c('input_1', 'input_2', 'noise_1', 'noise_2', 'noise_3', 'noise_4', 'noise_5', 'output')


f_f <- function(x, y){

1/2*(y-x)^2

}


print(

nn_model <- neuralnet(formula = output ~ input_1 + input_2 + noise_1

, data = y

, hidden = 1

, threshold = 0.01

, stepmax = 1e+05

, rep = 100

, startweights = NULL

, learningrate.limit = NULL

, learningrate.factor = list(minus = 0.5, plus = 1.2)

, learningrate=NULL

, lifesign = "none"

, lifesign.step = 10

, algorithm = "rprop+"

, err.fct = f_f #"sse"

, act.fct = "logistic"

, linear.output = F

, exclude = NULL

, constant.weights = NULL

, likelihood = FALSE

)

)

 

f_f <- function(x, y) 1/2*(y-x)^2

f_f - compte l'erreur pour le réseau, n'est-ce pas ?

x est ce que la valeur devrait être (courbe idéale)

y est comme il devrait être (la vraie courbe)

La différence entre les deux est l'erreur

J'ai besoin d'un vecteur de transactions par chandeliers précédents, j'ai besoin des règles pour ouvrir les transactions, j'ai besoin des données d'entrée des transactions.

 
mytarmailS:

f_f <- function(x, y) 1/2*(y-x)^2

f_f - compte l'erreur pour le réseau, n'est-ce pas ?

x est ce que la valeur devrait être (courbe idéale)

y est ce qu'il devrait être (la vraie courbe)

La différence entre les deux est l'erreur

Je pense avoir besoin d'un vecteur de transactions par chandeliers, mais je ne comprends pas comment ouvrir des transactions avec quelles règles, comment ces données d'entrée devraient ressembler...

Presque. X est un vecteur de prédictions ns. Ygrek est le vecteur des augmentations de prix par barre à terme (par exemple ), ce qui correspond à ce que le réseau prédit. Et l'ensemble de la fonction est ce que l'algorithme NS verra à chaque itération. Aucun résultat n'existe à ce jour. Ils doivent être modélisés.

Comment. Nous devrions décrire la logique d'ouverture des positions et saisir le spread directement dans le corps de la fonction. Inscrivez le résultat des positions ouvertes dans le vecteur et calculez les caractéristiques intrinsèques sur le vecteur.

Par exemple : buy<-(y-spread) [x>0]. Ce sera un vecteur pour les longs. Puis all<-append(buy, sell).

Mais ça ne marchera probablement pas. Il y a beaucoup de restrictions sur le type de fonction (.
 
En attendant, je continue mon expérience. J'ai entraîné la machine uniquement sur eurusd et j'ai obtenu un petit MO positif sur la validation.

Vous trouverez ci-joint une capture d'écran du test du modèle actuel dans MT4. La phase de formation est encore en cours... Les résultats complets ne seront pas disponibles avant demain. Les calculs sont assez longs en liaison avec R et à chaque minute s'il n'y a pas de transactions ouvertes. Lancé en 1999. La validation commencera à partir de 2010.09. Le tableau actuel est celui de 2003.

J'utilise un écart de 10 points à cinq chiffres. Attendez-vous à 7-8 pips sur la validation du MO. Pas dense.... Mais maintenant vous pouvez déjà trouver des DC où le spread est de 10 pips, c'est pourquoi je pense que le résultat est presque significatif.
Dossiers :
 

Un collègue m'a envoyé un lien vers un cours sur l'apprentissage automatique. Voulez-vous y jeter un coup d'œil ? C'est gratuit, mais c'est en Python pour une raison quelconque ((

https://www.udacity.com/course/machine-learning-for-trading--ud501

 
Alexey Volchanskiy:

Un collègue m'a envoyé un lien vers un cours sur l'apprentissage automatique. Voulez-vous y jeter un coup d'œil ? C'est gratuit, mais c'est en Python pour une raison quelconque ((

https://www.udacity.com/course/machine-learning-for-trading--ud501

Les plus efficaces :

1. vous mettez R - 5 minutes.

2. téléchargez le paquet rattle, qui est conçu comme une interface graphique et ne nécessite donc aucune connaissance de R.

3. Pour réduire vos frais de démarrage, vous pouvez utiliser mon article. Il contient des explications et, ce qui est plus important, il est accompagné d'un fichier prêt à l'emploi. Une fois que vous avez vu mon dossier, vous pouvez facilement préparer le vôtre.

4. Vous avez six modèles.

5. L'essentiel dans le hochet est que vous pouvez voir le cycle complet de l'apprentissage automatique :

  • préparation initiale des données (data mining)
  • modélisation
  • évaluation des résultats
  • comme un texte bonus sur le R de toutes vos activités de crécelle. Ce texte peut ensuite être utilisé en dehors du hochet.

Tout cela vous donnera des bases sans lacunes, et surtout une expérience concrète de l'apprentissage automatique lié au forex.

PS.

Le hochet vous sera très utile non seulement lors des premiers pas, mais aussi plus tard : coûts minimaux, pour estimer quelque chose, pour expérimenter...

PSPS

Bien sûr, vous ne pouvez pas vous passer de livres. Il y en a beaucoup ici. La recherche fonctionne parfaitement.

 
mytarmailS:

Merci pour la clarification détailléeDr.Trader!

Vous savez, le mieux et le plus correct serait probablement d'enseigner les renversements eux-mêmes, même le même zigzag, c'est-à-dire de donner trois états 1) demi-tour vers le haut

2) inversion à la baisse

3) pas un demi-tour

Mais que ce soit pour l'enseigner, il est assez difficile d'attraper les inversions, plus le biais dans le nombre d'observations, les classes "pas d'inversion" seront des dizaines ou peut-être des centaines de fois plus.

Quels prédicteurs utilisez-vous et quels sont les résultats ?

Je viens de commencer à utiliser l'analyse spectrale, les premiers tests se sont révélés bien meilleurs qu'avec les indicateurs, je l'ai fait passer par rattle, l'erreur de formation et de test était d'environ 6%, mais lorsque j'ai commencé à utiliser R, l'erreur est passée à 30% si je ne me trompe pas, San Sanich dit qu'il s'agit d'un recyclage, donc je ne comprends toujours pas grand chose

Il existe également un moyen de découvrir quelles périodes dominent sur le marché grâce à l'analyse spectrale, puis vous pouvez utiliser ces périodes dans les indicateurs. Je vais obtenir des indicateurs adaptatifs, non ajustés à l'historique.

J'utilise des indicateurs standard comme base pour créer des prédicteurs. Je suis encore en train de les expérimenter moi-même, en essayant les idées de ce fil de discussion du forum.

Je l'ai fait pendant les dernières semaines, maintenant le meilleur résultat est le suivant : (beaucoup de calculs, j'essaie d'utiliser le timeframe D1 pour un calcul plus rapide, plus tard j'utiliserai un timeframe plus petit)

1) exportation de mt5 vers csv : ohlc, temps, indicateurs, tous pour les 10 dernières barres. J'ai récemment commencé à prendre le temps uniquement à partir de la barre la plus récente, je pense que le temps des autres barres est calculable et n'apporte donc aucune nouvelle information. Plusieurs centaines de prédicteurs "primaires" sortent. Le résultat requis de l'apprentissage est "1" ou "0" - hausse ou baisse du prix dans la barre suivante. Ma méthode avec les zigzags n'est pas stable et complexe, je suis meilleur pour travailler avec des prix proches maintenant. Lorsque j'aurai élaboré un algorithme complet pour l'entraînement du modèle à partir de zéro, je pourrai commencer à travailler sur les zigzags et la prédiction des tendances.

2) Dans R, j'effectue différentes opérations mathématiques avec les données disponibles - addition, deltas, min, max, etc. Il sort déjà plus d'un millier de prédicteurs.

3) Il est évident qu'il y a plus de déchets que nécessaire après la deuxième étape. Je le passe au crible en suivant la méthode de l'article sur les composants de basehttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/, SanSanych en a parlé plus tôt. Je n'enseigne pas le modèle PCR lui-même et je me suis contenté de la fonction de présélection des prédicteurs pour le moment :

library('vtreat')
PrunePredictors <- function(srcTable, pruneSig = -1) {
        targetName <- tail(colnames(srcTable), 1)
        
        treatmentsN <- designTreatmentsN(srcTable,setdiff(colnames(srcTable),targetName),targetName, verbose=FALSE)
        if(pruneSig<0){
                pruneSig = 1.0/(ncol(srcTable)-1)
        }

        scoreFrameSorted <- treatmentsN$scoreFrame[,c("origName", "psig", "code")]
        scoreFrameSorted <- subset( scoreFrameSorted, code == "clean")[,1:2]
        scoreFrameSorted <- scoreFrameSorted[with(scoreFrameSorted, order(psig)), ]
        
        scoreFrameSortedPruned <- subset( scoreFrameSorted, psig < pruneSig)
        scoreFrameSortedPruned <- scoreFrameSortedPruned[,1] 
        
        cat("Minimal psig:", scoreFrameSorted[1,2], "\n")
        cat("Maximal psig:", scoreFrameSorted[nrow(scoreFrameSorted),2], "\n")
        cat("Threshold:", pruneSig, "\n")
        cat("Good predictors:", nrow(subset( scoreFrameSorted, psig < pruneSig)), "\n")
        
        return(scoreFrameSortedPruned)
}

srcTable est une table avec des prédicteurs, la dernière colonne doit être le résultat de l'entraînement requis.pruneSig est mieux de laisser -1.

En conséquence, la fonction renverra une liste avec les noms des colonnes du tableau qui contiennent des informations utiles. Ou une liste vide si rien d'utile n'est trouvé. Cette méthode est mentionnée dans l'article comme n'étant pas très significative, mais elle s'avère tout à fait adéquate, elle filtre très bien les déchets. En outre, la liste des résultats sera triée par pertinence, du plus utile au moins utile.

4) Si la fonction renvoie une liste vide, j'exécute à nouveau la deuxième étape, en générant à nouveau différentes combinaisons mathématiques sur les données disponibles, puis la troisième étape pour les trier. Je dois répéter cette étape 3-4 fois. Le volume de données augmente à chaque répétition, il est donc préférable de limiter d'une manière ou d'une autre le volume de nouvelles données générées. Nous pouvons modifier cette fonction pour le tamisage, de sorte que si la liste est vide, elle renvoie une centaine ou deux des meilleurs résultats et génère de nouveaux prédicteurs uniquement à partir de ceux-ci.

5) Ensuite, selon l'article, nous devons former le modèle du composant principal lui-même. J'ai des problèmes avec elle - jusqu'à présent, le meilleur r-carré pour le modèle formé est de 0,1, ce n'est pas suffisant, l'article dit que j'ai besoin d'au moins 0,95. Mais je peux entraîner un autre modèle R sur les prédicteurs obtenus et cela donnera un meilleur résultat. J'ai le plus d'expérience avec la neuronique, le meilleur résultat dans le fronttest avec elle sort avec une erreur d'environ 37%. Le modèle PCE est censé être plus stable, sans réapprentissage, etc., mais jusqu'à présent, je n'ai pu obtenir aucun prédicteur pour lui.

Si vous avez une erreur de 30% dans le fronttest alors c'est un modèle assez rentable, faites un Conseiller Expert pour mt5 et vérifiez-le dans le testeur de stratégie.

 
Alexey Volchanskiy:

Un collègue m'a envoyé un lien vers un cours sur l'apprentissage automatique. Voulez-vous y jeter un coup d'œil ? C'est gratuit, mais c'est en Python pour une raison quelconque ((

https://www.udacity.com/course/machine-learning-for-trading--ud501

J'ai commencé à regarder ce cours, il accorde beaucoup d'attention au framework Pandas sur Python. Les premières leçons ressemblent plus à un tutoriel sur ce même cadre qu'à un cours sur l'analyse des données. Mais le tutoriel semble adéquat, sans le typique "Je suis un gourou du Forex, je vais vous ouvrir les yeux et vous allez gagner des millions" comme dans beaucoup d'autres formations inutiles, cela donne l'espoir qu'ils diront des choses adéquates jusqu'à la fin. Mais il faut aussi noter que ce cours est conçu pour le trading boursier et non pour le forex, je ne sais pas si les processus d'apprentissage des modèles sont similaires dans ces deux domaines.
Raison: