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

 
mytarmailS:

1) Oui, vous avez peut-être raison, mais ce filet est capable d'apprendre à prendre des décisions, ce n'est pas la classification habituelle sans professeur, et donc vous pouvez y implémenter le concept dont je parle depuis longtemps - vous pouvez lui enseigner non pas l'objectif standard sous forme d'achat-sel-achat ou 0001110101011, mais de manière plus abstraite, comme une simple condition du genre : "Net ! Je ne me soucie pas de la façon dont vous tradez, mais je veux que votre profit soit au moins de 1% de 0,5% de drawdown par jour, et il cherchera les règles et les combinaisons pour résoudre ce problème. Si je me trompe et que je dis des bêtises ici, veuillez me corriger pour mon propre bien).

C'est vrai, je n'ai pas pensé à ça, c'est vrai. Il est alors préférable de conditionner le réseau neuronal pour maximiser le ratio de sharpe (ou facteur de récupération), et de réaliser dans R quelque chose comme un simple testeur de forex sur des cotations réelles pour tester le modèle afin d'évaluer l'évolution. Mais un miracle ne se produira pas tout seul, le problème du réentraînement subsistera, les données doivent encore être divisées en échantillons d'entraînement et de test, et des validations croisées doivent être effectuées pour l'estimation finale du modèle au cours de son évolution. Comment travailler avec le ratio de sharpe lors de la validation croisée Je n'ai pas pu réfléchir rapidement, à mon avis il ne sera pas possible de supprimer les barres aléatoires dans l'échantillon de test, parce que ce n'est pas la précision sur chaque barre qui est importante, mais la transaction continue elle-même, avec tous les drawdowns, spreads et commissions pour chaque nouvelle transaction.

Alexey Burnakov:

Ils semblent préparer un paquet pour R. Nous devrions en prendre note.

J'ai déjà le paquet, mais je ne sais pas combien de pourcent il est prêt, pour l'instant sur githab. Voici un exemple plus simple, dans la continuité de l'article. Ils apprennent au réseau à extraire la racine.

http://gekkoquant.com/2016/07/17/rneat-square-root-neural-net-trained-using-augmenting-topologies-simple-example/

Je l'ai terminé plus tard :

J'ai fait une classification des iris, code en annexe par exemple (le modèle a échoué à la classification, j'ai remplacé toutes les classes par des chiffres pour la régression, et j'ai arrondi les résultats au niveau numérique le plus proche. Cela aurait probablement pu être fait de manière plus simple).
J'ai pris seulement 50% des données pour l'entraînement, sur la validation le succès était de 95%, assez bon. A en juger par le graphique, le modèle a même éliminé le premier prédicteur par lui-même.

Le Forex est plus compliqué que l'Iris :) le résultat sera bien pire là-bas.

J'ai également remarqué que les parties 3 et 4 de l'article utilisent des fonctions différentes pour entraîner le modèle.
La partie 3 consiste à simuler tout processus dynamique. Par exemple, le modèle peut observer le graphique du marché des changes et ouvrir/fermer des transactions en temps réel.
La quatrième partie consiste simplement à entraîner le modèle en utilisant des exemples prêts à l'emploi et à prédire le résultat.

Dossiers :
 
Dr. Trader:

1) Exact, je n'y avais pas pensé, c'est vrai. Dans ce cas, il est préférable de donner au réseau neuronal une condition pour maximiser le ratio de sharpe (ou facteur de récupération), et de faire dans R quelque chose comme un simple testeur de forex sur des cotations réelles.

2) J'ai également remarqué que les parties 3 et 4 de l'article utilisent des fonctions différentes pour entraîner le modèle.
La troisième partie consiste à simuler certains processus dynamiques, par exemple le modèle peut observer le graphique du marché des changes et ouvrir/fermer des transactions en temps réel.
La quatrième partie consiste simplement à entraîner un modèle sur des exemples prêts à l'emploi et à prédire le résultat.

1) Tout à fait exact ! C'est exactement ce que je voulais dire, profit/perte juste pour l'exemple, je pensais prendre le facteur de récupération, mais le sharpe n'est pas pire.

2) Vous avez raison, dans le 4ème article l'auteur a déjà fait quelque chose comme un paquet, par tous les standards "R", c'est maximum on a un modèle - un vecteur cible - la prédiction par "predict" - mais cette approche ne fonctionnera pas pour nous, parce que toutes les fonctions sont déjà cachées dans le paquet.... Nous devons comprendre le code source et tout écrire par nous-mêmes, c'est pourquoi j'ai dit aider à comprendre car tout ici est beaucoup plus compliqué qu'avec le "paquet prêt à l'emploi avec des exemples à la clé" Je pense que même les fonctions de la partie 3 ne seront pas suffisantes pour ce dont nous avons besoin. Ce serait donc fabuleux si nous nous mettions tous d'accord.

 
mytarmailS:

1) Tout à fait exact ! C'est exactement ce que je voulais dire, les profits/pertes ne sont qu'un exemple, je pensais prendre le facteur de récupération, mais la sharpe est fondamentalement aussi bonne que possible.

2) Vous avez raison, dans le 4ème article, l'auteur a déjà créé quelque chose comme un paquet, par tous les standards "R", c'est juste un modèle - un vecteur cible - prédiction par "predict" - mais cette approche ne fonctionnera pas pour nous, parce que toutes les fonctions sont déjà cachées dans le paquet... Nous devons comprendre le code source et tout écrire par nous-mêmes, c'est pourquoi j'ai dit aider à comprendre car tout ici est beaucoup plus compliqué qu'avec le "paquet prêt à l'emploi avec des exemples" Je pense que même les fonctions de la partie 3 ne seront pas suffisantes pour ce dont nous avons besoin. Ce serait donc fabuleux si nous nous impliquions tous.

Qui vous enseignera, sinon vous-mêmes ? Mettez la main sur le code source. Étudiez-le. Et aussi sur la différentiabilité de la fonction. Vous devez alimenter le réseau avec des fonctions régulières. Et vous nous le direz - et nous vous donnerons nos conseils.
 
Alexey Burnakov:
Vous devez alimenter le réseau avec des fonctions régulières. Et vous nous direz), et nous vous donnerons nos conseils.

Pardonnez-moi de m'immiscer, mais pas seulement lisse, mais aussi normalisé.

Pour que la NS ne sorte jamais de ses zones connues.

Quelque chose comme ça.

 

Je n'arrive pas à comprendre pourquoi on s'en prend à ces filets ?

Après tout, ils sont allés au-delà des emballages ringards jusqu'à l'immensité de la R ! Mais non, les vieux péchés continuent de traîner et de traîner...

Prenons l'exemple de Caret. On y trouve non seulement cent cinquante modèles, mais aussi une foule de fonctions utiles de prétraitement, de prédiction ...

Alors non, filets et filets...

 
SanSanych Fomenko:

Je n'arrive pas à comprendre pourquoi on s'en prend à ces filets ?

Après tout, ils sont allés au-delà des emballages ringards jusqu'à l'immensité de la R ! Mais non, les vieux péchés continuent de traîner et de traîner...

Prenons l'exemple de Caret. Non seulement il y a cent cinquante modèles, mais aussi un tas de fonctions utiles de prétraitement, de prédiction...

Alors non, filets et filets...

Alors, montrez-nous votre caret et ses cent cinquante modèles en action ! :)

 
Vadim Shishkin:

Alors montrez-nous bientôt votre caret et ses cent cinquante modèles en action ! :)

A propos, j'utilise moi-même Caret et j'obtiens des résultats satisfaisants sur le marché des changes.

J'utilise moi-même Caret et j'obtiens des résultats satisfaisants sur le marché des changes :

####
##########
############## start experiment
##########
####

library(caret)
library(gbm)
library(doParallel)

        
# tuning GBM - перебор параметров обучения по сетке
gbmGrid <- expand.grid(interaction.depth = seq(from = 3, to = 9, by = 2)
                  , n.trees = seq(from = 600, to = 1200, by = 300)
                  , shrinkage = seq(from = 0.01, to = 0.02, by = 0.005)
                  , n.minobsinnode = seq(from = 30, to = 60, by = 30))

######################
# start training cycle - ввод основных переменных и массива для результатов

validating_arr <- data.frame()
max_best_models <- 1
counter <- 1
max_inputs <- 15
max_cv_folds <- 5
max_bag_fract <- 1
distributions <- c('gaussian', 'laplace')
start <- Sys.time()
        
