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

 
SanSanych Fomenko:

Non vedo alcuna prova che NS abbia affrontato qualcosa.

L'apprendimento eccessivo è un male mondiale nella scienza e nella costruzione di modelli in particolare.

Quindi un errore è necessario per tre serie:

  • set di apprendimento. Il modo in cui rattle lo intende (OOB, test, validazione) andrà bene.
  • un insieme che è al di fuori, in termini di date, dell'insieme di allenamento.
  • Un altro insieme che è al di fuori, nel senso di date, dell'insieme di allenamento.

Gli ultimi due set non sono mescolati quando arrivano nel terminale, basi dietro il bar.

Ci dovrebbe essere circa lo stesso errore su tutti e tre i set. Così facendo dovrete fissare l'insieme dei predittori che prendete quando addestrate il modello.

All'inizio non ho pensato di riqualificarmi in questo compito, non ce n'era bisogno. La prima volta neuronc era con un solo neurone nello strato interno. Ho controllato ora, l'errore nella formazione lunga è di circa il 45%, e non scende più in basso. La rete dà a quegli ingressi 1,3,5,7,9,11 pesi più alti quando si allena, ma non può realmente allenarsi a causa della mancanza di neuroni. Questa era l'idea di spremere il massimo risultato corretto da esso, in condizioni molto limitate, e vedere a quali input darà più peso.

Ora con il file di convalida, posso lavorare più seriamente. Ora ho diviso il file sorgente in 2 parti (85% e 15%), mi sono allenato sulla prima parte, a volte ho interrotto l'allenamento e ho misurato l'errore in entrambe le parti. Quegli esempi dal file del 15% non sono stati inseriti nell'addestramento, ma l'errore in essi è diminuito più o meno come nella parte di addestramento. Quando è diventato 0% in entrambe le parti del file, ho smesso di allenarmi e ho testato la neuronica sul secondo file, l'errore era ~0%. Si scopre che per questo compito il sovrallenamento non è stato nemmeno raggiunto, è divertente.


Ma la neuronica sul forex è peggio che in questo problema. All'inizio l'errore scende su entrambi i campioni di allenamento e di convalida. Poi l'errore continua a scendere sul campione di allenamento, ma inizia a crescere sul campione di test, a questo punto è il momento di interrompere l'allenamento. Poi di solito verifico il risultato sulla storia pre-campione e di nuovo sulla storia post-campione. Per me sono tre serie di dati, come i tuoi. Ma l'errore in tutti e tre i set è diverso finora (e grande al di fuori del periodo di allenamento).

Ho avuto diverse idee su come migliorare i risultati, per esempio smussare i risultati o aggiungere un filtro (<0.1 - vendere, >0.9 - comprare, e tutto ciò che sta in mezzo - periodo senza scambi). È possibile migliorare i risultati aggiungendo un filtro all'uscita neurale e ottimizzandolo anche, ma per il fronttest non ha aiutato affatto. Un'altra buona idea era che se il neurone è stato addestrato su un certo periodo di storia, allora si può ottimizzare il filtro sulla storia precedente a quel periodo. Perché un errore prima del periodo di ottimizzazione è probabilmente associato a un errore dopo il periodo di ottimizzazione. Ma non ha funzionato - se ci sono tre periodi della storia - "prima del neurone" - "neurone di apprendimento" - "dopo il neurone", allora tutti e tre avranno i loro filtri ottimali che non sono collegati in alcun modo.

Finora ho concluso che il modello dovrebbe avere un piccolo errore (<10%) per i campioni di allenamento e di test. Non applicare filtri sul risultato del modello, e nessuna ipotesi del tipo "invertire il risultato ogni quarta settimana". Non cadere in periodi più piccoli di M15. Provo diverse idee nuove ed è bene che almeno una su dieci migliori il risultato. E in qualche modo questo dovrebbe risultare in un modello redditizio.

 
Dr.Trader:

All'inizio non ho pensato di riqualificarmi in questo compito, non ce n'era bisogno. La prima volta era con un solo neurone nello strato interno. Ho controllato ora, l'errore durante l'allenamento lungo è di circa il 45%, e non scende più in basso. La rete dà a quegli ingressi 1,3,5,7,9,11 pesi più alti quando si allena, ma non può realmente allenarsi a causa della mancanza di neuroni. Questa era l'idea di spremere il massimo risultato corretto da esso, in condizioni molto limitate, e vedere a quali input darà più peso.

Ora con il file di convalida, posso lavorare più seriamente. Ora ho diviso il file sorgente in 2 parti (85% e 15%), mi sono allenato sulla prima parte, a volte ho interrotto l'allenamento e ho misurato l'errore in entrambe le parti. Quegli esempi dal file del 15% non sono stati inseriti nell'allenamento, ma l'errore in essi è diminuito più o meno come nella parte di allenamento. Quando è diventato 0% in entrambe le parti del file, ho smesso di allenarmi e ho testato la neuronica sul secondo file, l'errore era ~0%. Si scopre che per questo compito il sovrallenamento non è stato nemmeno raggiunto, è divertente.


Ma la neuronica sul forex è peggio che in questo problema. All'inizio l'errore scende su entrambi i campioni di allenamento e di convalida. Poi l'errore continua a scendere sul campione di allenamento, ma inizia a crescere sul campione di test, a questo punto è il momento di interrompere l'allenamento. Poi di solito verifico il risultato sulla storia pre-campione e di nuovo sulla storia post-campione. Per me, sono tre serie di dati, come i tuoi. Ma l'errore in tutti e tre i set è diverso finora (e grande al di fuori del periodo di allenamento).

Ho avuto diverse idee su come migliorare i risultati, per esempio smussare i risultati o aggiungere un filtro (<0.1 - vendere, >0.9 - comprare, e tutto ciò che sta in mezzo - periodo senza scambi). È possibile migliorare i risultati aggiungendo un filtro all'uscita neurale e ottimizzandolo anche, ma per il fronttest non ha aiutato affatto. Un'altra buona idea era che se il neurone è stato addestrato su un certo periodo di storia, allora si può ottimizzare il filtro sulla storia precedente a quel periodo. Perché un errore prima del periodo di ottimizzazione è probabilmente associato a un errore dopo il periodo di ottimizzazione. Ma non ha funzionato - se ci sono tre periodi della storia - "prima del neurone" - "neurone di apprendimento" - "dopo il neurone", allora tutti e tre avranno i loro filtri ottimali che non sono collegati in alcun modo.

Finora ho concluso che il modello dovrebbe avere un piccolo errore (<10%) per i campioni di allenamento e di test. Nessun filtro dovrebbe essere applicato al risultato del modello, e nessuna ipotesi come "invertire il risultato ogni quarta settimana". Non cadere in periodi più piccoli di M15. Provo diverse idee nuove ed è bene che almeno una su dieci migliori il risultato. E in qualche modo questo dovrebbe risultare in un modello redditizio.

È tutto nei dati )

I dati in tutti i set dovrebbero contenere osservazioni reciprocamente indipendenti. Ma anche in questo caso la convalida darà il risultato peggiore.
 

Ho provato diversi modelli di Rattle, anche la foresta ha dato buoni risultati.

Passo 1 - la foresta ha addestrato qualcosa, e nelle statistiche gli input 1,3,5,7,9,11 sembrano in qualche modo separati. Errore sul file di allenamento 0%, sul file di convalida 46%

Passo 2 - ha lasciato solo gli ingressi 1,3,5,7,9,11 nel file e il risultato. Ho addestrato di nuovo la foresta sul nuovo file, ora l'errore è 0% su entrambi i file di allenamento e di convalida, tutto è a posto. L'unica sfumatura è che Rattle per il secondo passo ha impostato il parametro "Numero di variabili" a 2, probabilmente perché il file è di dimensioni inferiori. L'ho cambiato in 4 come nel primo passo.

 

Dr.Trader

È bello vedere un fratello in mente basato sul sonaglio. Almeno possiamo confrontare i risultati.

Così e la mia esperienza personale.

Prendiamo sonagli e modelli da esso.

Nella scheda Model impariamo, ottenendo il valore dell'AOB, e nella scheda Evaluate valutiamo sui set Validation e Testing. Abbiamo tre cifre.

Io sostengo che i risultati ottenuti, se il set di predittori non è stato precedentemente ripulito dai predittori di rumore - questi risultati sono circa nulla, molto probabilmente solo un insieme di numeri.

Nella scheda Evaluate, oltre a ottenere i risultati elencati, il set deve essere messo nella finestra R Dataset. È molto importante che questo insieme sia ottenuto dividendo meccanicamente il file originale, cioè il primo file per tutte e tre le cifre, ad esempio dal 1° gennaio 2014 al 1° gennaio 2015, ma il file nel

R Dataset necessariamente dopo il 1 gennaio 2015 senza alcun campionamento casuale e altri trucchi utilizzati in R. È solo ottuso, meccanico.

Non riconosco altri modi di valutare il successo della separazione dei predittori significativi da quelli rumorosi, perché il metodo che propongo imita il trading reale.

Potresti per favore postare tutte e quattro le cifre? Compreso il risultato sul file dalla finestra R Dataset?

 
Dr.Trader:

Ho provato diversi modelli di Rattle, anche la foresta ha dato buoni risultati.

Passo 1 - la foresta ha addestrato qualcosa, e nelle statistiche gli input 1,3,5,7,9,11 sembrano in qualche modo separati. L'errore sul file di allenamento è dello 0%, sul file di convalida è del 46%.

Passo 2 - ha lasciato solo gli ingressi 1,3,5,7,9,11 nel file e il risultato. Ho addestrato di nuovo la foresta sul nuovo file, ora l'errore è 0% su entrambi i file di allenamento e di convalida, tutto è a posto. L'unica sfumatura è che Rattle per il secondo passo ha impostato il parametro "Numero di variabili" a 2, probabilmente perché il file è di dimensioni inferiori. L'ho cambiato in 4 come nel primo passo.

Interessante... La profondità deve essere impostata a 6 variabili per raccogliere tutte quelle rilevanti.
 
Dr.Trader:

Ho provato diversi modelli di Rattle, anche la foresta ha dato buoni risultati.

Passo 1 - la foresta ha addestrato qualcosa, e nelle statistiche gli input 1,3,5,7,9,11 sembrano in qualche modo separati. L'errore sul file di allenamento è dello 0%, sul file di convalida è del 46%.

Passo 2 - ha lasciato solo gli ingressi 1,3,5,7,9,11 nel file e il risultato. Ho addestrato di nuovo la foresta sul nuovo file, ora l'errore è 0% su entrambi i file di allenamento e di convalida, tutto è a posto. L'unica sfumatura è che Rattle per il secondo passo ha impostato il parametro "Numero di variabili" a 2, probabilmente perché il file è di dimensioni inferiori. L'ho cambiato in 4 come nel primo passo.

Nel primo, la foresta ha usato rumori per l'addestramento, il che non è buono.
 
SanSanych Fomenko:

Potresti per favore postare tutte e quattro le cifre? Includere il risultato nel file dalla finestra R Dataset?

Fatto questo con neuronka - dummy_set_features.csv è diviso in 3 parti 70%/15%/15%; dummy_set_validation.csv usato nella scheda evaluate come "file csv" (è essenzialmente lo stesso di R Dataset, solo il formato di file diverso).

Ho preso il log da Rattle, ho rimosso quelle due limitazioni dalla chiamata neuronics, di cui ho scritto prima, l'ho eseguito in R, ma il modello è ancora poco addestrato (35% di errore sul campione di allenamento). Quindi succede che se si riduce il campione di allenamento, allora il risultato dell'allenamento è peggiore. Ma si può aumentare il numero di neuroni nello strato interno, dovrebbe migliorare l'apprendimento.

Ho cambiato il numero di neuroni da 10 a 20, ho rieseguito la formazione, ora l'errore nella formazione è diventato 0%. L'errore sul campione di convalida è dello 0,6%, l'errore sul campione di prova è dello 0,1%. L'errore sul file dummy_set_validation.csv è dello 0,3%. Tutto bene, R nella domanda.

Interessante, si scopre che i problemi di addestramento dei neuroni sono molto diversi dai problemi degli alberi. Per me il problema con nn è prendere il giusto numero di neuroni interni, e sospendere l'apprendimento prima che la rete inizi a riqualificarsi. Fondamentalmente, più neuroni ci sono e meglio è, ma questo influisce notevolmente sulla RAM richiesta e sul tempo di allenamento. I predittori superflui non sono un grande ostacolo per l'apprendimento, i neuronici di solito imparano altrettanto bene con loro, ma aumentano il tempo di formazione, ed è meglio liberarsene per renderlo più veloce.

Una volta che ho usato la rete mt4 auto-scritta, un EA potrebbe imparare e commerciare immediatamente. Ci sono stati problemi con la velocità di apprendimento, l'inizializzazione dei pesi, gli algoritmi di apprendimento. C'erano troppi piccoli problemi, era difficile ottenere buoni risultati anche con un campione di allenamento, così alla fine ho rinunciato e ora lavoro in R. Il pacchetto nnet può allenarsi con l'algoritmo bfgs, rimuove tutti quei piccoli problemi. Ma il pacchetto ha un limite di 1 solo strato interno. Voglio avere almeno 3 strati interni, ma con l'algoritmo bfgs, altrimenti ci saranno un sacco di problemi con l'apprendimento di nuovo.

File:
r_nnet2.txt  10 kb
 
Dr.Trader:

Fatto questo con neurone - dummy_set_features.csv è diviso in 3 parti 70%/15%/15% come standard; dummy_set_validation.csv usato nella scheda evaluate come "file csv" (questo è essenzialmente lo stesso di R Dataset, solo il formato di file diverso).

No, non è lo stesso.

Cosa sorprendente, discuto di questo problema con molte persone e NESSUNO lo fa come scrivo io. E so cosa sto scrivendo, dato che ho passato mezzo anno su esercizi come il tuo, e fuori il rattle(). Quello che non metto nel tester, ottengo un errore completamente diverso. Poi ho fatto quello che ho descritto sopra e l'errore nel tester ha praticamente coinciso con l'errore nel file R Dataset.

Ho dato ad Alexey tre file, che si ottengono dividendo meccanicamente un grande file in tre parti. Nella prima parte ci esercitiamo, impariamo, valutiamo... E sugli altri due, controlliamo i numeri che abbiamo ottenuto sul primo. Se tutti e tre i file hanno errori superiori al 20%(!), o più precisamente, più vicini al 40%, il modello non viene riqualificato e si può lavorare con esso.

I 3 file di cui sopra hanno 27 predittori e 6 variabili target. I 27 predittori sono stati selezionati da 170 predittori dai miei algoritmi. Ad oggi, questi 27 predittori non portano a modelli sovrallenati. Ma i rimanenti 143 predittori del mio set sono rumore e su questo rumore si può facilmente ottenere un errore paragonabile al tuo, ma il modello è sovrallenato e non è adatto per ulteriori usi.

Perché c'è meno errore sui predittori di rumore che sui predittori significativi?

Per come la vedo io, poiché l'algoritmo di adattamento del modello cerca di ridurre l'errore di adattamento, è sempre in grado di trovare qualcosa tra i valori rumorosi e casuali che sia migliore dei predittori significativi. Di conseguenza, più piccolo è l'errore, meno predittori significativi sono coinvolti nella costruzione del modello!

PS

A giudicare dall'errore, o NS è sovrallenato al 100%, o guarda avanti.

 

Il "file CSV" e il "dataset R" nella scheda di valutazione sono semplicemente modi diversi di specificare l'origine dei dati. Se si inseriscono gli stessi dati, si otterrà lo stesso risultato quando si testa il modello.

Se prima del sonaglio eseguire

dataset_validate <- read.csv("file:///C:/dummy_set_validation.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")

allora questo dataset_validate sarà ora disponibile nella scheda evaluate come R dataset. Ma il risultato del controllo del modello finirà per essere lo stesso se si seleziona semplicemente l'opzione file csv e si specifica il file C:/dummy_set_validation.csv, i dati per il test saranno identici in entrambi i casi.

La formazione stessa era su un file diverso, dummy_set_features.csv, quindi guardare avanti è impossibile qui, perché i dati in entrambi i file sono diversi, e non dipendono affatto dal tempo (ma dalla formula). Penso che la rete neurale ha fatto un ottimo lavoro e ha trovato 6 input che determinano il risultato, ha ridotto l'influenza di altri input, e con un po' di logica neurale ha descritto la formula desiderata.

Per sicurezza ho controllato entrambi i file per trovare stringhe duplicate, se ce ne sono. Ecco il codice in R:

#читаем  данные из файлов для обучения и валидации
dataset_train <- read.csv("file:///C:/dummy_set_features.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")
dataset_validate <- read.csv("file:///C:/dummy_set_validation.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")

anyDuplicated(dataset_train) #количество  повторных строк в первом файле - 567
anyDuplicated(dataset_validate) #количество  повторных строк во втором файле - 202
#  это покачто просто повторные строки в обоих файла по отдельности. Это не вредит, но и ничего не улучшает, лучше их убрать.
dataset_train <- unique(dataset_train)
dataset_validate <- unique(dataset_validate)

#Теперь  можно узнать сколько строк из dataset_train повторяются в dataset_validate
dataset_combined <- rbind(dataset_train, dataset_validate) #Объединяем  оба файла в один
nrow(dataset_combined) - nrow(dataset_combined[!duplicated(dataset_combined), ]) #количество  повторенных строк - 23. Таких повторов быть не должно, их надо удалить.
#Удаление  повторенных строк из dataset_validate
dataset_validate <- dataset_validate[!(tail(duplicated(dataset_combined), nrow(dataset_validate))), ]
#Удаление  из памяти объединённого файла, он больше не нужен
rm(dataset_combined)

Se questo viene fatto prima di rattle, allora entrambe le tabelledataset_train edataset_validate sono disponibili per la formazione e la verifica del modello, e non ci saranno duplicati. Gloria R.

il file di convalida del modello conteneva 23 ripetizioni dal campione di allenamento, ma oltre a questo ha altre 3000 righe uniche, quindi la valutazione del modello non poteva essere significativamente influenzata.

 
Questo è il modo in cui dovrebbe essere. Il file è generato da numeri casuali.

In generale, ho sopravvalutato la complessità del compito. È già risolto dalla foresta, infatti. Ci si potrebbe chiedere come questo sia possibile alla luce del modo in cui funziona la foresta.