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

 

Le statut actuel de mon expérience.

Après avoir corrigé les erreurs dans le code, sur mes données, j'ai, en fait, les résultats suivants sur la validation.

Le graphique énumère les paires de devises, les horizons de prévision et les zones dites grises - des intervalles de valeurs à la sortie de la machine à prévoir, lorsqu'aucune décision d'entrer sur le marché n'est prise.

Comme vous pouvez le constater, j'ai déjà un MO positif pour un certain nombre de paires. Pour l'EURUSD, il s'agit de la macro. En même temps, je rends l'expérience encore plus précise, en utilisant les écarts réels pour toutes les paires (de mon DC) :

spreads <- as.data.frame(cbind(

c('audusd'

, 'eurusd'

, 'gbpusd'

, 'usdcad'

, 'usdchf')

, c(0.00018

, 0.0001

, 0.00014

, 0.00013

, 0.00012)

)

)

J'ai maintenant commencé une expérience de généralisation très puissante, dans laquelle encore plus de paramètres vont être vérifiés, et qui durera environ une semaine. Il y aura environ 60 fois plus d'estimations. Mais alors j'aurai certainement de bons résultats à comparer. Et, comme je l'ai promis quelque part, je vais poster l'Expert Advisor (formé) avec la logique de base prête à être testée. Vous pouvez le développer davantage. Je vais l'améliorer pour moi-même en ajoutant différents exhausteurs directement dans le code MQL.

A bientôt.

 
Alexey Burnakov:

Nan, vous ne comprenez certainement pas l'importance de la non-stationnarité. Peu importe qu'il s'agisse d'un modèle NS ou linéaire ou de mon modèle, si vos données sont non stationnaires, il est garanti que les dépendances trouvées sur celles-ci ne se produisent pas en dehors de l'échantillon. Toutes les données que vous avez sont des prix bruts, MA(prix brut), ouverture de barre(prix brut) etc. doivent être retirées du modèle. Vous devez prendre leur différence par rapport au dernier prix connu.

La mise à l'échelle de l'intervalle n'est pas possible ici.

Ce n'est pas si mal. Si vous considérez chaque exemple de formation séparément (c'est-à-dire si vous normalisez par une ligne du tableau de formation), vous pouvez normaliser toutes les données par groupes, séparément dans chaque exemple de formation. Par exemple, prenez les colonnes o,h,l,c pour l'ensemble des 100 barres (400 au total) d'un exemple d'entraînement, trouvez leur minimum et leur maximum, et analysez-les. Cette opération doit être répétée pour chaque exemple de formation séparément. Cette normalisation garantira que le prix dans le tableau d'apprentissage pour chaque ligne sera toujours compris dans l'intervalle [0...1]. Si, à l'avenir, nous obtenons un nouvel exemple dont le prix a largement dépassé les prix enregistrés pendant la formation, la normalisation le ramènera dans la plage [0..1] et il ne s'agira pas d'une nouvelle région de données inconnue pour le réseau neuronal. Le modèle entraîné peut très bien trouver et reconnaître certaines règles comme "le prix a été supérieur à 0,8 au moins une fois au cours des N dernières barres" et cette règle sera appliquée à toute nouvelle donnée, même si le prix a baissé de moitié.

Si nous normalisons chaque colonne séparément, comme nous le faisons habituellement, les résultats du modèle dans le fronttest seront moins bons. Les dépendances entre les prédicteurs de même type dans un exemple d'apprentissage sont perdues. (par exemple Open[1], Open[2], Open[3]... du même exemple d'entraînement seront scannés à des intervalles différents, selon tous les exemples d'entraînement). En outre, il y a un autre problème - pendant la formation, nous ferons la normalisation sur la base de milliers d'exemples de formation, alors que dans le commerce réel, nous n'aurons qu'une seule ligne qui doit être mise à l'échelle en ondes avec elle-même, ce qui n'est pas clair et étrange.

Si vous ne faites aucune normalisation, vous pouvez vous en sortir. Mais si le prix baisse/augmente au-delà de l'intervalle disponible pour la formation, il s'agira d'une nouvelle région de données absolument inconnue pour le modèle. Il ne pourra pas le retirer et s'écrasera.

Tout ceci est strictement pour le réseau neuronal, d'après l'expérience.

 

J'ai travaillé un peu plus sur l'échelle y pca. J'ai trouvé un bon article avec des formules de dispersionhttp://www.chemometrics.ru/materials/textbooks/pca.htm, j' en ai fait une en R.

Code de base du même articlehttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/
Nous devons exécuter le code"princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" et arrêter. suivant :

extractProjection <- function(ndim,princ) {
  return(princ$rotation[,1:ndim]) #Эта функция уже была определена ранее, но в этот раз нельзя менять знаки в матрицах как раньше
}
countOfComponentsToUse <- ncol(princ$x) # сюда можно в цикле подставлять числа от 2 до ncol(princ$x), увеличивая число компонент до необходимой точности
PCnameList <- colnames(princ$x)[1:countOfComponentsToUse]
proj <- extractProjection(countOfComponentsToUse, princ)
residualsMatrix <- dmTrain - ((princ$x[,1:countOfComponentsToUse]) %*% (t(proj)))
V0 <- sum(residualsMatrix*residualsMatrix)/nrow(dmTrain)
TRV <- V0/ncol(dmTrain)                           #полная дисперсия остатков (средний квадрат ошибок)
ERV <- 1-nrow(dmTrain)*V0/sum(dmTrain*dmTrain)    #объяснённая дисперсия остатков, нужно увеличивать число компонент если ERV < 0.95

L'essentiel est à peu près ceci : l'objet princ contient une matrice de facturation (princ$x) et une matrice de charge (princ$rotation). Si nous multiplions ces deux matrices princ$x %*% t(princ$rotation), nous récupérons le tableau original avec les données dmTrain (mises à l'échelle par Y, pas de variable cible).

Il est possible de limiter le nombre de composantes principales, et les données originales seront alors déterminées avec une certaine marge d'erreur. Si vous vous souvenez d'un internet lent et d'images jpeg spéciales qui s'affinent lorsque vous les chargez, vous obtenez une chose similaire, un plus grand nombre de composantes principales donnera un ajustement exact aux données initiales.

Pour le nombre de composantes N, les données initiales sont définies comme suit : princ$x[,1:N] %*% t(princ$rotation[,1:N]). L'erreur peut être calculée en soustrayant la matrice résultante de dmTrain, vous obtenez la residualsMatrix. Il s'agit des erreurs, de combien les données réelles diffèrent des données trouvées. TRV est la moyenne des carrés d'erreur. ERV est quelque chose comme l'erreur moyenne. Si ERV=0.8, les données sources diffèrent des données trouvées de ~20% dans chaque cellule du tableau. En d'autres termes, si vous avez trouvé le chiffre 10, les données d'origine allaient probablement de 8 à 12. Il s'agit d'une définition très approximative, mais elle est plus logique. Et la VRE doit être d'au moins 0,95 pour que le modèle ACP contienne suffisamment de composantes.

Qu'est-ce que tu en retires ? Vous pouvez ajouter un nouveau paramètre tol à princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE, tol=0.01), ainsi vous ne générerez pas des milliers de composantes principales et la génération s'arrêtera lorsque sdev de la nouvelle composante sera < sdev(PC1) * tol. Ensuite, le nombre de composants utilisés peut être ajusté avec la fonction ci-dessus, en commençant par 2 et en augmentant progressivement de 1.

J'ai essayé de trouver comment l'appliquer pour trier les prédicteurs, mais rien ne me vient encore à l'esprit. Vous pouvez par exemple remplacer load par 0 pour un prédicteur dans princ$rotation, recalculer ERV et voir à quel point le résultat sera moins bon. Cependant, je ne vois pas le sens de cette action, il n'est pas clair comment appliquer ce résultat. Peut-être pouvons-nous ainsi trouver des prédicteurs corrélés qui n'apportent aucune nouvelle information et dont l'élimination n'aggravera probablement pas le résultat. J'aimerais trouver des prédicteurs de bruit, mais dans ces matrices, il n'y a aucun lien avec les variables cibles, c'est-à-dire qu'il n'y a aucun critère pour déterminer ce qui est du bruit et ce qui n'en est pas.

 
Dr. Trader:

J'ai travaillé un peu plus sur l'échelle y pca. J'ai trouvé un bon article avec des formules de dispersionhttp://www.chemometrics.ru/materials/textbooks/pca.htm, j' ai fait ça en R.

Code de base du même articlehttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

J'ai relu l'article. Il semble que vous n'essayez pas de répéter l'exemple de l'article, juste point par point, en le remplaçant par vos données. Ou ai-je manqué quelque chose ? Si non, pourquoi ?
 

J'ai répété l'exemple. Je les ai remplacées par mes propres données, j'ai obtenu plus de 100 composantes principales pour une variance de 0,95. J'ai regardé les graphiques d'enregistrement, je n'ai pas vu de bons prédicteurs qui ressortent. Par exemple, alors que l'auteur voit sur ses données qu'il peut conserver 2 composantes principales et 5 prédicteurs, je vois sur mes données plus de 100 composantes et plus de 1000 prédicteurs (les lowadings diminuant pas à pas, on ne sait même pas quelle est la valeur seuil pour l'élimination des lowadings).

Je dois cependant donner du crédit à Y-Aware PCA, j'ai juste substitué mes données sans présélection, construit un modèle Y-Aware PCA dessus, et obtenu une erreur de 45% dans le fronttest. Ce n'est pas encore rentable pour le forex, mais l'article s'arrête là, donc si je dois utiliser y-aware pca, je dois trouver autre chose.

D'autres moyens me permettent de ne laisser qu'une douzaine de prédicteurs, de former nnet et d'obtenir une erreur frontale de seulement 30%. J'aimerais obtenir un résultat similaire avec y-aware pca.
 
Dr. Trader:

J'ai répété l'exemple. Je les ai remplacées par mes propres données, j'ai obtenu plus de 100 composantes principales pour une variance de 0,95. J'ai regardé les graphiques d'enregistrement, je n'ai pas vu de bons prédicteurs qui ressortent. Par exemple, alors que l'auteur voit sur ses données qu'il peut conserver 2 composantes principales et 5 prédicteurs, je vois sur mes données plus de 100 composantes et plus de 1000 prédicteurs (les lowadings diminuant pas à pas, on ne sait même pas quelle est la valeur seuil pour l'élimination des lowadings).

Je dois cependant donner du crédit à Y-Aware PCA, j'ai juste substitué mes données sans présélection, construit un modèle Y-Aware PCA sur celles-ci, et obtenu une erreur de 45% dans le fronttest. Pour le forex ce n'est pas encore rentable, mais l'article s'arrête là, donc si j'utilise y-aware pca alors je dois trouver autre chose.

D'autres moyens me permettent de ne laisser qu'une douzaine de prédicteurs, de former nnet et d'obtenir une erreur frontale de seulement 30%. J'aimerais obtenir un résultat similaire avec y-aware pca.
Je pense qu'il faut le répéter lettre par lettre. Il y a des paquets utilisés sauf pca, que je n'ai pas vu chez vous.
 

https://c.mql5.com/3/97/Principal_Components_Regression__1.zip

Voici le code R de l'article, les fichiers _03.txt et _04.txt, j'ai déjà exécuté tout cela sur mes données. J'ai même ajouté une vérification des données du test frontal dans _04.txt. La seule différence que je vois est le paquet d'etal offert à la fin de l'article. Mais il n'y a même pas d'exemples, ils suggèrent juste d'essayer et de comparer le résultat avec ce que fait vtreat prune.

 
Dr. Trader:

https://c.mql5.com/3/97/Principal_Components_Regression__1.zip

Voici le code R de l'article, les fichiers _03.txt et _04.txt, j'ai déjà exécuté tout cela sur mes données. J'ai même ajouté une vérification des données du test frontal dans _04.txt. La seule différence que je vois est le paquet d'etal offert à la fin de l'article. Mais il n'y a même pas d'exemples, juste une offre pour essayer et comparer le résultat avec ce que fait vtreat prune.

Il semble assez solide.

Donc, aucun résultat utile ?

 

Mon article sur la sélection des caractéristiques.

https://habrahabr.ru/company/aligntechnology/blog/303750/

Методические заметки об отборе информативных признаков (feature selection)
Методические заметки об отборе информативных признаков (feature selection)
  • habrahabr.ru
Всем привет! Меня зовут Алексей. Я Data Scientist в компании Align Technology. В этом материале я расскажу вам о подходах к feature selection, которые мы практикуем в ходе экспериментов по анализу данных. В нашей компании статистики и инженеры machine learning анализируют большие объемы клинической информации, связанные с лечением пациентов...
 

Bonjour !

J'ai une idée, je veux la vérifier, mais je ne connais pas l'outil pour la mettre en oeuvre... J'ai besoin d'un algorithme qui serait capable de prédire pour quelques points d'avance, disons pour 3 ou 5 (de préférence un réseau neuronal).

Je n'ai travaillé qu'avec des classifications, donc je ne comprends même pas à quoi cela devrait ressembler, je ne peux pas conseiller quelqu'un sur la façon de le faire ou recommander un paquet en R.

p.s. Excellent article Alexey