L'apprendimento automatico nel trading: teoria, modelli, pratica e algo-trading - pagina 47

 
mytarmailS:

1) Sì, forse hai ragione, ma questa rete è in grado di imparare a prendere decisioni, non è la solita classificazione senza insegnante, e quindi puoi implementare in essa il concetto di cui ho parlato a lungo - puoi insegnarle non l'obiettivo standard sotto forma di compra-sel-compra o 000111010101011, ma in modo più astratto, come una semplice condizione come: "Rete! Non mi interessa come fai trading, ma voglio che il tuo profitto sia almeno l'1% dello 0,5% di drawdown al giorno, e cercherà le regole e le combinazioni per risolvere questo problema. Se mi sbaglio e dico cose senza senso qui, per favore correggetemi per il mio bene).

Giusto, non ci avevo pensato, è vero. Allora è meglio condizionare la rete neurale per massimizzare lo sharpe ratio (o fattore di recupero), e fare in R qualcosa come un semplice forex tester su quotazioni reali per testare il modello per valutare l'evoluzione. Ma un miracolo non avverrà da solo, il problema del retraining rimarrà, i dati devono ancora essere divisi in campioni di addestramento e di test, e le crossvalidazioni devono essere eseguite per la stima finale del modello durante la sua evoluzione. Come lavorare con lo sharpe ratio alla validazione incrociata non ho potuto pensare velocemente, secondo me non sarà possibile rimuovere le barre casuali nel campione di prova, perché non è importante la precisione su ogni barra, ma il commercio continuo stesso, con tutti i drawdown, spread e commissioni per ogni nuovo affare.

Alexey Burnakov:

Sembra che stiano preparando un pacchetto per R. Dovremmo prenderne nota.

Ho già il pacchetto, ma non so quante percentuali è pronto, per ora su githab. Ecco un esempio più semplice, una continuazione dell'articolo. Insegnano alla rete ad estrarre la radice.

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

Finito più tardi:

Ha fatto una classificazione di iris, codice in atachment per esempio (il modello ha fallito la classificazione, ho sostituito tutte le classi con numeri per la regressione, e arrotondato i risultati al livello numerico più vicino. Probabilmente si sarebbe potuto fare in qualche modo più facilmente).
Ho preso solo il 50% dei dati per l'allenamento, sulla convalida il successo è stato del 95%, abbastanza buono. A giudicare dal grafico, il modello ha persino rimosso il primo predittore da solo.

Forex è più complicato di Iris :) il risultato sarà molto peggiore lì.

Ho anche notato che le parti 3 e 4 dell'articolo usano funzioni diverse per allenare il modello.
La parte 3 è quella di simulare qualsiasi processo dinamico, per esempio il modello può osservare il grafico forex e aprire/chiudere operazioni in tempo reale.
La parte 4 consiste semplicemente nell'addestrare il modello usando esempi già pronti e prevedere il risultato

File:
 
Dr.Trader:

1) Giusto, non ci avevo pensato, è vero. Allora è meglio dare alla rete neurale una condizione per massimizzare lo sharpe ratio (o fattore di recupero), e fare in R qualcosa come un semplice tester forex su quotazioni reali

2) Ho anche notato che le parti 3 e 4 dell'articolo usano funzioni diverse per allenare il modello.
La parte 3 è quella di simulare alcuni processi dinamici, per esempio il modello può osservare il grafico forex, e aprire/chiudere operazioni in tempo reale.
La parte 4 è solo l'addestramento di un modello su esempi pronti e la previsione del risultato

1) Assolutamente giusto! è esattamente quello che intendevo, profitto/perdita solo per l'esempio, stavo pensando di prendere il fattore di recupero, ma lo sharpe non è praticamente peggio

2) Hai ragione, nel 4° articolo l'autore ha già fatto qualcosa come un pacchetto, per tutti gli standard di "R", è massimo uno ha un modello - un vettore target - predizione attraverso "predict" - ma questo approccio non funzionerà per noi, perché tutte le funzioni sono già nascoste nel pacchetto... Abbiamo bisogno di capire il codice sorgente e scrivere tutto da soli, ecco perché ho detto aiutare a capire, perché qui è tutto molto più complicato che con il "pacchetto pronto con esempi" Penso che anche le funzioni della parte 3 non saranno sufficienti per quello di cui abbiamo bisogno. Quindi sarebbe favoloso se tutti noi salissimo a bordo

 
mytarmailS:

1) Assolutamente giusto! Questo è esattamente quello che intendevo, il profitto/perdita è solo un esempio, stavo pensando di prendere il fattore di recupero, ma lo sharpe è fondamentalmente il migliore che ci sia

2) Hai ragione, nel 4° articolo l'autore ha già creato qualcosa come un pacchetto, per tutti gli standard di "R", è solo un modello - un vettore target - predizione attraverso "predict" - ma questo approccio non funzionerà per noi, perché tutte le funzioni sono già nascoste nel pacchetto... Abbiamo bisogno di capire il codice sorgente e scrivere tutto da soli, ecco perché ho detto aiutare a capire, perché qui è tutto molto più complicato che con il "pacchetto pronto con esempi" Penso che anche le funzioni della parte 3 non saranno sufficienti per quello che ci serve. Quindi sarebbe favoloso se tutti venissimo coinvolti

Chi vi insegnerà se non voi stessi? Mettete le mani sul codice sorgente. Studiatelo. E anche sulla differenziabilità della funzione. È necessario alimentare una funzione regolare nella rete. E voi ci direte - e noi vi daremo i nostri consigli.
 
Alexey Burnakov:
È necessario alimentare qualche funzione regolare nella rete. E tu ci dirai ), e noi ti daremo i nostri consigli.

Perdonatemi se mi intrometto, ma non solo liscio, ma anche normalizzato.

In modo che il NS non vada mai oltre le sue aree conosciute.

Qualcosa del genere.

 

Non riesco a capire perché queste reti vengono prese di mira?

Dopotutto, sono andati oltre i pacchetti di formaggio alla vastità della R! Ma no, i vecchi peccati continuano a trascinare e trascinare ...

Prendete Caret per esempio. Non solo ci sono centocinquanta modelli, ma anche un mucchio di utili funzioni di pre-elaborazione e predizione...

Quindi no, reti e reti...

 
SanSanych Fomenko:

Non riesco a capire perché queste reti vengono prese di mira?

Dopotutto, sono andati oltre i pacchetti di formaggio alla vastità della R! Ma no, i vecchi peccati continuano a trascinare e trascinare ...

Prendete Caret per esempio. Non solo ci sono centocinquanta modelli, ma anche un mucchio di utili funzioni di pre-elaborazione e predizione...

Quindi no, reti e reti...

Allora, mostraci il tuo caret e centocinquanta modelli in azione! :)

 
Vadim Shishkin:

Quindi mostrateci presto il vostro caret e centocinquanta modelli in azione! :)

A proposito, io stesso uso caret e ottengo risultati soddisfacenti nel forex.

Io stesso sto usando Caret e ottengo risultati soddisfacenti nel forex:

####
##########
############## 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), ]

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


 
Grazie. :)
 
SanSanych Fomenko:

Non riesco a capire perché queste reti vengono prese di mira?

Dopotutto, sono andati oltre i pacchetti di formaggio alla vastità della R! Ma no, i vecchi peccati continuano a trascinare e trascinare ...

Prendete Caret per esempio. Non solo ci sono centocinquanta modelli, ma anche un mucchio di utili funzioni di pre-elaborazione e predizione...

Quindi, no, reti e reti...

Di solito una biblioteca può fare molto ma nella media, o solo una cosa con buona qualità. Caret è il primo caso, è facile testare decine di modelli e confrontare i risultati, ma è difficile migliorare qualcosa per il tuo compito. Ho incontrato enormi difficoltà nel selezionare i predittori secondo le mie regole - caret può simulare l'annealing per enumerarli (e la genetica), ma non può semplicemente prendere la mia funzione di fitness per la stima. Devo creare un nuovo modello per caret con funzioni di addestramento, convalida e fitness; ma caret continuerà a controllare i campioni di dati di addestramento e di test con le proprie regole, con le proprie convalide incrociate.
È più facile per me prendere il pacchetto GA o GenSA per enumerare i predittori, e scrivere solo una funzione di fitness, che creerà sia il modello che la validazione incrociata secondo le regole di cui ho bisogno.

Neuronka non è peggio della foresta, i miei risultati con esso sono in più, o nel peggiore dei casi solo senza perdere il deposito. A causa dei diversi algoritmi, neuronka preferirà predittori diversi dalla foresta, ma tutte le regole di selezione dei predittori sono completamente le stesse della foresta.

Trasferire il neuronc in mt5 EA è una questione di un paio di minuti (salvare i pesi da R in csv, leggerli nell'EA). Trasferire la foresta in mt5 sarà molto più difficile, ecco perché preferisco neuronka.

 

Ho sperimentato un po' di più con RNeat e sono arrivato alla conclusione che non può essere gestito allo stesso modo delle reti neurali convenzionali.

1) A differenza dei modelli convenzionali, l'addestramento di RNeat non utilizza dati di input. Il modello viene generato in modo casuale, migliorato e solo alla fine viene testato sui dati grezzi. Tipicamente, i modelli usano dati grezzi, costruiscono la loro logica su di essi, e poi usano il campionamento di convalida per vedere se la logica del modello è corretta, o se ha semplicemente imparato gli esempi grezzi. A differenza degli altri, RNeat non è affatto capace di memorizzare i dati grezzi, perché non li conosce, tutto ciò che il modello conosce sono i risultati richiesti e quanto si avvicina ad essi.

2) La validazione incrociata non aiuterà a migliorare i risultati del fronttest. Sembriamo tutti d'accordo sul fatto che è possibile addestrare un modello regolare, eseguire un paio di crossvalidazioni, e in qualche modo gestire gli errori su tutti i campioni per il punteggio finale di fitness del modello. Poiché RNeat non conosce i dati grezzi, non gli importa se i dati sono in un campione di allenamento o di prova, adeguerà la sua logica al risultato desiderato in ogni caso. Teoricamente "imparerà" (più precisamente muterà :) ) da tutti i campioni che sono usati nella funzione di fitness. Tutto quello che si può fare è addestrare il modello alla giusta precisione e sperare che non si sovralleni, un approccio piuttosto rischioso per il forex. La convalida incrociata può essere usata solo dopo l'addestramento, come stima finale del possibile risultato nel fronttest, e in nessun modo usare questo campione di convalida nella funzione di fitness.

Motivazione: