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

 

E come si calcola esattamente R^2, quale funzione?

Ho provato ad allenare diversi modelli attraverso rattle, ha contato "pseudo r^2" attraverso la correlazione, cioè cor(fitpoints[,1], fitpoints[,2])^2, ma voglio calcolare r^2 usando lo stesso metodo come hai fatto tu per il confronto.

Questo codice [1 - sum((y-x)^2)/sum((y-mean(y))^2)] funzionerà?

 
Dr.Trader:

E come si calcola esattamente R^2, quale funzione?

Ho provato ad allenare diversi modelli attraverso rattle, ha contato "pseudo r^2" attraverso la correlazione, cioè cor(fitpoints[,1], fitpoints[,2])^2, ma voglio calcolare r^2 usando lo stesso metodo come hai fatto tu per il confronto.

Questo codice [1 - sum((y-x)^2)/sum((y-mean(y))^2)] funzionerà?


Esattamente. X è un modello.

 
Dr.Trader:

Più neuroni nello strato nascosto - la funzione più complessa può essere descritta dal neurone, avete bisogno di più strati nascosti e più neuroni in essi.

Ma allora il problema sarà che il neurone usa addizioni e moltiplicazioni consecutive (e per esempio sigmoidi per la funzione di attivazione) per descrivere il target, cioè ovviamente non otterrete la vostra funzione originale, ma una specie di approssimazione. E si può scoprire che questa approssimazione ricorderà alcune caratteristiche nei dati di allenamento, quindi non funzionerà correttamente con i nuovi dati. Quindi a volte è necessario interrompere l'allenamento, vedere se l'errore sul campione di prova è diminuito, e continuare l'allenamento se tutto va bene. Ad un certo punto l'errore sui dati di test comincerà a crescere, allora l'addestramento deve essere fermato completamente.

Inoltre, l'uscita di un neurone è limitata dalla funzione di attivazione. Per popolare - sigmoide è (0;1), relu è [0;inf). I valori target devono essere scalati a un intervallo diverso, le tue uscite nell'intervallo (-7;7) sono semplicemente irraggiungibili per molti pacchetti.

Scala tutti i dati con cf 0 st.off 1.

è possibile puntare a -1;1. Ma questo è veramente necessario solo se il neurone di uscita ha un'attivazione tangente.

0:;1 per il sigmoide in un caso simile.

Ma bisogna tenere conto della reale diffusione dei dati. I pesi possono non saturarsi a quel livello.

E sto imparando con le curve di uscita su trayne e test e vedere dove fermarmi.
 

Ancora una volta ha preso rattle, ha addestrato nnet, ha preso il codice finito dal registro. Rattle non funziona correttamente con nnet, ho aggiunto un po' di codice in più per fermare la formazione in tempo.

Miglior R^2 sui nuovi dati = 0.18. La migliore configurazione di rete è venuta fuori piuttosto divertente, con un neurone nell'unico strato interno. Potrei avere due neuroni in più nello strato interno, sarebbe più o meno lo stesso risultato. Se continuiamo ad aumentare il numero di neuroni, il grafico suggerisce che la rete si riaddestra molto rapidamente e si comporta sempre meno bene sui nuovi dati.

Nel grafico di destra, la linea blu è un nuovo dato per il modello, dalla linea 20001. Il resto è formazione e validazione incrociata.

La rete convoluzionale sembra essere in testa.

File:
 
Dr.Trader:

Ancora una volta ha preso rattle, ha addestrato nnet, ha preso il codice finito dal registro. Rattle non funziona correttamente con nnet, ho aggiunto un po' di codice in più per fermare la formazione in tempo.

Miglior R^2 sui nuovi dati = 0.18. La migliore configurazione di rete è venuta fuori piuttosto divertente, con un neurone nell'unico strato interno. Potrei avere due neuroni in più nello strato interno, sarebbe più o meno lo stesso risultato. Se continuiamo ad aumentare il numero di neuroni, il grafico mostra che la rete si riaddestra molto rapidamente e si comporta sempre peggio sui nuovi dati.

Nel grafico di destra, la linea blu è un nuovo dato per il modello, dalla linea 20001. Il resto è formazione e validazione incrociata.

La rete convoluzionale sembra essere in testa.

Il risultato è buono! Congratulazioni, hai battuto il mio semplice NS.

Hai preparato le patatine o le hai date da mangiare così come sono? Questo problema non può essere risolto su puri ritardi, sembra. La preparazione dei chip è necessaria.

Un'altra osservazione - sembra che l'output della tua rete sia strettamente -1;1. O hai preso l'attivazione tangenziale e poi non hai riconvertito l'output, o qualcos'altro.

E solo per riferimento. Rete convergente (apprendimento profondo) nel pacchetto mxnet. Finora la versione è solo con git. Ma la roba di base funziona.
 
Alexey Burnakov:

E solo per riferimento. Rete convergente (apprendimento profondo) nel pacchetto mxnet. Finora solo la versione con git. Ma di base tutto funziona.

solo un'osservazione, fuori tema ma.... quando ho chiesto aiuto con mxnet e ho indicato il pacchetto mxnet, tutti sono rimasti in silenzio e non hanno detto nulla. ora tutti sono improvvisamente interessati a ciò che ho detto su di esso 50 pagine fa, perché sta succedendo questo? :) Mi chiedo se dopo 100 pagine qualcuno noterà il pacchetto quantstrat a cui ho anche prestato attenzione molto tempo fa....

Tu dirai - ah, bene, vai e fallo da solo se sei così intelligente, il fatto è che io non lo sono e non sono intelligente e non capisco molto e l'inglese è anche molto povero e le tue quattro righe di codice con spiegazioni per me potrebbero richiedere settimane per farlo bene, e anche allora non sempre ci riesco...

 
mytarmailS:

solo un'osservazione, fuori tema ma.... quando ho chiesto aiuto con la rete di convoluzione e ho indicato il pacchetto mxnet, tutti sono rimasti in silenzio e non hanno detto nulla, ma ora tutti sono improvvisamente interessati a ciò di cui stavo parlando 50 pagine fa, perché sta succedendo questo? :) Mi chiedo se dopo 100 pagine qualcuno noterà il pacchetto quantstrat a cui ho anche prestato attenzione molto tempo fa....

Tu dirai - ah, bene, vai e fallo da solo se sei così intelligente, il fatto è che io non lo sono e non sono intelligente e non capisco molto e l'inglese è anche molto povero e le tue quattro righe di codice con spiegazioni per me potrebbero richiedere settimane per farlo bene, e anche allora non sempre ci riesco...

Solo un grande commento, collega! ) Ha

Lasciatemi rispondere punto per punto secondo la mia visione:

1) Il 90% delle persone qui sono guidate dall'interesse personale, dalla fase di pensiero e dalla fase di sperimentazione. Pertanto, alcune buone idee vengono messe da parte per molto tempo. Dal momento che non hai fornito alcun esempio e sfida interessante, nessuno è interessato. Semplice, vero?

2) Ci sono due strategie per acquisire conoscenza: scavare e cercare agonizzantemente di fare qualcosa (lo facciamo tutti in misura diversa. Per esempio, ricordo il tizio nel thread "Imparate a guadagnare, abitanti del villaggio!" che ha passato diversi anni della sua vita a testare la funzionalità degli Expert Advisors disponibili. E tutti hanno fallito). Un'altra opzione - aspettare nella speranza che qualcuno aiuti e ne pubblichi uno già pronto. Quindi, se hai scelto la seconda strategia a causa delle tue circostanze, il periodo di attesa per un EA pronto potrebbe essere molto lungo.

Per quanto riguarda mxnet, dal momento che ci sono dentro, non mi dispiace postare il codice, che, tra l'altro, è quasi lo stesso su Internet:

install.packages("drat", repos="https://cran.rstudio.com")
drat::: addRepo("dmlc") 

install.packages("mxnet") 

 

 

train.x = data.matrix(dat_ready_scale[1:(nrow(dat_ready_scale) / 2), 1:100])

train.y = dat_ready_scale[1:(nrow(dat_ready_scale) / 2), 101]

test.x = data.matrix(dat_ready_scale[!rownames(dat_ready_scale) %in% rownames(train.x), 1:100])

test.y = dat_ready_scale[!rownames(dat_ready_scale) %in% rownames(train.x), 101]



########

train.x <- t(train.x)

test.x <- t(test.x)


dim(train.x) <- c(100, 1, 1, ncol(train.x))

dim(test.x) <- c(100, 1, 1, ncol(test.x))

#########



############ BUILD NET


library(mxnet)


# first conv layer


data <- mx.symbol.Variable('data')


conv1 <- mx.symbol.Convolution(data = data,

  kernel=c(14, 1),

  stride=c(1, 1),

  num.filter = 1)


tanh1 <- mx.symbol.Activation(data = conv1, 

 act.type = 'relu')


pool1 <- mx.symbol.Pooling(data = tanh1, 

     pool_type = "avg",

     kernel=c(5, 1), 

     stride=c(1, 1))



# second conv layer


conv2 <- mx.symbol.Convolution(data = conv1,

  kernel=c(12, 1),

  stride=c(1, 1),

  num.filter = 1)


tanh2 <- mx.symbol.Activation(data = conv2, 

 act.type = 'relu')


pool2 <- mx.symbol.Pooling(data = tanh2, 

     pool_type = "avg",

     kernel=c(5, 1), 

     stride=c(1, 1))



# third conv layer


conv3 <- mx.symbol.Convolution(data = conv2,

  kernel=c(10, 1),

  stride=c(1, 1),

  num.filter = 1)


tanh3 <- mx.symbol.Activation(data = conv3, 

 act.type = 'relu')


pool3 <- mx.symbol.Pooling(data = tanh3, 

     pool_type = "avg",

     kernel=c(2, 1), 

     stride=c(1, 1))



# first fully connected layer


flatten <- mx.symbol.Flatten(data = conv3)


fc1 <- mx.symbol.FullyConnected(data = flatten

   , num_hidden = 10)


tanh4 <- mx.symbol.Activation(data = fc1, act.type = 'tanh')



# second fully connected layer


fc2 <- mx.symbol.FullyConnected(data = tanh4, num_hidden = 1)


lenet <- mx.symbol.LinearRegressionOutput(data = fc2)


#### train


device <- mx.cpu()

log <- mx.metric.logger$new()


model <- mx.model.FeedForward.create(lenet, 

 X = train.x,

 y = train.y,

 ctx = device, 

 num.round = 100, 

 array.batch.size = 128,

 learning.rate = 0.01, 

 momentum = 0.9,

 eval.metric = mx.metric.rmse,

 eval.data = list(data = test.x, label = test.y),

 optimizer = 'sgd',

 initializer = mx.init.uniform(0.5),

 #array.layout = 'rowmajor',

 epoch.end.callback = mx.callback.log.train.metric(1, log))


plot(log$train, type = 'l', col = 'blue', ylim = c(min(c(log$train, log$eval)), max(c(log$train, log$eval))))

lines(log$eval, type = 'l', col = 'red')


mx.ctx.internal.default.value = list(device="cpu",device_id=0,device_typeid=1)

class(mx.ctx.internal.default.value) = "MXContext"


preds <- as.numeric(predict(model, test.x))

1 - sum((test.y - preds)^2) / sum((test.y - mean(test.y))^2)

Naturalmente, è solo un pesce che mostra la logica di base.

 
Alexey Burnakov:
I chip sono stati preparati o sono stati alimentati come i ritardatari? Questo compito non può essere risolto sul puro lag, a quanto pare. La preparazione dei chip è necessaria.

Un'altra osservazione - sembra che il tuo output netto sia strettamente -1;1. O hai preso l'attivazione della tangente e poi non hai fatto la conversione inversa dell'output, o qualcos'altro.

Ho alimentato tutto come è nell'originale, senza modifiche. Sono sicuro che avrei potuto ottenere un risultato migliore, se avessi calcolato i valori degli indicatori corretti e li avessi usati anche per la previsione. Ma quali sono gli indicatori giusti? (Domanda retorica, nessuna risposta).

Tutto è divertente su "-1;1" nella risposta. L'uscita dell'ultimo neurone è lineare, senza funzione di attivazione, cioè non è limitata da nulla. Ho provato anche a scalare i valori target in -1;1, ma dopo di che la rete inizia a dare risultati nell'intervallo (-0.2;0.2). Per qualche ragione i risultati saranno sempre in un intervallo più stretto di quello richiesto, probabilmente a causa di un apprendimento rapidamente interrotto, con solo 250 iterazioni.
Se aggiungiamo altri neuroni e non smettiamo di imparare, alla fine la rete imparerà l'invariante giusto. 100 neuroni nello strato interno sono quasi sufficienti per una precisione del 100% sui dati di allenamento. Secondo il log, la somma dei residui su tutti i risultati di 20000*0.7 (corretti in seguito) era di circa 200. Ma in questo caso i risultati della validazione incrociata cesseranno di essere correlati con quelli necessari, saranno solo valori casuali, anche se nell'intervallo necessario.

 
Dr.Trader:

Ho presentato tutto come è nell'originale, senza alcuna modifica. Sono sicuro che calcolando i valori degli indicatori corretti e usandoli anche per la previsione, potrei ottenere un risultato migliore. Ma quali sono gli indicatori giusti? (Domanda retorica, ancora nessuna risposta).

Riguardo al "-1;1" nella risposta, è tutto divertente. L'uscita dell'ultimo neurone è lineare, senza funzione di attivazione, cioè non limitata da nulla. Ho provato a scalare i valori target anche in -1;1, ma dopo di che la rete inizia a produrre risultati nell'intervallo (-0.2;0.2). Per qualche ragione i risultati saranno sempre in un intervallo più stretto di quello richiesto, probabilmente a causa di un apprendimento rapidamente interrotto, con solo 250 iterazioni.
Se aggiungiamo altri neuroni e non smettiamo di imparare, alla fine la rete imparerà l'invariante giusto. 100 neuroni nello strato interno sono quasi sufficienti per una precisione del 100% sui dati di allenamento. Secondo il log, la somma dei residui su tutti i predittori 20000*100 era circa 200. Ma i risultati della crossvalidazione non saranno affatto correlati con quelli desiderati, saranno solo valori casuali, anche se all'interno dell'intervallo necessario.

Questo è divertente. Dovrò pensarci.

HH: molto probabilmente, in questo intervallo [-1;1] , la rete riceve i segnali più consistenti all'ingresso e questo frammento della funzione è il più facile da modellare (NS impara ciò che è più facile). E, naturalmente, questa variante quando la discesa del gradiente trova il suo minimo. È difficile discutere con questo...

OK, aggiungo un suggerimento per te se vuoi ancora fare pratica.

In primo luogo, R^2 0,55 può davvero essere ottenuto applicando qualche piccola trasformazione funzionale alla "metafunzione". Un'altra cosa è che la funzione risulta essere un po' complicata nell'aspetto.

Inoltre, cercate di prendere:

rowMeans(df[, 1:10])

rowMeans(df[, 1:20])

rowMeans(df[, 1:30])

...

rowMeans(df[, 1:100])

Queste 10 metafiche contengono la combinazione desiderata di input significativi.

A proposito, gli strati convoluzionali permettono di individuarlo già nel processo di apprendimento, se si sa dove scavare.

Il motivo per cui sto sollecitando, in realtà - anche se sapete a cosa mappare, dovreste sforzarvi di riprodurre l'approssimazione dell'output. E come insider non mi piace la sensazione di cercare di vendere alla gente un problema irrisolvibile.

 
Alexey Burnakov:

Solo un grande commento, collega! ) Ha

Mi permetta di rispondere punto per punto secondo la mia visione:

Ti capisco, mi aspettavo una risposta più ruvida, grazie per non aver battuto))) e grazie anche per il codice, cercherò di lavorarci nel fine settimana dato che sono impegnato con un'altra idea in questo momento....

Ho bisogno di aiuto...

Voglio fare un test di cointegrazione in sliding ma lancia un errore...

ecco un semplice test su dati statici...


library(tseries) 
ri <- cumsum(rnorm(10000))  #  типа цены
si <- cumsum(rnorm(10000))  #  типа цены
ln <- length(ri)

data <- as.data.frame(cbind(ri,si))

#проводим  линейную регрессию для определения правильного соотношения
model <- lm(  ri ~ si + 0 , data)
#вычисляем  разницу цен (спред)
spread <- ri - coef(model)[1] * si
#проводим  тест Дики-Фуллера на стационарность
test <- adf.test(as.vector(spread), k=0)

test$p.value

funziona...

Ma quando faccio lo stesso in una finestra scorrevole, ottengo un errore -Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :

0 (non-NA) casi

test della finestra scorrevole

ri <- cumsum(rnorm(10000))  #  типа цены
si <- cumsum(rnorm(10000))  #  типа цены
ln <- length(ri)


data <- as.data.frame(cbind(ri,si))


test_vec <- rep(0,ln) #  тут будем хранить показатели теста 

for(i in 151:ln){
  print(i)
          idx <- (i-150):i
                #проводим  линейную регрессию для определения правильного соотношения
                model <- lm(  ri[idx] ~ si[idx] + 0 , data[idx,])
                #вычисляем  разницу цен (спред)
                spread <- ri[idx] - coef(model)[1] * si[idx]
                #проводим  тест Дики-Фуллера на стационарность
                test <- adf.test(as.vector(spread), k=0)
                
                test_vec[i] <- test$p.value
                
}

su stack overflow in problemi simili dice che è dovuto a "NA" nei dati ma io non ce l'ho, questo è sicuro...

qual è il problema? per favore aiutatemi

Motivazione: