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

 
mytarmailS:
L'ho già fatto, la rete neurale non impara su un orizzonte più grande con l'obiettivo che gli ho dato

Sorrido alle sue parole.

Non è una rete neurale che non impara, ma la si fa non imparare, letteralmente. La rete neurale imparerà dove c'è un segnale oltre al rumore, ma il vostro compito è quello di separare questo segnale dal rumore con l'aiuto della Grande Rete Neurale, senza lasciare che impari troppo.

 
Alexey Burnakov:
Questa è una risposta più corretta). Proverò diversi metodi.

Una volta ho suggerito questo approccio.

Prendiamo un Expert Advisor, può essere da kodobase. La cosa principale è che deve essere a sangue pieno e non importa se sta perdendo. È possibile impostare i requisiti preliminari. Per esempio: trending, tre finestre, senza SL e TP, MM, recupero errori di stati...

Dovremmo guardare la ragione della perdita e cercare di risolverla usando R. Risolviamo i problemi nelle finestre basse estrapolando, nella finestra alta prevediamo la prossima barra tramite classificazione.

 
Alexey Burnakov:

Il mio articolo sulla selezione delle caratteristiche.

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

È stato interessante da leggere, grazie per il duro lavoro. Non capisco l'esperimento 6 - perché alla fine sono stati selezionati i predittori Y e Z? Z è la variabile obiettivo, non avrebbe dovuto essere nella lista dei predittori.

Mi piace l'idea di prendere un grafico di coniglio 3D e di addestrare il modello su di esso. Per essere onesti, all'inizio ho pensato che il "coniglio" è una specie di dato pseudo-casuale che sembra bello sul grafico e ha senso solo per un umano con la sua capacità di vedere il coniglio in una serie di numeri. Ma non c'è nessuna funzione che descrive il coniglio, per qualsiasi modello è solo un insieme di punti che formano gruppi di forme speciali nello spazio 3-d. Dal mio punto di vista tutte e tre le coordinate di ogni punto non hanno relazioni e dipendenze tra loro, mi aspettavo che nessun algoritmo potesse gestirle. Alla fine dell'articolo sono rimasto sorpreso.

Ho provato lo stesso esperimento con la PCA, e i risultati sono i seguenti:
Ho bisogno di un componente per il 95% di precisione, usa X e Y. Ma l'algoritmo di predizione non funziona con un solo componente, ho bisogno di almeno due. Fondamentalmente entrambi usano X e Y (non è mostrato nel codice, ma si può vedere nel grafico), quindi è ok.
Addestrare il modello sul campioneA, poi prevedere Z per il campioneA: R^2 = 0.04759303
Allenare il modello sul campioneA, poi prevedere Z per il campioneB: R^2 = 0.05325888

Ho disegnato una trama 3d della Z prevista per il campioneB, è venuta male. Il modello non ha davvero trovato alcuna dipendenza, ha solo fatto la media di tutte le Z in un piano. Il coniglio è uscito piatto. Hai provato ad addestrare alcuni modelli e a disegnare un coniglio previsto? Mi chiedo come funziona per i diversi modelli.

In allegato il codice per il coniglio e il pca y-aware. C'è un piccolo bug, il grafico dei caricamenti dei predittori sta ordinando i componenti per qualche motivo. Cioè sono 1,10,11,12,2,3,4,5,... ma in ordine di importanza dovremmo guardare in questo ordine: PC1, PC2, PC3,...

File:
bunny_pca.txt  5 kb
 
mytarmailS:
L'ho già fatto, la rete neurale non impara su un orizzonte più ampio con l'obiettivo che ho impostato

Non ho ancora provato ad allenare il neurone oltre una barra, ma presumo che il principio sia lo stesso. Io ci lavoro come segue:

1) raccogliere quanti più dati grezzi possibile da mt5 - ohlc, tempo, indicatori. Siccome non so cosa sia utile e cosa no, prendo tutto e cerco di setacciare la spazzatura. Non posso inviare tutto a neuronka, perché neuronka si riaddestra sulla spazzatura e in questo caso fa un errore nel fronttest. Non è facile setacciare la spazzatura, infatti tutte le 28 pagine di questo thread sono su come farlo, e finora tutto è ambiguo. Aggiungo una variabile target ai dati - 0 o 1 a seconda del calo/aumento del prezzo per la prossima barra.

2) Vaglio dei detriti vero e proprio. Ci dovrebbe essere una funzione che analizza i dati iniziali e gli dà un punteggio. Più alta è la stima - meno spazzatura. Proviamo ad alimentare la funzione di valutazione con varie combinazioni di predittori di origine (colonne della tabella di formazione) e cerchiamo di aumentare il risultato. Alla fine si troverà un certo insieme di predittori, che in teoria non porterà al sovrallenamento.

3) Supponiamo che la spazzatura venga eliminata. Ora è il momento di addestrare la rete neurale. Uso il pacchetto nnet di R, ha dei vantaggi sotto forma di assenza di iperparametri come velocità di allenamento, accelerazione, ritardo, tipi di funzioni di allenamento. Meno iperparametri significano meno problemi. È necessario allenarsi con la convalida incrociata. Prendo la tabella iniziale e la divido in tre righe con un rapporto 70%/15%/15% (le nuove tabelle si chiamano train/test/validate) (il codice può essere preso da rattle log, sono partito da esso). Poi faccio per esempio 10 iterazioni di neuroni di addestramento sulla tabella del treno. Calcolo l'errore di previsione R^2. Prevedo i risultati per i test e convalido le tabelle e calcolo R^2 anche per loro. Faccio altre 10 iterazioni di allenamento, ripeto la predizione per 3 tabelle e guardo il nuovo R^2. Fermate l'allenamento nel momento in cui R^2 su alcune delle tabelle comincia a scendere (crescerà sempre e solo sulla tabella dei treni). Fatto. Ora potete ripetere tutto questo di nuovo, usando un numero diverso di neuroni nascosti e un numero diverso di iterazioni di allenamento tra le crossvalidazioni, nella speranza che il minimo R^2 di tre tabelle alla fine sia più alto dell'ultima volta.

Tutto questo può sembrare un po' complicato, ma in realtà è ancora più complicato :), ci sono un sacco di problemi in ognuno di questi passi. Ma dà risultati coerenti.

 
SanSanych Fomenko:

È un bene che tu non abbia imparato, perché tu insegni sul rumore. Ma se lo facessi, impareresti sul graal, sul real....

Occupato qui a cercare di eliminare il rumore. Ecco perché prendiamo così tanti predittori nella speranza che almeno qualcosa rimanga.

Stai cercando di usare il rumore come trainer, dovresti capire che se lo stocastico (per esempio) avesse il numero magico 90 e il mercato cadesse quando l'indicatore ha un tale valore, non avremmo bisogno di reti, sarebbe visibile.

1) Nella migliore delle ipotesi quello che si fa è selezionare i migliori 10 indicatori su 100 possibili secondo alcuni criteri, e l'indicatore ha una gamma di valori, diciamo 100 su questi 100 valori solo 3 funzionano e non sempre ma in certe situazionisolo questi 3 valori non sono rumore e solo loro dovrebbero essere tenuti al posto dell'indicatore in quanto i valori rimanenti sono lo stesso rumore, quindi tutti questi scarti sono qualitativamente poco profondi e quindi poco efficienti

2) Inoltre, c'è una nozione come incoerenza degli attributi, per esempio, prendete il prezzo, è oggettivo e non contraddittorio, cioè, se il prezzo è in aumento, è in aumento e non c'è un secondo (se ignoriamo le sfumature della forza del trend, ecc.), prendete lo stesso stocastico, può prendere 90 valori quando il trend è piatto e su e giù, cioèD'altra parte, questo indicatore non aiuta la rete, al contrario, confonde sempre il mercato perché le sue letture sono incoerenti, quindi gli indicatori ordinari non sono applicabili al mercato , e tu non ci pensi nemmeno, ti limiti a riempire tutto, e poi mi parli del rumore.

Non sono soddisfatto dell'orizzonte di previsione come ho scritto sopra.

 
Dr.Trader:

È stato interessante da leggere, grazie per lo sforzo. Non capisco l'esperimento 6 - perché alla fine sono stati selezionati i predittori Y e Z? Z è la variabile obiettivo, non avrebbe dovuto essere nella lista dei predittori.

Mi piace l'idea di prendere un grafico di coniglio 3D e di addestrare il modello su di esso. Per essere onesti, all'inizio ho pensato che il "coniglio" è una specie di dato pseudo-casuale che sembra bello sul grafico e ha senso solo per un umano con la sua capacità di vedere il coniglio in una serie di numeri. Ma non c'è nessuna funzione che descrive il coniglio, per qualsiasi modello è solo un insieme di punti che formano gruppi di forme speciali nello spazio 3-d. Dal mio punto di vista tutte e tre le coordinate di ogni punto non hanno relazioni e dipendenze tra loro, mi aspettavo che nessun algoritmo potesse gestirle. Alla fine dell'articolo sono rimasto sorpreso.

Provato lo stesso esperimento con PCA, i risultati sono come questo:
Un componente è necessario per il 95% di precisione, utilizza X e Y. Ma l'algoritmo di predizione non funziona con un solo componente, bisogna prenderne almeno due. Fondamentalmente entrambi usano X e Y (non è mostrato nel codice, ma si può vedere nel grafico), quindi è ok.
Addestrare il modello sul campioneA, poi prevedere Z per il campioneA: R^2 = 0.04759303
Allenare il modello sul campioneA, poi prevedere Z per il campioneB: R^2 = 0.05325888

Ho disegnato una trama 3d della Z prevista per il campioneB, è venuta male. Il modello non ha davvero trovato alcuna dipendenza, ha solo fatto la media di tutte le Z in un piano. Il coniglio è uscito piatto. Hai provato ad addestrare alcuni modelli e a disegnare un coniglio previsto? Mi chiedo come funziona per i diversi modelli.

In allegato il codice per il coniglio e il pca y-aware. C'è un piccolo bug, il grafico dei caricamenti dei predittori sta ordinando i componenti per qualche motivo. Cioè sono 1,10,11,12,2,3,4,5,... ma in ordine di importanza dovresti guardare in questo ordine: PC1, PC2, PC3,...

Allora, avete X e Y nei componenti principali? Questo sarebbe importante da capire.

In secondo luogo, riguardo all'approssimazione del coniglio. Certo che dovrebbe esserlo! È un modello lineare. Disegnerà semplicemente un piano (se X e Y) con un po' di pendenza, o una linea (se un solo predittore). Questo è l'intero modello lineare del coniglio ) Ecco perché cerco di usare modelli non lineari.

Ecco come ricostruire il coniglio usando un altro metodo (basato su valori discreti).

 
Alexey Burnakov:

Quindi, X e Y sono apparsi nei componenti principali? Sarebbe importante capire.

Sì, solo X e Y. Non ho ancora trovato come farlo via codice, tutti gli articoli su questo funzionano con i grafici. Il numero di componenti da prendere può essere visualizzato nella variabile componentsToUse. In questo caso componentsToUse = 2, significa che dovete prendere solo quei predittori che hanno linee orizzontali larghe sul grafico per PC1 e PC2.

In quel grafico sopra, guarda le colonne PC1 e PC2 (la prima e la seconda componente principale), e poi le linee orizzontali verdi. Se la linea si allontana da 0 (che sia positiva o negativa), allora quel predittore viene utilizzato nella componente principale corrispondente. PC1 usa y_clean ("_clean" viene aggiunto automaticamente quando si scalano i dati per evitare confusione con il predittore originale), PC2 usa x_clean. Questo è il risultato dell'analisi dei componenti PCA - devi prendere x_clean e y_clean.

Andando avanti, il PC3 userebbe input_noise_3_clean. Questo è solo un esempio, il PC3 non è necessario in questo caso.

Questo in realtà ha funzionato molto bene. X e Y si distinguono chiaramente sul grafico. Ho postato in precedenza lo stesso grafico per il forex dove tutto va male.

 
Dr.Trader:

Sì, solo X e Y. Non ho ancora trovato come fare questo attraverso il codice, tutti gli articoli su questo operano con i grafici. Il numero di componenti da prendere può essere visualizzato nella variabile componentsToUse. In questo caso componentsToUse = 2, significa che dovete prendere solo quei predittori che hanno linee orizzontali larghe sul grafico per PC1 e PC2.

In quel grafico sopra, guarda le colonne PC1 e PC2 (la prima e la seconda componente principale), e poi le linee orizzontali verdi. Se la linea si allontana da 0 (non importa se è positiva o negativa), allora quel predittore è usato nel componente principale corrispondente. PC1 usa y_clean ("_clean" viene aggiunto automaticamente quando si scalano i dati per evitare confusione con il predittore originale), PC2 usa x_clean.

Andando avanti, il PC3 userebbe input_noise_3_clean. Questo è solo un esempio, il PC3 non deve essere usato in questo caso.

Questo in realtà ha funzionato molto bene. X e Y si distinguono chiaramente nel grafico. Ho postato lo stesso grafico per il forex prima, ma non è così buono lì.

La selezione dei predittori qui si è rivelata essere attraverso il metodo lineare. Beh, sono contento che tu sia sorpreso. Significa che hai visto qualcosa di nuovo)
 
Dr.Trader:

Non ho ancora provato ad allenare il neurone oltre una barra, ma presumo che il principio sia lo stesso. Io ci lavoro come segue:

1) raccogliere quanti più dati grezzi possibile da mt5 - ohlc, tempo, indicatori. Siccome non so cosa sia utile e cosa no, prendo tutto e cerco di setacciare la spazzatura. Non posso inviare tutto a neuronka, perché neuronka si riaddestra sulla spazzatura e in questo caso fa un errore nel fronttest. Non è facile setacciare la spazzatura, infatti tutte le 28 pagine di questo thread sono su come farlo, e finora tutto è ambiguo. Aggiungo una variabile target ai dati - 0 o 1 a seconda del calo/aumento del prezzo per la prossima barra.

2) Vaglio dei detriti vero e proprio. Ci dovrebbe essere una funzione che analizza i dati iniziali e gli dà un punteggio. Più alta è la stima - meno spazzatura. Proviamo ad alimentare la funzione di valutazione con varie combinazioni di predittori di origine (colonne della tabella di formazione) e cerchiamo di aumentare il risultato. Alla fine si troverà un certo insieme di predittori, che in teoria non porterà al sovrallenamento.

3) Supponiamo che la spazzatura venga eliminata. Ora è il momento di addestrare la rete neurale. Uso il pacchetto nnet di R, ha dei vantaggi sotto forma di assenza di iperparametri come velocità di allenamento, accelerazione, ritardo, tipi di funzioni di allenamento. Meno iperparametri significano meno problemi. È necessario allenarsi con la convalida incrociata. Prendo la tabella iniziale e la divido in tre righe con un rapporto 70%/15%/15% (le nuove tabelle si chiamano train/test/validate) (il codice può essere preso da rattle log, sono partito da esso). Poi faccio per esempio 10 iterazioni di neuroni di addestramento sulla tabella del treno. Calcolo l'errore di previsione R^2. Prevedo i risultati per i test e convalido le tabelle e calcolo R^2 anche per loro. Faccio altre 10 iterazioni di allenamento, ripeto la predizione per 3 tabelle e guardo il nuovo R^2. Fermate l'allenamento nel momento in cui R^2 su alcune delle tabelle inizia a scendere (crescerà sempre e solo sulla tabella dei treni). Fatto. Ora potete ripetere tutto questo di nuovo, usando un numero diverso di neuroni nascosti e un numero diverso di iterazioni di allenamento tra le crossvalidazioni, nella speranza che il minimo R^2 di tre tabelle alla fine sia più alto dell'ultima volta.

Tutto questo può sembrare un po' complicato, ma in realtà è ancora più complicato :), ci sono un sacco di problemi in ognuno di questi passi. Ma dà risultati coerenti.

Io ho un punto di vista diverso e tu non lo capisci
 

SanSanych Fomenko:
E se prendete i primi 10 (più o meno) prima del passo, e scartate il resto?

Ho disegnato un grafico di R^2 e della percentuale di casi vincenti in funzione del numero di componenti utilizzati. Il miglior risultato sul fronttest è stato con 41 componenti (guadagno di circa il 70%, molto buono). Ma non si può dire che dai grafici di backtest, continuano a salire continuamente. Se ci basiamo sull'importanza dei componenti, avremmo dovuto prendere 73, che non è il miglior risultato nel fronttest.

R^2 del fronttest può essere negativo anche quando vince >50% dei casi, a causa di risultati richiesti sbilanciati, il numero di classi "0" è diverso da "1", quindi la loro media non è 0,5, e R^2 da questo è leggermente peggiore.