for (best_inp_num in seq(from = 3, to = max_inputs, by = 3)){
        
        for (cv_folds in 2:max_cv_folds){
                
                for (bag_frac in seq(from = 0.2, to = max_bag_fract, by = 0.2)){

#########################
# prepare training scheme - параметры caret
                                        gbmControl <- trainControl(method = 'cv'
                                                                      , number = cv_folds
                                                                      , verboseIter = F
                                                                      , returnData = F
                                                                      , returnResamp = 'all'
                                                                      , savePredictions = 'none'
                                                                      , summaryFunction = mymetrics
                                                                      , search = 'grid'
                                                                      , allowParallel = T)

########################
# initiate paralleling
                        cores <- 4 #detectCores()
                        cl <- makePSOCKcluster(cores)
                        registerDoParallel(cl)
                        
                        # train the model - обучение моделей с кроссвалидацией. Используется GBM.
                        best_models <- train(training[, ncol(training)] ~.
                                                , data = training[, 1:(ncol(training) - 1)]
                                                , method = 'gbm'
                                                , distribution = distributions[2]
                                                , bag.fraction = bag_frac
                                                , metric = 'mae_improve'
                                                , maximize = T
                                                , trControl = gbmControl
                                                , tuneGrid = gbmGrid)
                        
                        # stop paralleling
                        stopCluster(cl)
                        
                        # summarize the model - сохранение n лучших моделей
                        best_models_arr <- as.data.frame(cbind(best_models[[4]][1]
                                                                    , best_models[[4]][2]
                                                                    , best_models[[4]][3]
                                                                    , best_models[[4]][4]
                                                                    , best_models[[4]][5]
                                                                    , best_models[[4]][6]
                                                                    , best_models[[4]][7]
                                                                    , best_models[[4]][8]))
                        
                        rm(best_models)
                        
                        best_models_arr_ordered <- best_models_arr[order(best_models_arr$mae_improve, decreasing = T), ]

# далее - обучение лучших моделей и их валидация


 
Merci. :)
 
SanSanych Fomenko:

Je n'arrive pas à comprendre pourquoi on s'en prend à ces filets ?

Après tout, ils sont allés au-delà des paquets ringards jusqu'à l'immensité de la R ! Mais non, les vieux péchés continuent de traîner et de traîner...

Prenons l'exemple de Caret. Non seulement il y a cent cinquante modèles, mais aussi un tas de fonctions utiles de prétraitement, de prédiction...

Donc, non, filets et filets...

En général, une bibliothèque peut soit faire beaucoup mais moyennement, soit une seule chose de bonne qualité. Caret est le premier cas, il est facile de tester des dizaines de modèles et de comparer les résultats, mais il est difficile d'améliorer quelque chose pour votre tâche. J'ai rencontré d'énormes difficultés lors de la sélection des prédicteurs selon mes règles - caret peut faire du recuit simulé pour les énumérer (et la génétique), mais ne peut pas simplement prendre ma fonction de fitness pour l'estimation. Je dois créer un nouveau modèle pour caret avec des fonctions d'entraînement, de validation et de fitness ; mais caret continuera à contrôler les échantillons de données d'entraînement et de test par ses propres règles, avec ses propres validations croisées.
Il est plus facile pour moi de prendre le paquet GA ou GenSA pour énumérer les prédicteurs, et d'écrire une seule fonction de fitness, qui créera à la fois le modèle et la validation croisée selon les règles dont j'ai besoin.

Neuronka n'est pas pire que la forêt, mes résultats avec lui sont en plus, ou dans le pire des cas juste sans perdre de dépôt. En raison des différents algorithmes, neuronka préférera des prédicteurs différents de ceux de la forêt, mais toutes les règles de sélection des prédicteurs sont complètement les mêmes que pour la forêt.

Transférer le neurone à mt5 EA est une question de quelques minutes (sauvegarder les poids de R en csv, les lire dans l'EA). Transférer la forêt à mt5 sera beaucoup plus difficile, c'est pourquoi je préfère neuronka.

 

J'ai expérimenté un peu plus avec RNeat et je suis arrivé à la conclusion qu'il ne peut pas être traité de la même manière que les réseaux neuronaux classiques.

1) Contrairement aux modèles classiques, la formation RNeat n'utilise pas de données d'entrée. Le modèle est en quelque sorte généré de manière aléatoire, amélioré, et seulement à la fin est testé sur des données brutes. En général, les modèles utilisent des données brutes, construisent leur logique sur celles-ci, puis utilisent un échantillonnage de validation pour voir si la logique du modèle est correcte ou s'il a simplement appris les exemples bruts. Contrairement aux autres, RNeat n'est pas du tout capable de mémoriser les données brutes, car il n'en a pas connaissance, tout ce que le modèle sait, ce sont les résultats souhaités et leur proximité.

2) La validation croisée ne permet pas d'améliorer les résultats du test frontal. Nous semblons tous d'accord sur le fait qu'il est possible de former un modèle régulier, d'exécuter quelques validations croisées et de traiter d'une manière ou d'une autre les erreurs sur tous les échantillons pour le score final de fitness du modèle. Comme RNeat ne connaît pas les données brutes, il ne se soucie pas de savoir si les données sont dans un échantillon d'entraînement ou de test, il ajustera sa logique au résultat souhaité dans tous les cas. Théoriquement, il va "apprendre" (plus précisément muter :) ) à partir de tous les échantillons qui sont utilisés dans la fonction de fitness. Tout ce que vous pouvez faire est d'entraîner le modèle à la bonne précision et espérer qu'il ne se surentraîne pas, une approche assez risquée pour le forex. La validation croisée ne peut être utilisée qu'après l'entraînement, comme une estimation finale du résultat possible du test frontal, et en aucun cas utiliser cet échantillon de validation dans la fonction de fitness.