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

 

Lo stato attuale del mio esperimento.

Dopo aver corretto gli errori nel codice, sui miei dati, ho infatti i seguenti risultati sulla convalida.

Il grafico enumera le coppie di valute, gli orizzonti di previsione e le cosiddette zone grigie - intervalli di valori all'uscita della macchina di previsione, quando non vengono prese decisioni per entrare nel mercato.

Come potete vedere ho già un MO positivo per un certo numero di coppie. Per EURUSD è macro. Allo stesso tempo rendo l'esperimento ancora più accurato, usando gli spreads reali per tutte le coppie (dal mio DC):

spreads <- as.data.frame(cbind(

c('audusd'

, 'eurusd'

, 'gbpusd'

, 'usdcad'

, 'usdchf')

, c(0.00018

, 0.0001

, 0.00014

, 0.00013

, 0.00012)

)

)

Ora ho iniziato un esperimento di generalizzazione molto potente, in cui verranno controllati ancora più parametri, e durerà circa una settimana. Ci saranno circa 60 volte più stime. Ma allora avrò sicuramente dei buoni risultati da confrontare. E, come ho promesso da qualche parte, posterò l'Expert Advisor (formato) con la logica di base pronta per il test. Potete svilupparlo ulteriormente. Lo migliorerò per me stesso aggiungendo diversi potenziatori direttamente al codice MQL.

Ci sentiamo presto.

 
Alexey Burnakov:

No, certamente non capisci bene l'importanza della non stazionarietà. Non importa se è un modello NS o lineare o il mio modello, se i vostri dati sono non stazionari allora le dipendenze trovate su di essi sono garantite per non verificarsi al di fuori del campione. Tutti i dati che avete sotto forma di: prezzo grezzo, MA(prezzo grezzo), apertura della barra(prezzo grezzo), ecc. devono essere rimossi dal modello. Devi prendere la loro differenza dall'ultimo prezzo conosciuto.

La scalatura in un intervallo non è possibile qui.

Non è poi così male. Se consideri ogni esempio di allenamento separatamente (cioè se normalizzi per una riga della tabella di allenamento), puoi normalizzare tutti i dati per gruppi, separatamente in ogni esempio di allenamento. Per esempio, prendete le colonne o,h,l,c per tutte le 100 barre (400 in totale) all'interno di un esempio di allenamento, trovate il loro minimo e massimo, e scannerizzatele. Questo dovrebbe essere ripetuto per ogni esempio di allenamento separatamente. Questa normalizzazione assicurerà che il prezzo nella tabella di allenamento per ogni riga sarà sempre nell'intervallo [0...1]. Ora, se in futuro avremo un nuovo esempio, il cui prezzo è andato ben oltre i prezzi durante l'addestramento, la normalizzazione lo riporterà nell'intervallo [0..1] e non sarà una nuova regione sconosciuta di dati per la rete neurale. Il modello addestrato può trovare e riconoscere alcune regole come "il prezzo almeno una volta durante le ultime N barre è stato superiore a 0,8" e questa regola sarà applicata a qualsiasi nuovo dato, anche se il prezzo è sceso della metà.

Se normalizziamo ogni colonna separatamente, come facciamo di solito, i risultati del modello nel fronttest saranno peggiori. Le dipendenze tra predittori dello stesso tipo all'interno di un esempio di allenamento vengono perse. (per esempio Open[1], Open[2], Open[3]... dello stesso esempio di allenamento saranno scansionati in intervalli diversi, secondo tutti gli esempi di allenamento). Inoltre, c'è un altro problema - durante la formazione faremo la normalizzazione basata su migliaia di esempi di formazione, mentre nel trading reale avremo solo una linea che dovrebbe essere scalata in onde con se stessa, il che non è chiaro e strano.

Se non fai nessuna normalizzazione, puoi cavartela. Ma se il prezzo cade/aumenta oltre l'intervallo disponibile per la formazione - sarà una nuova e assolutamente sconosciuta regione di dati per il modello. Non lo tirerà fuori e si bloccherà.

Tutto questo è rigorosamente per rete neurale, per esperienza.

 

Ho fatto un altro po' di lavoro con la scala y pca. Ho trovato un buon articolo con formule di dispersionehttp://www.chemometrics.ru/materials/textbooks/pca.htm, neho fatto uno in R.

Codice di base dallo stesso articolohttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/
Dobbiamo eseguire il codice"princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" e fermarci. prossimo:

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

La linea di fondo è più o meno questa: l'oggetto princ contiene una matrice di fattura (princ$x) e una matrice di carico (princ$rotation). Se moltiplichiamo queste due matrici princ$x %*% t(princ$rotation), otteniamo la tabella originale con i dati dmTrain (scalati da Y, senza variabile target).

È possibile limitare il numero di componenti principali, e poi i dati originali saranno determinati con un certo margine di errore. Se vi ricordate di internet lento e delle immagini jpeg speciali che si affilano quando le caricate, allora ottenete una cosa simile, più numero di componenti principali darà un adattamento esatto ai dati iniziali.

Per il numero di componenti N, i dati iniziali sono definiti come segue: princ$x[,1:N] %*% t(princ$rotation[,1:N]). L'errore può essere calcolato sottraendo la matrice risultante da dmTrain, si ottiene la matrice dei residui. Questi sono gli errori, quanto i dati reali differiscono dai dati trovati. TRV è la media dei quadrati di errore. ERV è qualcosa come l'errore medio. Se ERV=0,8, i dati di partenza differiscono da quelli trovati di ~20% in ogni cella della tabella. Cioè, se trovate un numero 10, allora i dati originali erano molto probabilmente da 8 a 12. Questa è una definizione molto approssimativa, ma ha più senso. E l'ERV dovrebbe essere almeno 0,95 perché il modello PCA contenga abbastanza componenti.

Cosa ne ricava? Puoi aggiungere un nuovo parametro tol a princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE, tol=0.01), così non genererai migliaia di componenti principali e la generazione si fermerà quando sdev del nuovo componente sarà < sdev(PC1) * tol. Dopo di che il numero di componenti utilizzati può essere regolato con la funzione di cui sopra, iniziando con 2 e aumentando gradualmente di 1.

Ho cercato di capire come applicarlo per vagliare i predittori, ma non mi viene ancora in mente niente. Potete per esempio sostituire load con 0 per un predittore in princ$rotation, ricalcolare ERV e vedere quanto peggiore sarà il risultato. Tuttavia non vedo il senso di questa azione, non è chiaro come applicare questo risultato. Forse così possiamo trovare predittori correlati che non portano alcuna nuova informazione e quindi la loro eliminazione probabilmente non peggiorerà il risultato. Vorrei trovare predittori di rumore, ma in queste matrici non c'è nessuna connessione con le variabili target, cioè non c'è nessun criterio per ciò che è rumore e ciò che non lo è.

 
Dr.Trader:

Ho fatto un altro po' di lavoro con la pca in scala y. Ho trovato un buon articolo con formule di dispersionehttp://www.chemometrics.ru/materials/textbooks/pca.htm, neho fatto uno in R.

Codice di base dallo stesso articolohttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

Ho riletto l'articolo. Sembra che tu non stia cercando di ripetere l'esempio dell'articolo, solo punto per punto, sostituendolo con i tuoi dati. O mi sono perso qualcosa? Se no, perché no?
 

Ho ripetuto l'esempio. Sostituito con i miei dati, ho ottenuto 100+ componenti principali per una varianza 0,95. Ho guardato le trame di registrazione, non ho visto nessun buon predittore che si distinguesse. Cioè, mentre l'autore vede sui suoi dati che può mantenere 2 componenti principali e 5 predittori - io vedo sui miei dati 100+ componenti e 1000+ predittori (i lowadings diminuiscono passo dopo passo, non è nemmeno chiaro quale sia il valore di soglia per l'eliminazione dei lowadings).

Dovrei dare credito a y-aware pca però, ho appena sostituito i miei dati senza pre-screening, ho costruito un modello Y-Aware PCA su di esso, e ho ottenuto un errore del 45% nel fronttest. Non è ancora redditizio per il forex, ma l'articolo finisce lì, quindi se devo usare y-aware pca allora devo inventarmi qualcos'altro.

In altri modi posso lasciare solo una dozzina di predittori, allenare nnet, e ottenere un errore fronttest di solo il 30%. Vorrei ottenere un risultato simile con y-aware pca.
 
Dr.Trader:

Ho ripetuto l'esempio. Sostituito con i miei dati, ho ottenuto 100+ componenti principali per una varianza di 0,95. Ho guardato le trame di registrazione, non ho visto nessun buon predittore che spiccava. Cioè, mentre l'autore vede sui suoi dati che può mantenere 2 componenti principali e 5 predittori - io vedo sui miei dati 100+ componenti e 1000+ predittori (i lowadings diminuiscono passo dopo passo, non è nemmeno chiaro quale sia il valore di soglia per l'eliminazione dei lowadings).

Dovrei dare credito a y-aware pca però, ho appena sostituito i miei dati senza pre-screening, ho costruito un modello Y-Aware PCA su di esso, e ho ottenuto un errore del 45% nel fronttest. Per il forex non è ancora redditizio, ma l'articolo finisce lì, quindi se uso y-aware pca allora devo inventarmi qualcos'altro.

In altri modi posso lasciare solo una dozzina di predittori, allenare nnet, e ottenere un errore fronttest di solo il 30%. Vorrei ottenere un risultato simile con y-aware pca.
Penso che debba essere ripetuto lettera per lettera. Ci sono pacchetti utilizzati tranne pca, che non ho visto con voi.
 

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

Ecco il codice R dall'articolo, i file _03.txt e _04.txt, ho eseguito tutto questo sui miei dati prima. Ho anche aggiunto un controllo sui dati di fronttest in _04.txt. L'unica differenza che vedo è il pacchetto etal offerto alla fine dell'articolo. Ma non ci sono nemmeno esempi, suggeriscono solo di provare a confrontare il risultato con quello che fa vtreat prune.

 
Dr.Trader:

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

Ecco il codice R dall'articolo, i file _03.txt e _04.txt, ho eseguito tutto questo sui miei dati prima. Ho anche aggiunto un controllo sui dati di fronttest in _04.txt. L'unica differenza che vedo è il pacchetto etal offerto alla fine dell'articolo. Ma non ci sono nemmeno esempi, solo offerta di provare e confrontare il risultato con quello che fa vtreat prune.

Sembra abbastanza solido.

Quindi, nessun risultato utile?

 

Il mio articolo sulla selezione delle caratteristiche.

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

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

Ciao!

Ho un'idea, voglio verificarla, ma non conosco lo strumento per implementarla... Ho bisogno di un algoritmo che sia in grado di prevedere per alcuni punti in avanti, diciamo per 3 o 5 (preferibilmente una rete neurale)

Ho lavorato solo con le classificazioni quindi non capisco nemmeno come dovrebbe essere, consigliare qualcuno come farlo o consigliare un pacchetto in R

p.s. Grande articolo Alexey