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

 

La dimensionnalité du tableau X

> dim(X1)
[1] 7000    8
X <- array( c(X1,X2), dim=c(7000, 8, 2) )

Dans votre cas, ce serait

X <- array( c(X1,...X100), dim=c(7000, 8, 100) )
#или, что равнозначно
X <- array( c(X1,...X100), dim=c(dim(X1), 100) )

Naturellement, si le nombre d'exemples est de 7000 et la longueur de conversion = 8.

 

Ce paquet "rnn" est plus un exercice de programmation qu'un produit à utiliser. Voir le paquet "RSNNS" à la place.

Il existe des réseaux récurrents. Eh bien, plus en profondeur, PyBrain, keras dans Ruthon

Bonne chance

 
Merci ! Je vais m'en occuper.
 

J'ai des problèmes étranges avec la validation croisée du modèle formé. Ou plutôt, il s'avère qu'il y a toujours eu des problèmes, je ne l'avais juste pas remarqué.

Mes actions sont en gros les suivantes : Il existe différents indicateurs pour l'eurusd pour l'année. Je divise les données de façon aléatoire par rangées dans un rapport de 70%/15%/15% pour la formation/validation/validation.

De plus, ces données contiennent 9000 prédicteurs. Je recherche génétiquement leurs variantes, j'entraîne un modèle PCA basé sur chaque sous-ensemble de prédicteurs. J'entraîne le modèle sur un échantillon d'entraînement, je détermine l'erreur. Testez le même modèle sur les deux échantillons de validation, déterminez l'erreur sur ceux-ci.

Je calcule le résultat final d'une fonction de fitness de la manière suivante :
max(erreur_train,erreur_validate1,erreur_validate2) - min(erreur_train,erreur_validate1,erreur_validate2)
L'idée est que la différence entre les erreurs minimales et maximales doit être aussi faible que possible (le "critère de Fomenko" :) ).

Tout semble bien se passer, le modèle atteint une erreur d'environ 25% sur les trois échantillons. Mais, sur le fronttest, l'erreur passe soudainement à 40%. J'ai réfléchi un peu, j'ai changé random.seed pour générer des échantillons de chaînes (pas de prédicteurs, juste des chaînes), et pour un ensemble de prédicteurs défini précédemment (le meilleur), j'ai obtenu une erreur de formation/validation/validation de 25%/35%/35% au lieu de 25%/25%/25%, et à nouveau les mêmes 40% pour le fronttest. L'erreur sur les échantillons de validation a augmenté de +10%, très mauvais.

Il s'avère donc que la génétique trouve la meilleure version des prédicteurs pour une formation particulière et des échantillons de validation spécifiques. Si nous répartissons les rangées sur les échantillons dans un ordre différent, le modèle prédictif entraîné ne fonctionne plus correctement avec les mêmes prédicteurs.

Existe-t-il des méthodes standard pour traiter ce problème de manière à ce que le modèle entraîné donne approximativement les mêmes erreurs pour toute distribution de rangées sur les échantillons ? Il s'agit d'un problème grave. Je peux, par exemple, générer à nouveau des échantillons de formation et de validation à chaque génération de génétique. Vous pouvez aussi créer deux ensembles différents d'échantillons de rangées, former deux modèles ACP sur ces échantillons et prendre le plus mauvais résultat comme fonction d'adaptation. Est-ce que cela a un sens ?

 
Dr. Trader:

J'ai des problèmes étranges avec la validation croisée du modèle formé. Plus précisément, il s'avère qu'il y a toujours eu des problèmes, je ne l'ai juste pas remarqué.

(ce que l'on appelle le "critère Fomenko" :) ).

J'ai beaucoup aimé ce critère. Merci.

Mais ce n'est pas tout à fait ce que vous avez dit.

Mon critère DOIT inclure le fronttest. Si vous regardez tous mes posts, j'ai toujours écrit exactement sur le fronttest, sous lequel, selon ma compréhension, il devrait être mené sur un morceau d'observations, qui sont séparées par le temps (par l'indice) des trois premiers ensembles.

J'ai rencontré cela dans le hochet, qui divise l'ensemble fourni comme vous l'avez fait. Vous obtenez de bonnes données, j'ai obtenu moins de 10% sur les trois échantillons, et puis vous prenez un nouveau fichier et votre erreur de 40% est encore un bon résultat ! J'ai connu pire.

Donc mon critère pour le surentraînement est :

1. nous divisons l'ensemble original en deux parties, SANS aucune astuce aléatoire, de façon purement mécanique, dans l'ordre croissant des indices

2. Nous divisons la première partie par n'importe quelle méthode aléatoire en trois parties : apprentissage, test et validation.

3. si sur ces trois parties l'erreur est approximativement égale, passez à l'étape 4

4. Exécutez le modèle formé sur la deuxième partie. L'erreur devrait à nouveau être approximativement égale. C'est fondamental, car lorsque l'on négocie, on négocie toujours en dehors de l'échantillon d'entraînement et on obtient systématiquement (et non de manière aléatoire) des résultats barre après barre.

Si nous obtenons approximativement la même erreur sur les 4 points, le modèle n'est pas réentraîné.

En cas de divergences importantes, le modèle est réentraîné. Je n'ai pas trouvé d'outils dans R pour se débarrasser du bruit. J'en ai un moi-même, voici un autre article sur le PCA.

 
mytarmailS:

Anton Zverev

N'ayons pas ce genre de conversation, les gens qui apprennent et partagent leurs expériences ici sont prêts à s'entraider, alors que vous prenez la position que vous êtes stupide et que je sais tout). Vous feriez mieux de m'aider à comprendre ce que vous pensez et ce que vous savez être juste.

Je suis d'accord avec vous pour dire qu'il ne suffit pas de donner le BP, il faut comprimer l'information et écarter les éléments inutiles qui empêchent une bonne décision, idéalement en ramenant à 0 ou 1 ces achats/ventes, c'est à direSi nous avons 10 indicateurs (auxquels je ne crois pas) et que nous en avons filtré 9, ne laissant que le RSI, cela ne sera pas suffisant car l'indicateur a une plage et il s'avère qu'il ne fonctionne pas avec des valeurs de -70 à 70, nous devons donc les compresser et ainsi de suite.. la question est de savoir comment le faire.

J'y ai pensé, mais je n'ai pas encore assez de connaissances pour mettre en place un tel sélecteur...

Mon premier essai était il y a longtemps, j'ai fait une boucle en arrière à partir du prix actuel et j'ai cherché une situation presque identique dans le passé, puis ces situations ont été triées par le résultat, comment ils ont fini, par exemple, j'avais une situation actuelle, pour elle a été trouvé 10 analogues dans le passé 8 analogues se sont terminés par une augmentation de prix, 2 se sont terminés par une baisse, donc il va se développer .... Mais l'horreur )) est que cela s'est avéré être le contraire, le prix a très souvent et fortement chuté dans ces situations avec un fort biais vers l'achat, et ensuite souvent re-testé tick par tick....

Ensuite, j'ai créé une sorte d'indicateur, j'ai pris la somme cumulée de tous les prix d'achat et également la somme des bénéfices, j'ai construit leur différence et j'ai obtenu un certain indice, lorsque je l'ai comparé au prix, il s'est avéré être opposé au prix, la corrélation était de -0,7 à -0,9, donc, pour parler simplement, le marché va à l'encontre de ses propres statistiques, c 'est quelque chose à penser et à reconsidérer.

auDr. Trader

Peut-être que cela vous aidera à comprendre un peu ......

J'ai trouvé un moyen plus rapide et plus facile de voir cet effet, si c'est intéressant je peux écrire plus sur ce sujet.

 
SanSanych Fomenko:

4. Exécutez le modèle formé sur la deuxième partie. L'erreur devrait à nouveau être approximativement égale. C'est fondamental car, lors des opérations de trading, nous effectuons toujours des transactions en dehors de l'échantillon d'entraînement et obtenons systématiquement (et non de manière aléatoire) des résultats barre après barre.

Je l'ai, merci. Il s'avère qu'il n'y a pas 2 mais 3 échantillons de validation - l'un d'entre eux est pris strictement à partir des dernières entrées du fichier source sans caractère aléatoire. Les autres échantillons sont aléatoires. Je vais essayer.

J'ai essayé une fois de prendre la première partie du fichier de formation pour la validation, aussi strictement par les index, aussi sans aléatoire. L'idée était que si le modèle formé montre une petite erreur sur les données de la période de pré-formation, il montrera la même erreur sur les données de la période de post-formation. Il s'est avéré que c'était faux, les erreurs avant la période de formation et après la période de formation n'étaient pas du tout corrélées.

mytarmailS:

J'ai ensuite mis en place un tel indicateur, j'ai pris la somme cumulée de toutes les prévisions d'achat et de vente, j'ai calculé leur différence et j'ai obtenu un indice, et lorsque je l'ai comparé au prix, il s'est avéré presque opposé au prix, la corrélation était de -0,7 à -0,9, pour dire simplement que le marché évolue contre ses propres statistiques, c'est quelque chose à penser et à reconsidérer.

Cette méthode fonctionne-t-elle toujours pour vous, à n'importe quel intervalle de temps ? Bien sûr, cela semble étrange, mais l'essentiel est que cela fonctionne. J'ai eu des observations similaires avec mon modèle non formé. Parfois, il donnait des résultats prédits qui étaient strictement opposés aux résultats réels. Mais parfois, cela fonctionnait encore correctement. Au cours d'un test très long, en entraînant le modèle et en le vérifiant sur différents intervalles de temps, j'ai compris qu'en moyenne, il était correct environ 50 % du temps, il était donc inutile, vous pourriez tirer à pile ou face pour prédire et obtenir le même résultat. Après cela, j'ai vérifié et compris correctement que le modèle devait donner le bon résultat sans aucune inversion, filtrage, solutions collectives de nombreux autres modèles. Sinon, je risque d'être piégé dans le chaos et le hasard.

 
Dr. Trader:

Cette méthode fonctionne-t-elle toujours pour vous, quelle que soit la période ? C'est étrange, bien sûr, mais l'essentiel est que ça fonctionne. J'ai eu des observations similaires avec mon modèle non formé. Parfois, il donnait des résultats prédits qui étaient strictement opposés aux résultats réels. Mais parfois, cela fonctionnait encore correctement. Après un très long test, lorsque j'ai entraîné le modèle et que je l'ai vérifié sur différents intervalles de temps, j'ai compris qu'en moyenne il était correct environ 50 % du temps, ce qui ne servait à rien, on pouvait tirer à pile ou face pour prédire et obtenir le même résultat. Après cela, j'ai vérifié et compris correctement que le modèle devait donner le bon résultat sans aucune inversion, filtrage, solutions collectives de nombreux autres modèles. Sinon, vous risquez de tomber dans un piège où règnent le chaos et le hasard.

Oui, toujours et à tout moment (mais il y a des nuances avec l'échantillonnage), la sortie est presque une copie exacte du prix, mais inversement corrélée. Grâce à cette méthode, vous pouvez voir comment un neuronet est formé et ce que vous pouvez en attendre, vous pouvez tirer plusieurs conclusions

1) c'est la situation la plus typique - si un réseau est inversement corrélé, cela signifie qu'il est formé, sinon il n'y aurait pas de corrélation inverse, non ?

2) c'est juste aléatoire - cela signifie que le réseau n'a rien appris.

3) Un filet fonctionne en même temps que le marché (j'ai réussi à obtenir cet effet uniquement sur une cible non standard) - cela signifie que tout va bien.

4) Et la conclusion la plus importante (c'est important pour toi, D. Trader) si tu construis tes prévisions de réseau et qu'elles vont aller dans la direction opposée à celle de la conclusion 1, aucune optimisation, génétique, validation croisée et autres breloques ne t'aideront absolument pas - réfléchis-y, c'est logique et évident.

 
mytarmailS:

1) C'est la situation la plus typique - si le réseau est inversement corrélé, cela signifie qu'il est entraîné, sinon il n'y aurait pas de corrélation inverse, non ?

4) Et la conclusion la plus importante (c'est important pour toi D. Trader) si tu fais tes prévisions par réseau neuronal et qu'elles vont aller dans la direction opposée à celle de la conclusion 1, aucune optimisation, génétique, validation croisée et autres charmes ne t'aideront en absolument RIEN, réfléchis-y, c'est logique et évident.

1) La corrélation inverse stable à différents intervalles de formation est un peu étrange, mais le réseau a appris quelque chose, je suis d'accord que le résultat est bon.

4) Je ne suis pas d'accord avec celui-ci. Si l'on utilise une classification binaire (variable cible "0" ou "1"), la fonction de fitness du généticien ou de l'optimiseur peut facilement être modifiée pour obtenir un résultat "inverse", il suffit de soustraire le résultat actuel de 1.
Par exemple, la génétique capte un certain ensemble de prédicteurs. J'entraîne les neurones sur ceux-ci, j'effectue une validation croisée et je trouve l'erreur moyenne. Je reçois une erreur de disons 0.4. Le résultat "inverse" de la fonction de fitness peut être défini comme suit : 1-0,4 = 0,6. La génétique va essayer de réduire l'erreur de 0,6 à zéro. Il en résultera un ensemble de prédicteurs avec une valeur de fonction de fitness de 0. Mais cela signifie que l'erreur réelle du réseau neuronal était de 0+1 = 1. Autrement dit, le neuronka obtenu est faux dans 100% des cas, et c'est la corrélation inverse.
En général, vous pouvez utiliser le même algorithme génétique et la validation croisée pour entraîner un neurone qui donnera un résultat opposé à celui souhaité, vous obtiendrez le même résultat que vous, mais à dessein. Mais on ne sait pas très bien dans quel but. :)

J'ajouterais également qu'en classification binaire avec des variables cibles "0" et "1", la pire erreur est de 0,5.
Erreur == 0 est bon.
Error == 1 est votre neurone de corrélation inverse, vous pouvez simplement inverser le résultat et tout ira bien. Mais il faut savoir pourquoi, c'est une situation très atypique.
Une erreur de 0,5 signifie que le résultat est complètement aléatoire et que le modèle ne sert à rien.

 

1

Raison: