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

 
Dr. Trader:

J'ai déjà posté des exemples de neurones ici, je vais chercher quelque chose de convenable et le refaire pour vos données (et avec un comité). Je n'écrirai pas de cours d'introduction, mais j'ajouterai plus de commentaires au code.


Désolé, je ne comprends pas la signification de la variable avec(F,T) Dans la boucle

for(i in c(1:nrow(table))[c(F,T)]){
   ..... table[i,] ..... 
}

C'est-à-dire que cette boucle va sur les lignes paires du tableau, mais comment faire sur les lignes impaires ?

 

F et T sont des abréviations pour les valeurs booléennes FALSE et TRUE. En principe, il importe peu d'écrire c(T,F) ou c(TRUE,FALSE), la première variante est simplement plus courte.

Si le tableau comporte 10 lignes, alors c(1:nrow(table)) est juste un vecteur de c(1,2,3,4,5,6,7,8,9,10).
Et les tableaux contenant des valeurs booléennes dans ce cas boucleront jusqu'à la longueur requise, vous obtenez c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE).

c'est-à-dire c(1:nrow(table))[c(F,T)] R comprendra que
c(1,2,3,4,5,6,7,8,9,10)[c(VRAI,FAUX,VRAI,FAUX,VRAI,FAUX]
et prend les éléments du vecteur qui correspondent à VRAI dans l'ordre.

Par exemple, si nous voulons prendre tous les trois éléments, nous pouvons l'écrire comme suit
c(1,2,3,4,5,6,7,8,9,10)[c(FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,TRUE,FALSE]
ou abrégé
c(1:10) [c(F,F,T)]


Pour les éléments impairs, il suffit de permuter T et F : c(1:nrow(table))[c(T,F)].

 
Dr. Trader:

F et T sont des abréviations pour les valeurs booléennes FALSE et TRUE. En principe, il importe peu d'écrire c(T,F) ou c(TRUE,FALSE), la première variante est simplement plus courte.

Si vous avez 10 lignes dans le tableau, alors c(1:nrow(table)) est juste le vecteur c(1,2,3,4,5,6,7,8,9,10).
Et les tableaux contenant des valeurs booléennes dans ce cas boucleront jusqu'à la longueur requise, vous obtenez c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE).

c'est-à-dire c(1:nrow(table))[c(F,T)] R comprendra que
c(1,2,3,4,5,6,7,8,9,10)[c(VRAI,FAUX,VRAI,FAUX,VRAI,FAUX]
et prend les éléments du vecteur qui correspondent à VRAI dans l'ordre.

Par exemple, si nous voulons prendre tous les trois éléments, nous pouvons l'écrire comme suit
c(1,2,3,4,5,6,7,8,9,10)[c(FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,TRUE,FALSE]
ou abrégé
c(1:10) [c(F,F,T)]


pour les éléments impairs, il suffit de permuter T et F : c(1:nrow(table))[c(T,F)].

Merci de ne pas prendre la peine d'écrire des descriptions aussi détaillées. En effet, beaucoup de choses deviennent claires. Je suis gêné de demander, mais je vais me décider. L'essence du problème est la suivante.....

Le fichier d'entraînement est constitué du même nombre de classes par cible. En d'autres termes, j'ai 24 uns et 24 zéros dans la cible. Encore une fois, je veux faire comme Reshetov.....

J'ai divisé la table de formation en deux tables, l'une contenant tous les vecteurs où la cible est 1 et l'autre où la cible est 0.

Je prends le tableau avec la cible 1 et ensuite je dois créer deux sous-tableaux, où les vecteurs numérotés pairs écrivent à Train1, et les impairs à Train2.

Nous le faisons d'abord pour les numéros pairs.

for(i in c(1:nrow(Qwe_true))[c(F,T)]){
  Train1[i,]<-Qwe_true[i,]
  }

Mais alors la table Train1 contiendra des lignes c NA, et il faut que Train1 ait été créé avec 12 lignes, parce que seulement 12 des 24 lignes sont paires. Je n'ai aucune idée de la façon de le faire. ....

 

S'il vous plaît.

Pour R, vous avez besoin d'un mode de pensée différent, vous devez exploiter mentalement les vecteurs, puis le code est assez simple à écrire. Les professionnels écrivent en une ligne ce que je ne comprends même pas, et moi-même j'écrirais des cycles en plusieurs lignes.

Train1 <- rbind(Qwe[which(Qwe[, "target"]==1)[c(T,F)], ], Qwe[which(Qwe[, "target"]==0)[c(T,F)], ])
Train2 <- rbind(Qwe[which(Qwe[, "target"]==1)[c(F,T)], ], Qwe[which(Qwe[, "target"]==0)[c(F,T)], ])

en étapes -
which(Qwe[, "target"]==1) - le nombre de lignes avec la cible 1
which(Qwe[, "target"]==1)[c(T,F)] - nombre de lignes avec target1, sautées par 1
Qwe[which(Qwe[, "target"]==1)[c(T,F)], ] - le tableau obtenu de Qwe, avec une cible 1 avec un espace dans 1
rbind(... , ...) - fusionne deux tables (avec cible 1 et avec cible 0)

 
Dr. Trader:

S'il vous plaît.

Pour R, vous avez besoin d'un mode de pensée différent, vous devez exploiter mentalement les vecteurs, puis le code est assez simple à écrire. Les professionnels écrivent en une ligne des choses que je ne comprends même pas, et moi-même j'écrirais des cycles de plusieurs lignes.

Train1 <- rbind(Qwe[which(Qwe[, "target"]==1)[c(T,F)], ], Qwe[which(Qwe[, "target"]==0)[c(T,F)], ])
Train2 <- rbind(Qwe[which(Qwe[, "target"]==1)[c(F,T)], ], Qwe[which(Qwe[, "target"]==0)[c(F,T)], ])

Tu n'es qu'un monstre. Deux lignes, c'est une charge en moins. Très bien, je vais continuer à travailler dessus... Merci !

 
Vendredi soir... ma tête ne se sent pas très bien. Que diriez-vous de tester la théorie ensemble.... Avec vos compétences en écriture R et mes capacités de résolution de problèmes (précision), nous aurions pu vérifier tout cela en une demi-heure ? A-t-on le temps ? Dr. Trader
 
Nan, continue d'apprendre. Je vous aiderai s'il y a des questions.
 

Deux autres échantillons doivent être ajoutés à ces deux-là.

MLP1=Train1+Test(Train2)

MPL2=Train2+Test(Train1)

Si nous additionnons Test(Train2)+Test(Train1), nous obtenons le résultat de toute la section de formation, et cette section sera un test, pour chacun des polynômes.

Peut-être prendre le temps, si ce n'est pas possible maintenant. Mais c'est une demi-heure et tu t'en es assuré. Je veux juste faire un miroir. Je vais prendre le même fichier et l'enseigner de deux façons. Puis on mettra tout ça sur le site de contrôle et on verra tout. Qu'est-ce que vous en dites ?

 

vous pouvez combiner les tableaux en utilisant la fonction rbind()
MLP1 <- rbind(Train1, Test)

Qu'est-ce que Test(Train2) ? Et pourquoi le tableau de formation et le tableau de test devraient-ils être combinés ? Le test doit être séparé, afin de tester le modèle entraîné sur celui-ci.

Tout ne se passera pas aussi facilement et rapidement que vous le souhaitez. En effet, dans le modèle de Reshetov, il suffit de fournir les données et le modèle se charge lui-même de trier les prédicteurs, de déterminer les poids, le nombre de neurones, etc. Mais vous ne pouvez pas le faire avec un neurone ordinaire, vous devez sélectionner les paramètres du neurone par validation croisée, par exemple comme dans l'exemple que j'ai écrit ici aujourd'hui, ou comme dans les articles de Vladimir Perervenko.


Regardez à nouveau ce que j'ai écrit là -https://www.mql5.com/ru/forum/86386/page753#comment_6821981
Il suffit de coller dans ce code vos données comme décrit et de l'exécuter. Si tous les prédicteurs sont pris un par un et ne sont pas filtrés, le résultat sera probablement trop mauvais dès la première fois. Après avoir exécuté le code, exécutez la commandemax(gaResult@fitness) en plus, cela montrera le score R2 du meilleur modèle trouvé par la génétique. Si l'estimation est proche de 1 ou inférieure, elle est bonne, si elle est proche de 0 ou même négative, elle est mauvaise.

Ensuite, dansPREDICTOR_COLUMNS, spécifiez le nombre exact de colonnes que vous avez identifiées comme bonnes, et exécutez à nouveau le code, le modèle sera entraîné sur ces prédicteurs uniquement. Idéalement, la meilleure évaluation du modèle par la génétique devrait être proche de 1 et la précision sur la table d'entraînement et de test devrait être de 1,00.

Le tableau de test doit être chronométré strictement après les données d'entraînement, comme si ce modèle était déjà en train de négocier sur le marché.

Si rien de bon ne se produit avec ce code (même avecKFOLDS=10) - alors il n'est pas bon. Si cela fonctionne, alors il y a une bonne alternative au modèle de Reshetov et nous pourrons continuer à travailler sur le code et exporter le modèle vers mql.

 

Ce que je veux dire, c'est que si vous faites quelque chose comme dans le modèle de Reshetov, que vous ajoutez quelque chose de plus, puis que vous prenez un neurone ordinaire et que vous le mélangez d'une manière ou d'une autre avec les étapes précédentes, et que vous attendez que tout fonctionne comme dans le modèle de Reshetov, cela s'avérera être un long processus futile, auquel je ne souscris absolument pas.

Si je veux le même résultat que celui de Reshetov, mais en R, alors je dois réécrire tout le code java du modèle en R.

Mais il existe de nombreuses alternatives. S'ils fonctionnent encore mieux que ceux de Reshetov, alors c'est parfait, vous n'avez besoin de rien d'autre, tout est prêt.