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

 

Chiarirò le condizioni per il premio in denaro:

5 crediti alla prima persona che risolve il problema

Termine ultimo per le soluzioni: 30 giugno 2016

 

C'è un esempio di applicazione di un algoritmo di selezione di tratti informativi per implementare una strategia di trading.

Probabilmente avete letto i miei blog sul Grande Esperimento: https://www.mql5.com/ru/blogs/post/661895

Ed ecco una foto come questa:

Ho cercato di trovare un modello per cinque coppie e rilevare la percentuale di accordi indovinati correttamente su un campione di convalida di 25 anni circa. Non ha funzionato subito. Non ho raggiunto la precisione desiderata per qualsiasi orizzonte di previsione.

Poi, prendiamo solo una coppia, eurusd. Ho trovato una dipendenza del movimento dei prezzi 3 ore avanti su un sottoinsieme dei miei predittori.

Ho ridotto i predittori a una forma categorica e ho iniziato la mia funzione di ricerca di predittori significativi. L'ho fatto proprio ora, mentre ero al lavoro, in 20 minuti.

[1] "1.51%"

> final_vector <- c((sao$par >= threshold), T)

> names(sampleA)[final_vector]

[1] "lag_diff_45_var"      "lag_diff_128_var"     "lag_max_diff_8_var"   "lag_max_diff_11_var"  "lag_max_diff_724_var" "lag_sd_362_var"      

[7] "output"   

Non ho ottenuto la convergenza così rapidamente, ma ho ottenuto qualche risultato al livello dell'uno e mezzo per cento di potere esplicativo.

Il grafico di convergenza (minimizzazione).

Il prossimo passo è la costruzione del modello.

Abbiamo diversi predittori categorici. Costruiamo un "libro di regole" o che tipo di relazione c'è tra i predittori e l'output - lungo o corto in un orizzonte temporale di 3 ore.

Che aspetto ha come risultato:

уровни предикторов
sell
buy
pval
concat
direction
121121
11
31
2.03E-03
121121
1
211112
3
15
4.68E-03
211112
1
222222
19
4
1.76E-03
222222
0
222311
8
0
4.68E-03
222311
0
321113
7
0
8.15E-03
321113
0
333332
53
19
6.15E-05
333332
0

Vediamo l'asimmetria del numero di acquisti e vendite in ogni linea e il valore corrispondente del p-value del criterio chi-quadro per la corrispondenza della distribuzione 50/50. Selezioniamo solo le righe in cui la probabilità è inferiore a 0,01.

E il codice di tutto l'esperimento, a partire dal momento in cui gli ingressi sono già stati selezionati:

dat_test <- sampleA[, c("lag_diff_45_var"      

  , "lag_diff_128_var"     

  , "lag_max_diff_8_var"   

  , "lag_max_diff_11_var"  

  , "lag_max_diff_724_var" 

  , "lag_sd_362_var"

  , "output")]


dat_test$concat <- do.call(paste0, dat_test[1:(ncol(dat_test) - 1)])


x <- as.data.frame.matrix(table(dat_test$concat

   , dat_test$output))


x$pval <- NA

for (i in 1:nrow(x)){

x$pval[i] <- chisq.test(x = c(x$`0`[i], x$`1`[i])

, p = c(0.5, 0.5))$p.value

}


trained_model <- subset(x

  , x$pval < 0.01)


trained_model$concat <- rownames(trained_model)


trained_model$direction <- NA

trained_model$direction [trained_model$`1` > trained_model$`0`] <- 1

trained_model$direction [trained_model$`0` > trained_model$`1`] <- 0


### test model


load('C:/Users/aburnakov/Documents/Private/big_experiment/many_test_samples.R')


many_test_samples_eurusd_categorical <- list()


for (j in 1:49){


dat <- many_test_samples[[j]][, c(1:108, 122)]

disc_levels <- 3

for (i in 1:108){

naming <- paste(names(dat[i]), 'var', sep = "_")

dat[, eval(naming)] <- discretize(dat[, eval(names(dat[i]))], disc = "equalfreq", nbins = disc_levels)[,1]

}

dat$output <- NA

dat$output [dat$future_lag_181 > 0] <- 1

dat$output [dat$future_lag_181 < 0] <- 0

many_test_samples_eurusd_categorical[[j]] <- subset(dat

   , is.na(dat$output) == F)[, 110:218]

many_test_samples_eurusd_categorical[[j]] <- many_test_samples_eurusd_categorical[[j]][(nrow(dat) / 5):(2 * nrow(dat) / 5), ]


}



correct_validation_results <- data.frame()


for (i in 1:49){

dat_valid <- many_test_samples_eurusd_categorical[[i]][, c("lag_diff_45_var"      

   , "lag_diff_128_var"     

   , "lag_max_diff_8_var"   

   , "lag_max_diff_11_var"  

   , "lag_max_diff_724_var" 

   , "lag_sd_362_var"

   , "output")]

dat_valid$concat <- do.call(paste0, dat_valid[1:(ncol(dat_valid) - 1)])

y <- as.data.frame.matrix(table(dat_valid$concat

   , dat_valid$output))

y$concat <- rownames(y)


valid_result <- merge(x = y, y = trained_model[, 4:5], by.x = 'concat', by.y = 'concat')

correct_sell <- sum(subset(valid_result

 , valid_result$direction == 0)[, 2])

correct_buys <- sum(subset(valid_result

     , valid_result$direction == 1)[, 3])

correct_validation_results[i, 1] <- correct_sell

correct_validation_results[i, 2] <- correct_buys

correct_validation_results[i, 3] <- sum(correct_sell

    , correct_buys)

correct_validation_results[i, 4] <- sum(valid_result[, 2:3])

correct_validation_results[i, 5] <- correct_validation_results[i, 3] / correct_validation_results[i, 4]


}


hist(correct_validation_results$V5, breaks = 10)


plot(correct_validation_results$V5, type = 's')

sum(correct_validation_results$V3) / sum(correct_validation_results$V4)

Poi, ci sono 49 campioni di convalida, ognuno dei quali copre circa 5 anni. Convalidiamo il modello su di loro e contiamo la percentuale di direzioni commerciali indovinate correttamente.

Vediamo la percentuale di operazioni indovinate correttamente per campioni e l'istogramma di questo valore:

E contare quanto in totale abbiamo indovinato la direzione del trade su tutti i campioni:

> sum(correct_validation_results$`total correct deals`) / sum(correct_validation_results$`total deals`)

[1] 0.5361318

Circa il 54%. Ma senza considerare che dobbiamo superare la distanza tra Ask & Bid. Cioè, la soglia secondo il grafico di cui sopra è circa il 53%, supponendo che lo spread = 1 pip.

Cioè, abbiamo inventato un modello semplice in 30 minuti, che è facile da codificare nel terminale, per esempio. E non è nemmeno un comitato. E ho cercato dipendenze per 20 minuti invece di 20 ore. Tutto sommato, c'è qualcosa.

E tutto grazie alla giusta selezione di attributi informativi.

E statistiche dettagliate per ogni campione valido.

sample
correct sell correct buy total correct deals total deals share correct
1 37 10 47 85 0.5529412
2 26 7 33 65 0.5076923
3 30 9 39 80 0.4875
4 36 11 47 88 0.5340909
5 33 12 45 90 0.5
6 28 10 38 78 0.4871795
7 30 9 39 75 0.52
8 34 8 42 81 0.5185185
9 24 11 35 67 0.5223881
10 23 14 37 74 0.5
11 28 13 41 88 0.4659091
12 31 13 44 82 0.5365854
13 33 9 42 80 0.525
14 23 7 30 63 0.4761905
15 28 12 40 78 0.5128205
16 23 16 39 72 0.5416667
17 30 13 43 74 0.5810811
18 38 8 46 82 0.5609756
19 26 8 34 72 0.4722222
20 35 12 47 79 0.5949367
21 32 11 43 76 0.5657895
22 30 10 40 75 0.5333333
23 28 8 36 70 0.5142857
24 21 8 29 70 0.4142857
25 24 8 32 62 0.516129
26 34 15 49 83 0.5903614
27 24 9 33 63 0.5238095
28 26 14 40 66 0.6060606
29 35 6 41 84 0.4880952
30 28 8 36 74 0.4864865
31 26 14 40 79 0.5063291
32 31 15 46 88 0.5227273
33 35 14 49 93 0.5268817
34 35 19 54 85 0.6352941
35 27 8 35 64 0.546875
36 30 10 40 83 0.4819277
37 36 9 45 79 0.5696203
38 25 8 33 73 0.4520548
39 39 12 51 85 0.6
40 37 9 46 79 0.5822785
41 41 12 53 90 0.5888889
42 29 7 36 59 0.6101695
43 36 14 50 77 0.6493506
44 36 15 51 88 0.5795455
45 34 7 41 67 0.6119403
46 28 12 40 75 0.5333333
47 27 11 38 69 0.5507246
48 28 16 44 83 0.5301205
49 29 10 39 72 0.5416667
СОПРОВОЖДЕНИЕ ЭКСПЕРИМЕНТА ПО АНАЛИЗУ ДАННЫХ ФОРЕКСА: доказательство значимости предсказаний
СОПРОВОЖДЕНИЕ ЭКСПЕРИМЕНТА ПО АНАЛИЗУ ДАННЫХ ФОРЕКСА: доказательство значимости предсказаний
  • 2016.03.02
  • Alexey Burnakov
  • www.mql5.com
Начало по ссылкам: https://www.mql5.com/ru/blogs/post/659572 https://www.mql5.com/ru/blogs/post/659929 https://www.mql5.com/ru/blogs/post/660386 https://www.mql5.com/ru/blogs/post/661062
 

Tutti i dati grezzi sono disponibili ai link del blog.

E questo modello non è molto redditizio. MO è a livello di mezzo punto. Ma questa è la direzione che sto prendendo.

 
SanSanych Fomenko:

Sempre imparando dal passato.

Guardiamo per secoli un grafico. Sia su e vediamo 'tre soldati', poi vediamo 'testa e spalle'. Quante di queste cifre abbiamo già visto e crediamo in queste cifre, commerciamo...

E se il compito è impostato in questo modo

1. trovare automaticamente tali figure, non a tutti i grafici, ma a una coppia di valute particolare, quelle che si sono verificate di recente, non tre secoli fa nel commercio del riso giapponese.

2) I dati iniziali su cui cerchiamo automaticamente tali figure - modelli.

Per rispondere alla prima domanda, consideriamo l'algoritmo chiamato "foresta casuale". L'algoritmo prende le quotazioni di una o più valute, indicatori, incrementi di prezzo - tutto ciò che è stato inventato dall'uomo, come dati di input per il suo funzionamento. 10-5-100-200 ... variabili di input. Poi prende l'insieme dei valori delle variabili che si riferiscono a un punto nel tempo corrispondente a una barra e cerca una combinazione di queste variabili di input che corrisponderebbe sui dati storici a un certo risultato, per esempio, un ordine BUY. E un'altra serie di combinazioni per un altro ordine - VENDERE. Un albero separato corrisponde a ciascuno di questi insiemi. L'esperienza mostra che per un set di input di 18000 barre (circa 3 anni) l'algoritmo trova 200-300 alberi. Questo è l'insieme dei modelli, quasi analoghi di "teste e spalle", e bocche intere di soldati.

Il problema con questo algoritmo è che tali alberi possono raccogliere alcune specificità che non si incontrano in futuro. Questo è chiamato "superfitting" qui nel forum, nell'apprendimento automatico "overfitting". Sappiamo che tutto un grande insieme di variabili di input può essere diviso in due parti: quelle legate alla variabile di output e quelle non legate al rumore. Così Burnakov cerca di eliminare quelli che sono irrilevanti per l'uscita.

PS.

Quando si costruisce un TS di tendenza (COMPRA, VENDI) qualsiasi varietà di vagoni è legata al rumore!

Quello che vedi è una piccola parte del mercato e non è la più importante. Nessuno costruisce la piramide al contrario.
 
yerlan Imangeldinov:
Quello che vedete è una piccola parte del mercato e non la più importante. Nessuno sta costruendo una piramide al contrario.
E in particolare, cosa non vedo?
 
yerlan Imangeldinov:
Quello che vedete è una piccola parte del mercato e non la più importante. Nessuno sta costruendo una piramide al contrario.
È possibile aggiungere informazioni al sistema oltre alla storia dei prezzi. Ma bisogna comunque allenarsi sulla storia. Oppure - Flair.
 

Ho provato ad addestrare il neurone sui dati di input, poi ho guardato i pesi. Se i dati di input hanno un peso basso, sembra che non sia necessario. L'ho fatto con R (Rattle), grazie a SanSanych per il suo articolo https://www.mql5.com/ru/articles/1165.

ingresso ingresso_1 ingresso_2 ingresso_3 ingresso_4 ingresso_5 ingresso_6 ingresso_7 ingresso_8 ingresso_9 ingresso_10 ingresso_11 ingresso_12 ingresso_13 ingresso_14 ingresso_15 ingresso_16 ingresso_17 ingresso_18 ingresso_19 ingresso_20
peso -186.905 7.954625 -185.245 14.88457 -206.037 16.03497 190.0939 23.05248 -182.923 4.268967 196.8927 16.43655 5.419367 8.76542 36.8237 5.940322 8.304859 8.176511 17.13691 -0.57317
sottoinsieme

Non ho testato questo approccio nella pratica, mi chiedo se ha funzionato o no. Prenderei l'input_1 input_3 input_5 input_7 input_9 input_11

Случайные леса предсказывают тренды
Случайные леса предсказывают тренды
  • 2014.09.29
  • СанСаныч Фоменко
  • www.mql5.com
В статье описано использование пакета Rattle для автоматического поиска паттернов, способных предсказывать "лонги" и "шорты" для валютных пар рынка Форекс. Статья будет полезна как новичкам, так и опытным трейдерам.
 
Dr.Trader:

Ho provato ad addestrare il neurone sui dati di input, poi ho guardato i pesi. Se i dati di input hanno pesi bassi, sembra che non siano necessari. L'ho fatto con R (Rattle), grazie a SanSanych per il suo articolo https://www.mql5.com/ru/articles/1165.

ingresso ingresso_1 ingresso_2 ingresso_3 ingresso_4 ingresso_5 ingresso_6 ingresso_7 ingresso_8 ingresso_9 ingresso_10 ingresso_11 ingresso_12 ingresso_13 ingresso_14 ingresso_15 ingresso_16 ingresso_17 ingresso_18 ingresso_19 ingresso_20
peso -186.905 7.954625 -185.245 14.88457 -206.037 16.03497 190.0939 23.05248 -182.923 4.268967 196.8927 16.43655 5.419367 8.76542 36.8237 5.940322 8.304859 8.176511 17.13691 -0.57317
sottoinsieme

Non ho testato questo approccio nella pratica, mi chiedo se ha funzionato o no. Prenderei l'input_1 input_3 input_5 input_7 input_9 input_11

) hmm. molto interessante.

Domanda chiarificatrice. Perché allora non includete qualche altro ingresso dove il peso è piccolo, per esempio 13, 14, 16? Potresti mostrare un diagramma degli ingressi e dei pesi ordinati per peso?

Scusa, non avevo capito all'inizio. Sì, gli ingressi specificati hanno un grande peso modulo, come dovrebbe essere.

 

Visivamente, tutti i pesi sono divisi in due gruppi. Se volete dividerli secondo la significatività/non significatività, allora 5,11,7,1,3,9 spiccano chiaramente, questo insieme penso sia sufficiente.