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

 
Mihail Marchukajtes:
No, ragazzi, il sistema è andato, non ha nemmeno senso mostrarlo.

Potrebbe essere perché ho dimenticato di avvertire che il classificatore ternario ha cambiato la sua logica?

Il binario ha la stessa logica: se il valore di uscita è inferiore a zero, è come uno 0 nel campione. Se è di più, è 1 nel campione.

E ternario se l'uscita è: 1 come 1 nel campione, 0 come 0 nel campione, -1 come "-" in jPrediction.

 


fatto un comitato di 8 modelli per interesse e simulato sulla convalida una sequenza di 4000 mestieri (5,5 anni di trading). Questa è una simulazione Monte Carlo per avere un'idea della possibile portata della crescita dei depositi, senza aggiustare i punti di scambio iniziali (che dà una corsa nel tester della strategia). Qui il MO sulla convalida è 0,00026 pips. Il quantile inferiore è ovviamente sopra lo zero, che è quello che volevo ottenere.

Poi analizzeremo la distribuzione del fattore di recupero per queste serie.

Questa è la distribuzione del fattore di recupero. La mediana di 3,7 è più o meno il valore obiettivo (piano). Anche il quantile inferiore non è male...

Dobbiamo ancora aspettare una corsa di formazione su altri 80 campioni di formazione e fare un comitato più grande.

 
Yury Reshetov:

Potrebbe essere perché ho dimenticato di avvertire che il classificatore ternario ha cambiato la sua logica?

Il binario ha la stessa logica: se il valore di uscita è inferiore a zero, è come uno 0 nel campione. Se è di più, è 1 nel campione.

E ternario se l'uscita è: 1 come 1 nel campione, 0 come 0 nel campione, -1 come "-" in jPrediction.

ҮNo ho capito, va bene così.... C'è un'altra cosa qui. Il punto è che l'ottimizzatore è molto bravo a trovare dati contenenti informazioni sull'output. Una volta trovati i dati con una generalizzazione superiore all'80%. Questi dati possono essere utilizzati con successo in qualsiasi altra topologia di rete e il risultato dell'addestramento sarà perfetto, senza ri-addestramento ecc. Questo è per coloro che non vogliono usare l'ottimizzatore direttamente nel trading. Nel mio caso si è rivelato che i dati utilizzati per la classificazione dell'uscita non sono stati del tutto efficaci, quindi i risultati degli scambi di venerdì non erano quelli che avrei voluto. Tuttavia, non mi sono scoraggiato e ho trovato un altro set di predicati che, se costruito ripetutamente, non ha portato ad uno stato di spazzatura in entrata e in uscita....... comunque ecco alcune raccomandazioni per utilizzare il classificatore come un filtro di segnale intelligente per il vostro TS (non la previsione)

1. Separa i segnali di acquisto e di vendita separatamente. Se usate dati di valori precedenti e tale separazione confonde l'ordine dei dati, allora necessariamente uno dei predicati dovrebbe essere il segno del segnale. Buy=1, Sell=-1, cioè uno dei predicati sarà la direzione del segnale.

2. I predicati devono essere in qualche modo legati al sistema di predizione. L'ho come Zscore del segnale, Kelli del segnale, ordine del segnale (il sistema non è reversibile, quindi ci possono essere diversi segnali consecutivi in una direzione). Fondamentalmente, le informazioni che in qualche modo si riferiscono al sistema. Si può anche prendere il Momentum, separatamente nell'ottimizzatore MT4 ho selezionato un parametro che dà profitto su un periodo di prova, quando si fa trading con i segnali del sistema. Cioè il Momentum è ottimizzato per i segnali del sistema sull'area di allenamento, ecc.

3. Uscire. Questa è la parte più importante, perché nel mio caso l'uscita di 100 pips ha dato il 50% di generalizzazione del profitto, e cambiato a 10 pips e la generalizzazione è cresciuta al 65%. Nel TS di Demark è abbastanza difficile da fare. Spesso devo guardarlo manualmente, perché la formalizzazione dell'approccio in questo caso non passa........ Nell'area di formazione è meglio fare errori nei segnali, ma ottenere comunque un modello con un alto livello di generalizzazione. Diciamo che il segnale ha guadagnato 100 pips in formazione e lo abbiamo ancora segnato come 0 perché il mercato era incline al rovescio del segnale. Cioè lasciamo deliberatamente perdere il TS per aumentare il livello di generalizzazione e quindi far funzionare meglio il TS in futuro. Dopo tutto il nostro output è ideale, lasciamo che sia un po' non ideale, ma corretto....

4) Usa i volumi di trading del CME nelle previsioni. Questo funziona davvero e aumenta il livello di generalizzazione del modello in modo SIGNIFICATIVO...... Prendo dal cluster delta, quindi è come questo.....

 
Alexey Burnakov:

Questa è una simulazione Monte Carlo per avere un'idea della possibile gamma di crescita del deposito, senza aggiustare i punti di scambio iniziali (che dà una corsa nel tester della strategia).

Spero che, indipendentemente da come si spostano i punti di partenza degli scambi, siano tutti dopo il periodo di formazione. Per esempio, se hai addestrato il modello sui dati di gennaio e marzo 2015 (rimuovendo i dati di febbraio), allora non dovresti fare la validazione finale a febbraio, anche se questi dati non erano nel campione di addestramento, ma tali risultati non saranno affidabili. La convalida mostrerà i risultati adeguati attesi nel trading reale solo se la si inizia nell'aprile 2015, dopo tutte le date che potrebbero essere state utilizzate dal modello nell'addestramento o nelle crossvalidazioni per adattare i parametri del modello.

Il mio secondo tentativo (regressione arrotondata a [0;0.5;1]) sui vostri dati non ha avuto successo. Il modello e la genetica hanno scelto di nuovo l'opzione di classe costante "no trade".
Apparentemente, per prevedere tre classi il neurone deve necessariamente avere 3 uscite, altrimenti non può inserire tre classi in un'uscita a livelli. Oppure ho dovuto rimuovere la classe "non scambiare" e lasciare due classi e lavorare con loro.

Per controllare in qualche modo qualcosa sul fronttest ho preso una lista di predittori selezionati dalla genetica, ho addestrato un neurone su di essi (tutto è corretto, con tre uscite e con fattore in ingresso) attraverso caret con crossvalidations (metodo = "repeatedcv"). Si è rivelato così così, la precisione anche sui dati di allenamento è solo del 40%.
Ho notato solo ora che il file di convalida ha numeri reali nelle sue uscite, non classi. Li ho appena sostituiti con +1 per tutti i positivi e -1 per tutti i negativi.
Inoltre, ho ottenuto due precisioni per il fronttest:
1) dato che a predizione=0 il modello non dovrebbe fare trading, allora il risultato corretto è irrilevante, perché il trade non sarà aperto e non influenzerà le statistiche finali. In questo caso le previsioni -1 e 1 sono corrette il 51% delle volte (ignorando tutti gli esempi in cui la previsione è 0).
2) Prendi tutte le previsioni, confrontale con tutti i risultati corretti. In questo caso la precisione = 14%, anche peggiore della casualità.

Mi sto chiedendo quale sarà il risultato del modello di trading nel vostro emulatore di trading, potreste per favore fare un grafico come sopra ma con il modello che ho allegato?
Il file RData era troppo grande e il forum non l'ha accettato immediatamente. Ho fatto due archivi vinrar e li ho messi separatamente in archivi zip. È necessario estrarre entrambi gli archivi zippati, poi aprire il primo archivio zippato, estrarre i dati, il secondo archivio zippato si aggancia da solo e soprattutto devono essere nella stessa cartella.
Oppure puoi eseguire lo script r allegato, che contiene una lista di predittori selezionati, e genererà un modello con essi. Dovresti avere il file csv originale che hai postato, è usato.
Lo stesso script può anche essere eseguito dopo aver aperto RData dall'allegato, lo script prenderà il modello pronto invece di crearne uno nuovo, c'è un esempio di predizione e stima della precisione nel codice. Il file RData che hai postato prima è necessario per il fronttest.

Visti gli errori del passato, sto iniziando il mio terzo tentativo.

 
Dr.Trader:

1) considerando che a predizione=0 il modello non dovrebbe fare trading, allora il risultato corretto non ha importanza, perché il trade non sarà aperto e non influenzerà le statistiche finali. In questo caso le previsioni -1 e 1 sono corrette nel 51% dei casi (ignorando tutti gli esempi in cui la previsione è 0).

Per una risposta sbagliata darei -2 punti, per nessuna risposta -1, per una risposta corretta 1. La proporzione di punti assegnati per le risposte può essere cambiata in un modo o nell'altro, ma è importante che la rete non si incasini inutilmente, quindi si dovrebbe penalizzare l'"astensione".

Il comitato di due reti ha dato ciascuno 1 segnale, -1 (o 0) nessun segnale, se i segnali erano contraddittori il segnale finale era 0. Quindi i segnali delle reti sono stati combinati in un segnale totale di [-1, 0, 1].

 

Dr.Trader:

Spero che, indipendentemente da come si spostano i punti di partenza degli scambi, siano tutti dopo il periodo di formazione. Per esempio, se hai addestrato il modello sui dati di gennaio e marzo 2015 (rimuovendo i dati di febbraio), allora non dovresti fare la validazione finale a febbraio, anche se questi dati non erano nel campione di addestramento, ma tali risultati non saranno affidabili. La convalida mostrerà i risultati adeguati attesi nel trading reale solo se la si inizia nell'aprile 2015, dopo tutte le date che potrebbero essere state utilizzate dal modello nell'addestramento o nelle crossvalidazioni per adattare i parametri del modello.


Sì, certo, si può essere di ferro. È esattamente la convalida. È solo che le sequenze di transazioni sono campionate casualmente da un grande volume di osservazioni. Monte Carlo è necessario per capire dove potrebbe essere la curva di scambio. Qualsiasi spostamento degli scambi di pochi minuti in una direzione o nell'altra genera le proprie curve. Nel tester MT vedo una curva - un'implementazione. Se costruisco una condizione con un generatore di numeri casuali su ogni trade e apro con un numero casuale, posso eseguire il tester della strategia 500 volte e ottenere le stesse curve. Ma in MT ci vorrebbe molto tempo. E ne ho bisogno in 30 secondi.

Poi, quando faccio l'EA sulla commissione, eseguirò la convalida nel tester di strategia. La curva dovrebbe entrare in un ventilatore e otterrò un valore unico del fattore di recupero e un'aspettativa matematica. Ma non si possono trarre conclusioni da una sola corsa. Non desiderabile.

 
Dr.Trader:


Mi sto chiedendo quale sarà il risultato del trading del modello nel vostro emulatore di trading, potreste fare un grafico come sopra, ma il trading con il modello che ho allegato?
Il file RData è troppo grande e il forum non l'ha accettato subito. Ho fatto due archivi vinrar e li ho messi separatamente in archivi zip. È necessario estrarre entrambi gli archivi zippati, poi aprire il primo archivio zippato, estrarre i dati, il secondo archivio zippato si aggancia da solo e soprattutto devono essere nella stessa cartella.
Oppure puoi eseguire lo script r allegato, che contiene una lista di predittori selezionati, e genererà un modello con essi. Dovresti avere il file csv originale che hai postato, è usato.
Lo stesso script può anche essere eseguito dopo aver aperto RData dall'allegato, lo script prenderà il modello pronto invece di crearne uno nuovo, c'è un esempio di predizione e stima della precisione nel codice. Il file RData che hai postato prima è necessario per il fronttest.

Considerando gli errori del passato, iniziare un terzo tentativo.

E quale modello stai imparando, Rete Neurale?

Lasciatemi provare più tardi. Ho un modello che apprende su tutti i core 24 ore su 24.

In realtà, pensavo che saresti stato tu a giudicare. Basta sostituire le previsioni del modello nel file di convalida che ho dato al link. Queste dovrebbero essere direzioni della forma +1 / -1 / 0. Ci sarà una nuova colonna di previsioni. Moltiplicare la colonna di previsione per la colonna di destinazione. Sottrarre 0,0001 di spread. Elimina le voci in cui l'output del modello è 0. Prendi la funzione cumsum:

plot(cumsum(your_data$trades_simulated_after_spread), type = 'l')

 mean(your_data$trades_simulated_after_spread)

Approssimativamente, questo graficherà il commercio su tutte le osservazioni e calcolerà il MO. È semplice.

 
Alexey Burnakov:

E quale modello sta imparando, la Rete Neurale?

...

Moltiplicare la colonna di previsione per la colonna di destinazione.

Sì, sto imparando una rete neurale, il pacchetto nnet. In questo caso, sto allenando il modello con il caret, che raccoglie un paio di parametri del modello.

Ho guardato di nuovo la colonna dei risultati nel tuo file RData, ora ho visto subito che si trattava di guadagni di prezzo. L'ultima volta ho pensato che fosse una specie di probabilità.
Mi è piaciuto come si memorizza l'incremento di prezzo nella variabile di destinazione, se necessario si può facilmente convertirli in classi per la formazione, o calcolare i profitti. Lo farò anch'io.

Ho capito tutto, grazie per il chiarimento, ho contato il profitto, calcolato lo spread, disegnato il grafico. Peccato, MO = -2.052423e-05, perdita lenta ma sicura.

Per quanto riguarda lo spread, deve essere preso in considerazione solo in 4 casi:
1, 2) Previsione dell'ultima barra = 0; previsione della nuova barra = -1 o 1. Apertura di una nuova posizione.
3) Previsione per l'ultima barra = -1; previsione per la nuova barra = 1. Inversione, la vecchia posizione viene chiusa, la nuova posizione viene aperta.
4) Previsione per la barra precedente = 1; previsione per la nuova barra = -1. Inversione, la vecchia posizione viene chiusa; la nuova posizione viene aperta.
In tutti gli altri casi, o rimane la vecchia posizione dell'ultima barra o la vecchia posizione viene chiusa, o nessuna posizione. Tutto questo non richiede uno spread.

(Più specificamente, i trade di acquisto sono aperti a bid+spread, e chiusi a bid. Le operazioni di vendita sono aperte inversamente all'offerta, e chiuse su offerta+spread. Bid è il prezzo che di solito viene mostrato nel terminale. Ma, per comodità, con uno spread costante, è sufficiente considerarlo una volta all'apertura di una nuova posizione - è più facile così).

Tutto questo deve essere considerato in un EA affinché non chiuda una posizione che viene riaperta immediatamente nella stessa direzione su una nuova barra. Una volta ho fatto un errore simile quando pensavo che avrei ottenuto degli sconti dal mio broker. Ma in questo caso la frequenza delle transazioni per gli sconti non paga, tutto è peggio.

 
Dr.Trader:

Sì, sto imparando una rete neurale, il pacchetto nnet. In questo caso sto allenando il modello con il caret, che raccoglie un paio di parametri del modello.

Ho guardato di nuovo la colonna dei risultati nel tuo file RData, ora ho visto subito che si tratta di guadagni di prezzo. L'ultima volta ho pensato che fosse una specie di probabilità.
Mi è piaciuto come si memorizza l'incremento di prezzo nella variabile di destinazione, se necessario si può facilmente convertirli in classi per la formazione, o calcolare il profitto. Lo farò anch'io.

Ho capito tutto, grazie per il chiarimento, ho contato il profitto, calcolato lo spread, disegnato il grafico. Peccato, MO = -2.052423e-05, perdita lenta ma sicura.

Per quanto riguarda lo spread, deve essere preso in considerazione solo in 4 casi:
1, 2) Previsione dell'ultima barra = 0; previsione della nuova barra = -1 o 1. Apertura di una nuova posizione.
3) Previsione sull'ultima barra = -1; previsione sulla nuova barra = 1. Inversione, la vecchia posizione viene chiusa, la nuova posizione viene aperta.
4) Previsione per la barra precedente = 1; previsione per la nuova barra = -1. Inversione, la vecchia posizione viene chiusa; la nuova posizione viene aperta.
In tutti gli altri casi, o rimane la vecchia posizione dell'ultima barra o la vecchia posizione viene chiusa, o nessuna posizione. Tutto questo non richiede uno spread.

(Più specificamente, i trade di acquisto sono aperti a bid+spread, e chiusi a bid. Le operazioni di vendita sono aperte contrariamente all'offerta+spread e chiuse all'offerta+spread. Bid è il prezzo che di solito viene mostrato nel terminale. Ma, per comodità, con uno spread costante, è sufficiente considerarlo una volta all'apertura di una nuova posizione - è più facile così).

Tutto questo deve essere considerato in un EA affinché non chiuda una posizione che viene riaperta immediatamente nella stessa direzione su una nuova barra. Una volta ho fatto un errore simile quando pensavo che avrei ottenuto degli sconti dal mio broker. Ma la frequenza delle transazioni per gli sconti in questo caso non paga, peggiora solo.

In ordine.

MO È 0,00002. Questo è già più che diffuso. Cioè, il modello ha imparato qualcosa dal rumore, ma la forza della previsione è insufficiente.

Secondo. Avete in qualche modo specificato quale parte dei dati infilare in una particolare piega? Se si imposta solo su CV (CV ripetuto), il modello prenderà osservazioni selezionate a caso per il test. Non è la migliore opzione in caso di serie temporali.

Poi, la simulazione dello scambio. Ho un semplice segnale di apertura e chiusura dopo un certo numero di minuti. E poi puoi renderlo più complesso. Pertanto, ho un MO positivo quando si tiene conto dello spread su ogni trade. E questo è realistico da ottenere.

Fate un po' di lavoro con la convalida incrociata. È possibile creare set di indici per includere alcune parti della serie temporale nei guadi.

E ci sono molti altri metodi oltre alla neuronica. Uno dei migliori oggi è GBM o XGBOOST. Per ora ho scelto il primo. Mi piace.

 

Ho usato il metodo "repeatedcv" in trainControl, con una divisione predefinita. Recentemente ho scritto io stesso il codice per la convalida incrociata, ho provato la convalida incrociata sia con barre prese a caso che con pezzi presi consecutivamente senza interruzioni. Non ho visto alcuna differenza sul fronttest, ha dato circa lo stesso risultato in entrambi i casi. Ho diviso i dati per la formazione/convalida incrociata 50%/50%, forse a quel rapporto non ha più importanza.
Sperimenterò con questo in caret...

Ricordo che in quell'articolo che hai postato un po' di tempo fa, il confronto principale era alberi potenziati con il metodo di Platt (qualcosa del genere). Tutto quello che ho trovato su google su questo metodo è che devi passare l'output del modello a sigmoid e prendere il suo risultato. Gbm o xgboost possono farlo? Questo approccio sembra essere migliore di forest, neuronka, e di alcuni "alberi insaccati", che arrivano al secondo posto.

Motivazione: