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

 
Alexey Burnakov:
OK, si potrebbe pensare. Immaginate per esempio che ad ogni iterazione la rete neurale non faccia una propagazione a ritroso dell'errore standard basata sulla deviazione del target dalla previsione, ma ottenga dati che alla versione precedente di pesi il commercio reale differisce dall'ideale di tanti punti. E aggiorna i pesi in base a queste informazioni. Cioè, le informazioni dovrebbero essere un flusso parallelo alla macchina. Forse, si può fare.

Perché avete bisogno di pesi? Perché parli di loro in primo luogo?

Ho capito che avete bisogno di pesi precedenti, ora capisco che non capisco niente)

 
mytarmailS:

Perché avete bisogno di pesi? Perché parli di loro in primo luogo?

Ho capito che avete bisogno di pesi precedenti, ora capisco che non ho capito niente)

Beh, sembra che sia così ))

Non abbiamo bisogno dei pesi. Li ho menzionati solo per renderlo chiaro a VOI. Abbiamo bisogno di sapere come il sistema ha scambiato i pesi precedenti. Abbiamo bisogno del risultato dello scambio in qualche modo integrato. Tutto.

I pesi sono aggiornati dall'algoritmo.

 

Qui, una semplice funzione funziona. Bisogna provarne uno più complesso. Deve ancora essere differenziato, questo è il trucco.

library(neuralnet)


y <- as.data.frame(matrix(runif(n = 10000, min = -15, max = 15), ncol = 2))

y$V3 <- runif(n = 5000,  min = -15, max = 15)

y$V4 <- runif(n = 5000,  min = -15, max = 15)

y$V5 <- runif(n = 5000,  min = -15, max = 15)

y$V6 <- runif(n = 5000,  min = -15, max = 15)

y$V7 <- runif(n = 5000,  min = -15, max = 15)

y$V8 <- y$V1 ^ 2 + y$V2 ^ 2

colnames(y) <- c('input_1', 'input_2', 'noise_1', 'noise_2', 'noise_3', 'noise_4', 'noise_5', 'output')


f_f <- function(x, y){

1/2*(y-x)^2

}


print(

nn_model <- neuralnet(formula = output ~ input_1 + input_2 + noise_1

, data = y

, hidden = 1

, threshold = 0.01

, stepmax = 1e+05

, rep = 100

, startweights = NULL

, learningrate.limit = NULL

, learningrate.factor = list(minus = 0.5, plus = 1.2)

, learningrate=NULL

, lifesign = "none"

, lifesign.step = 10

, algorithm = "rprop+"

, err.fct = f_f #"sse"

, act.fct = "logistic"

, linear.output = F

, exclude = NULL

, constant.weights = NULL

, likelihood = FALSE

)

)

 

f_f <- funzione(x, y) 1/2*(y-x)^2

f_f - conta l'errore per la rete giusto?

x è il valore che dovrebbe essere (curva ideale)

y è come dovrebbe essere (la curva reale)

La differenza tra loro è l'errore

Ho bisogno di un vettore di commercio da candele precedenti, ho bisogno delle regole per aprire le operazioni, ho bisogno dei dati di ingresso del commercio

 
mytarmailS:

f_f <- funzione(x, y) 1/2*(y-x)^2

f_f - conta l'errore per la rete giusto?

x è il valore che dovrebbe essere (curva ideale)

y è come dovrebbe essere (la curva reale)

La differenza tra loro è l'errore

Penso di aver bisogno di un vettore di trade per candele, ma non capisco come aprire trade con quali regole, come dovrebbero essere questi dati di input

Giusto quasi. X è un vettore di previsioni ns. Ygrek è il vettore degli incrementi di prezzo per barra in avanti (per esempio ), che è ciò che la rete prevede. E l'intera funzione è ciò che l'algoritmo NS vedrà ad ogni iterazione. Finora non ci sono risultati. Devono essere modellati.

Come. Dovremmo descrivere la logica di apertura delle posizioni e inserire lo spread direttamente nel corpo della funzione. Scrivi il risultato delle posizioni aperte nel vettore e calcola le caratteristiche intrinseche sul vettore.

Per esempio: compra<-(y-spread)[x>0]. Questo sarà un vettore per i long. Allora tutti<-append(comprare, vendere).

Ma probabilmente non funzionerà. Ci sono molte restrizioni sul tipo di funzione (.
 
Nel frattempo continuo il mio esperimento. Ho addestrato la macchina solo su eurusd e ho ottenuto un piccolo MO positivo sulla convalida.

In allegato c'è uno screenshot dell'attuale test del modello in MT4. La fase di formazione è ancora in corso... I risultati completi non saranno disponibili fino a domani. I calcoli sono abbastanza lunghi in combinazione con R e ogni minuto se non ci sono scambi aperti. Iniziato nel 1999. La convalida inizierà dal 2010.09. Il grafico attuale è del 2003.

Sto usando 10 punti di spread a cinque cifre. Aspettatevi 7-8 pip sulla convalida di MO. Non denso.... Ma ora si può già trovare DC dove lo spread è di 10 pip, ecco perché penso che il risultato sia quasi significativo.
File:
 

Un collega mi ha mandato un link a un corso sull'apprendimento automatico, ti piacerebbe dargli un'occhiata? È gratuito, ma è in Python per qualche motivo ((

https://www.udacity.com/course/machine-learning-for-trading--ud501

 
Alexey Volchanskiy:

Un collega mi ha mandato un link a un corso sull'apprendimento automatico, ti piacerebbe dargli un'occhiata? È gratuito, ma è in Python per qualche motivo ((

https://www.udacity.com/course/machine-learning-for-trading--ud501

Il più efficace:

1. si mette in R - 5 minuti.

2. Scaricate il pacchetto rattle, che è progettato come una GUI, quindi non richiede alcuna conoscenza di R.

3. Per ridurre i vostri costi di avviamento potete usare il mio articolo. Contiene spiegazioni e, cosa più importante, ha un file pronto in allegato. Una volta che hai visto il mio file puoi facilmente preparare il tuo.

4. Si ottengono sei modelli.

5. La cosa principale in rattle è che puoi vedere il ciclo completo dell'apprendimento automatico:

  • preparazione iniziale dei dati (data mining)
  • modellazione
  • valutazione dei risultati
  • come testo bonus sulla R di tutte le vostre attività con il sonaglio. Questo testo può poi essere usato fuori dal sonaglio.

Tutto questo vi darà delle basi senza lacune, e soprattutto una concreta esperienza di apprendimento automatico legata al forex.

PS.

Il sonaglio vi sarà molto utile non solo ai primi passi, ma anche in seguito: costi minimi, per valutare qualcosa, per sperimentare...

PSPS

Naturalmente, non si può fare a meno dei libri. Ce ne sono molti qui. La ricerca funziona perfettamente.

 
mytarmailS:

Grazie per il chiarimento dettagliatoDr.Trader!

Sai, probabilmente la cosa migliore e più corretta sarebbe insegnare le inversioni stesse, anche lo stesso zigzag, cioè dare tre stati 1) inversione a U verso l'alto

2) inversione verso il basso

3) non un'inversione a U

Ma se per insegnarlo, è abbastanza difficile da catturare inversioni, più l'asimmetria nel numero di osservazioni, classi "non inversione" sarà decine o forse centinaia di volte più

E quali predittori usate e quali sono i risultati?

Ho appena iniziato a usare l'analisi spettrale, i primi test si sono rivelati molto meglio che con gli indicatori, l'ho eseguito attraverso rattle, l'errore di formazione e test era circa il 6%, ma quando ho iniziato a usare R l'errore è salito al 30% se non sbaglio, San Sanich dice che è riqualificazione, quindi ancora non capisco molto

C'è anche un modo per scoprire quali periodi dominano nel mercato attraverso l'analisi spettrale e poi è possibile utilizzare questi periodi negli indicatori. Otterrò indicatori adattivi, non regolati alla storia.

Uso indicatori standard come base per la creazione di predittori. Io stesso sto ancora sperimentando con loro, provando le idee di questo thread del forum.

L'ho fatto per le ultime settimane, ora il miglior risultato è il seguente: (un sacco di calcoli, sto cercando di usare il timeframe D1 per un calcolo più veloce, più tardi userò timeframe più piccoli)

1) esportare da mt5 a csv: ohlc, tempo, indicatori, tutti per le ultime 10 barre. Recentemente ho iniziato a prendere il tempo solo dalla barra più recente, credo che il tempo delle altre barre sia calcolabile e quindi non porta nessuna nuova informazione. Stanno uscendo diverse centinaia di predittori "primari". Il risultato richiesto dell'apprendimento è "1" o "0" - aumento o diminuzione del prezzo nella prossima barra. Il mio metodo con gli zigzag non è stabile e complesso, ora sono più bravo a lavorare con i prezzi vicini. Quando avrò elaborato un algoritmo completo per l'addestramento dei modelli da zero, potrei iniziare a lavorare sugli zigzag e sulla previsione delle tendenze.

2) In R sto facendo diverse operazioni matematiche con i dati disponibili - aggiunta, delta, min, max, ecc. Esce già più di mille predittori.

3) Ovviamente c'è più spazzatura dopo il secondo passo di quella necessaria. Lo sto setacciando con il metodo dell'articolo sui componenti di basehttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/, SanSanych l'ha scritto prima. Non sto insegnando il modello PCR in sé e ho deciso di utilizzare la funzione di pre-screening dei predittori per ora:

library('vtreat')
PrunePredictors <- function(srcTable, pruneSig = -1) {
        targetName <- tail(colnames(srcTable), 1)
        
        treatmentsN <- designTreatmentsN(srcTable,setdiff(colnames(srcTable),targetName),targetName, verbose=FALSE)
        if(pruneSig<0){
                pruneSig = 1.0/(ncol(srcTable)-1)
        }

        scoreFrameSorted <- treatmentsN$scoreFrame[,c("origName", "psig", "code")]
        scoreFrameSorted <- subset( scoreFrameSorted, code == "clean")[,1:2]
        scoreFrameSorted <- scoreFrameSorted[with(scoreFrameSorted, order(psig)), ]
        
        scoreFrameSortedPruned <- subset( scoreFrameSorted, psig < pruneSig)
        scoreFrameSortedPruned <- scoreFrameSortedPruned[,1] 
        
        cat("Minimal psig:", scoreFrameSorted[1,2], "\n")
        cat("Maximal psig:", scoreFrameSorted[nrow(scoreFrameSorted),2], "\n")
        cat("Threshold:", pruneSig, "\n")
        cat("Good predictors:", nrow(subset( scoreFrameSorted, psig < pruneSig)), "\n")
        
        return(scoreFrameSortedPruned)
}

srcTable è una tabella con predittori, l'ultima colonna dovrebbe essere il risultato di formazione richiesto.pruneSig è meglio lasciare -1.

Come risultato, la funzione restituirà una lista con i nomi delle colonne della tabella che portano alcune informazioni utili. O una lista vuota se non si trova nulla di utile. Questo metodo è menzionato nell'articolo come poco significativo, ma si rivela abbastanza adeguato, setaccia molto bene la spazzatura. Inoltre, l'elenco dei risultati sarà ordinato per rilevanza, dal più utile al meno utile.

4) Se la funzione restituisce una lista vuota - eseguo di nuovo il secondo passo, genera di nuovo diverse combinazioni matematiche sui dati disponibili, poi il terzo passo per setacciare. Devo ripeterlo 3-4 volte. Il volume dei dati cresce ad ogni ripetizione, quindi è meglio limitare il volume dei nuovi dati generati in qualche modo. Possiamo cambiare questa funzione per il vaglio, in modo che se la lista è vuota, restituisca cento o due risultati migliori e generi nuovi predittori solo da questi.

5) Successivamente, secondo l'articolo, dobbiamo addestrare il modello del componente principale stesso. Ho problemi con esso - finora il miglior r-squared per il modello addestrato è 0.1, non è abbastanza, l'articolo dice che ho bisogno di almeno 0.95. Ma posso allenare qualche altro modello R sui predittori ottenuti e darà un risultato migliore. Ho più esperienza con la neuronica, il miglior risultato in fronttest con essa esce con un errore di circa 37%. Il modello PCE dovrebbe essere più stabile, senza retraining, ecc., ma finora non riesco a trovare alcun predittore per esso.

Se hai un errore del 30% nel fronttest allora è un modello abbastanza redditizio, fai Expert Advisor per mt5 e controllalo in strategy tester.

 
Alexey Volchanskiy:

Un collega mi ha mandato un link a un corso sull'apprendimento automatico, ti piacerebbe dargli un'occhiata? Il corso è gratuito, ma è in Python per qualche motivo ((

https://www.udacity.com/course/machine-learning-for-trading--ud501

Ho iniziato a guardare questo corso, presta molta attenzione al framework Pandas su Python. Le prime lezioni sembrano più un tutorial su questo stesso framework che sull'analisi dei dati. Ma il tutorial sembra adeguato, senza il tipico "sono un guru del Forex, ti aprirò gli occhi e farai milioni" come in molti altri addestramenti inutili, fa sperare che diranno cose adeguate fino alla fine. Ma vale anche la pena notare che questo corso è progettato per il trading azionario e non per il forex, non so se i processi di apprendimento dei modelli sono simili in queste due aree.