L'apprendimento automatico nel trading: teoria, modelli, pratica e algo-trading - pagina 267
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Bene, e se invece di aggiungere NA alla fine di"Y" e poi cancellare lo stesso NA, cancello solo l'ultima linea in SomeData, non sarà lo stesso?
Davvero non capisco la differenza, forse mi sono già surriscaldato completamente ((
Non mi dispiace, ma non so come, semplicemente non funziona, quante volte ho provato, prova a modo tuo, che obiettivo ho fatto sai, e dimmi come fai
Si impacchetta tutto con qualsiasi imballatore e si allega il file
Ho provato molte volte, non funziona, mi butta fuori dal forum e basta...
Prendete i miei codici, ho postato tutto, il primo codice è la creazione delle caratteristiche, il secondo è l'addestramento del modello, sarete esattamente lo stesso, fate l'addestramento e mostrate quello che avete ottenuto
Ho provato molte volte, non funziona, mi butta fuori dal forum e basta...
Prendete i miei codici, ho postato tutto, il primo codice è la creazione delle caratteristiche, il secondo è l'addestramento del modello, sarete esattamente lo stesso, fate l'addestramento e mostrate quello che avete ottenuto
Quando si differenzia, lo spostamento è automatico poiché la serie diventa un elemento più corta, quindi tutto ciò che serve è accorciare il campione (tabella con osservazioni) dell'ultimo elemento
Ci sono due cose nel codice che mi mettono a disagio:
1) poiché l'ohlc è usato per la previsione, l'ultimissima barra non può essere usata per la previsione, poiché faremo la previsione all'inizio della barra, e l'hlc cambierà durante la durata dell'intera barra. Quindi insegniamo al modello usando l'ultima barra completamente formata e poi prevediamo usando quella non formata. Non è giusto, dovremmo spostare l'obiettivo di 2 barre invece di 1.
Uno spostamento del target a 1 barra sarebbe accettabile, se si usa solo il prezzo aperto per la previsione, ignorando alto, basso, vicino.
2) State usando Close invece di Open per l'obiettivo. È importante per qualche tipo di strategia o solo per divertimento? Dopo tutto, di solito entriamo in un trade all'inizio di una barra, e poi sulla nuova barra successiva o giriamo, o lasciamo, o usciamo. Ed è importante che il modello addestrato preveda l'aumento del prezzo dall'apertura attuale all'apertura successiva.
La chiusura della barra corrente non coincide necessariamente con l'apertura della barra successiva, cioè prendendo la chiusura come obiettivo, si può evitare il primo errore, ma forse si ottengono invece incrementi sbagliati. Ora ho controllato, di solito la chiusura nella tabella dei prezzi non coincide con l'apertura della barra successiva, quindi i tuoi valori target sono molto dubbi.
Se la candela è in overdrawing, devi aggirarla.
Prendi una finestra mobile, le prime cento barre (100 è solo un numero casuale, per il tuo codice il numero minimo di barre = 23, e se meno di quello la candela fa errori), trova i valori dell'indicatore, lascia solo l'ultimo di essi, trova il target rilevante, aggiungi tutto alla tabella finale. Spostiamo la finestra in avanti di 1 barra, ripetiamo. Tutto questo è decine di volte più lento che contare tutto in una volta, ma è più sicuro. Poi possiamo confrontare entrambi i risultati e concludere se c'è o meno un rollover.
Sarebbe bene cambiare la dimensione della finestra scorrevole e vedere se i risultati cambiano. Se cambiano - allora l'indicatore usa i propri valori precedenti per calcolare quelli nuovi, in questo caso la larghezza della finestra funzionerà come una sorta di periodo esponenziale all'interno dell'indicatore stesso. Se il risultato cambierà, allora la larghezza della finestra dovrebbe essere aumentata fino a quando i risultati non cambieranno. L'indicatore può avere un proprio limite interno sul numero di barre utilizzate, per esempio zigzag in mt5 ha questo valore = 100 barre, cioè la larghezza della finestra maggiore di cento non influenza il risultato.
Per prima cosa, provate questo codice per creare una tabella di allenamento/test. Confrontalo con la tua tabella, se è congruente al 100%, non vedrai alcun overrendering, puoi fidarti che Candlestick usi i valori precedenti per identificare quelli nuovi
Poi provate ad aumentare indicatorDepth - larghezza della finestra scorrevole, vedete se cambia il risultato, e se potete trovare un tale valore di indicatorDepth, quando anche aumentandolo non influenza il risultato.
if(!require(rusquant)){ install.packages("rusquant", repos="http://r-forge.r-project.org", dependencies = TRUE); library(rusquant) }
if(!require(candlesticks)){ install.packages("candlesticks", repos="http://r-forge.r-project.org", dependencies = TRUE); library(candlesticks) }
tryCatch({
load("SPFB.RTS.rdata")
}, error = function(e){
getSymbols("SPFB.RTS", src = "Finam", period="5min", from = Sys.Date()-500)
save(SPFB.RTS, finam.stock.list, file = "SPFB.RTS.rdata")
SPFB.RTS <<- SPFB.RTS
finam.stock.list <<- finam.stock.list
})
chart_Series(tail(SPFB.RTS, 100))
indicatorDepth <- 23
tryCatch({
load("trainData.rdata")
}, error=function(e){
trainData <<- matrix(NA, ncol=60, nrow = nrow(SPFB.RTS)-2)
for(i in (indicatorDepth+1):(nrow(SPFB.RTS)-2)){
X1 <- as.numeric(tail(CandleBodyLength(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X2 <- as.numeric(tail(CandleLength(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X3 <- as.numeric(tail(CSPDarkCloudCover(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X4 <- as.numeric(tail(CSPDoji(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X5 <- as.numeric(tail(CSPEngulfing(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X6 <- as.numeric(tail(CSPGap(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X7 <- as.numeric(tail(CSPHammer(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X8 <- as.numeric(tail(CSPHarami(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X9 <- as.numeric(tail(CSPInsideDay(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X10 <- as.numeric(tail(CSPInvertedHammer(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X11 <- as.numeric(tail(CSPKicking(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X12 <- as.numeric(tail(CSPLongCandle(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X13 <- as.numeric(tail(CSPLongCandleBody(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X14 <- as.numeric(tail(CSPMarubozu(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X15 <- as.numeric(tail(CSPNHigherClose(SPFB.RTS[max(1, i-indicatorDepth):i,],N = 3), 1))
X16 <- as.numeric(tail(CSPNLowerClose(SPFB.RTS[max(1, i-indicatorDepth):i,],N = 3), 1))
X17 <- as.numeric(tail(CSPOutsideDay(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X18 <- as.numeric(tail(CSPPiercingPattern(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X19 <- as.numeric(tail(CSPShortCandle(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X20 <- as.numeric(tail(CSPShortCandleBody(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X21 <- as.numeric(tail(CSPStar(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X22 <- as.numeric(tail(CSPStomach(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X23 <- as.numeric(tail(CSPTasukiGap(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X24 <- as.numeric(tail(CSPThreeInside(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X25 <- as.numeric(tail(CSPThreeMethods(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X26 <- as.numeric(tail(CSPThreeOutside(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X27 <- as.numeric(head(tail(nextCandlePosition(SPFB.RTS[max(1, i-indicatorDepth):i,]), 2), 1))
X28 <- as.numeric(tail(TrendDetectionChannel(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X29 <- as.numeric(tail(TrendDetectionSMA(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
target <- as.numeric(SPFB.RTS[i+2,"SPFB.RTS.Open"]) - as.numeric(SPFB.RTS[i+1,"SPFB.RTS.Open"])
trainData[i,] <<- c(X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,target)
cat(i, "/", nrow(SPFB.RTS)-2, "\n")
}
colnames(trainData)[-ncol(trainData)] <- paste0("pred",1:(ncol(trainData)-1))
colnames(trainData)[ncol(trainData)] <- "target"
save(trainData, file="trainData.rdata")
})
# trainData <- trainData[-(1:indicatorDepth),]
Sono preoccupato per due cose nel codice:
1) Dato che usiamo ohlc per la previsione, l'ultima barra non può essere usata per fare una previsione perché faremo la previsione all'inizio della barra e hlc cambierà durante la durata della barra. Quindi insegniamo al modello usando l'ultima barra completamente formata e poi prevediamo usando quella non formata. Non è giusto, dovremmo spostare l'obiettivo di 2 barre invece di 1.
Se spostate il target a 1 barra potete usare solo il prezzo aperto per fare una previsione ignorando il massimo, il minimo e la chiusura.
Non capisco il problema: noi prevediamo la posizione della chiusura attuale rispetto alla chiusura precedente, non conosciamo la candela attuale, conosciamo la precedente perché è già chiusa, quindi è la precedente, quindi tutti i prezzi OHLC sono già stati formati, non capisco qual è la prudenza, qual è l'errore
2) State usando Close invece di Open per l'obiettivo. È importante per qualche tipo di strategia o solo per divertimento? ........
Preso assolutamente per niente, per velocità e comodità
Se la candela è in eccesso, bisogna aggirarla........
Non capisco questo pezzo, cosa fa? Cos'èSPFB.RTS.rdata?
da dove viene? e perché viene sovrascritto? nessun indizio(
tryCatch({
load("SPFB.RTS.rdata")
}, error = function(e){
getSymbols("SPFB.RTS", src = "Finam", period="5min", from = Sys.Date()-500)
save(SPFB.RTS, finam.stock.list, file = "SPFB.RTS.rdata")
SPFB.RTS <<- SPFB.RTS
finam.stock.list <<- finam.stock.list
})
E soprattutto, sicuramente avete cercato di insegnare qualcosa usando i dati, perché non menzionarlo?
E soprattutto, devi aver provato a insegnare qualcosa usando i dati, perché non ne parli?
Il progresso della tabella di formazione è 16527 su 55857. Non appena sarà creato, cercherò di insegnarlo.
Prevedere la posizione del cloze attuale rispetto al cloze precedente
Questo dipende da voi. È solo strano, come al solito le strategie prendono decisioni e aprono trade all'inizio di una nuova barra.
E poi devi fare una previsione e aprire un trade proprio alla fine della barra. Un po' scomodo, un nuovo bar nel terminale è facile da prendere. Ma "aprire il trade alla fine della barra corrente, un secondo prima dell'apertura di una nuova barra, con la speranza che il prezzo di chiusura corrente sia già definitivo" è troppo vago per me.
Non capisco questo pezzo, cosa fa? Cos'èSPFB.RTS.rdata?
Citazioni scaricate. Scaricati, salvati in rdata per non rovinare ogni volta che eseguiamo questo script e per non aspettare secondi fino a quando vengono scaricati. Se sono stati scaricati prima e salvati nel file rdata - allora sono presi da esso.
Grazie
Ci sono due cose nel codice che mi mettono a disagio:
1) perché usiamo ohlc per la previsione, non possiamo usare l'ultima barra per la previsione, perché lo faremo all'inizio della barra e hlc cambierà durante la durata della barra. Quindi insegniamo al modello usando l'ultima barra completamente formata e poi prevediamo usando quella non formata. Non è giusto, dovremmo spostare l'obiettivo di 2 barre invece di 1.
Uno spostamento del target a 1 barra sarebbe accettabile, se si usa solo il prezzo aperto per la previsione, ignorando alto, basso, vicino.
2) State usando Close invece di Open per l'obiettivo. È importante per qualche tipo di strategia o solo per divertimento? Dopo tutto, di solito entriamo in un trade all'inizio di una barra, e poi sulla nuova barra successiva o giriamo, o lasciamo, o usciamo. Ed è importante che il modello addestrato preveda l'aumento del prezzo dall'apertura attuale all'apertura successiva.
La chiusura della barra corrente non coincide necessariamente con l'apertura della barra successiva, cioè prendendo la chiusura come obiettivo, si può evitare il primo errore, ma forse si ottengono invece incrementi sbagliati. Ora ho controllato, di solito la chiusura nella tabella dei prezzi non coincide con l'apertura della barra successiva, quindi i valori target sono molto dubbi.
Mi sembra che lei stia complicando le cose.
1. Il primo problema è strettamente legato al secondo. Se usiamo Close come obiettivo, tutti gli altri tre prezzi sono formati e non cambiano. Quando si fa una previsione un passo avanti, bisogna spostare l'obiettivo di 1 posizione.
2. Non posso nemmeno accettare le vostre argomentazioni sulla differenza di prezzo tra Close e Open. È su quale TF o giorno della settimana. Se prendiamo H1, allora abbiamo tre diverse varianti:
Questo è solo quello che mi viene in mente. E ci potrebbero essere molte altre situazioni. Tutti dicono che il trading reale è molto diverso dal modello. Al momento, è più utile concentrarsi su qualche versione idealizzata, e programmare il resto dei trascinamenti e gli altri separatamente.
3. A proposito di offerte eccessive.
Mucca sacra dell'AT. È considerato come una verità immutabile da secoli.
Su quale base?
Per tutti i professionisti dell'ANALISI, cambiare i dati su cui traggono le loro conclusioni epocali sul passato è inaccettabile. Ancora una volta: per il passato è inaccettabile.
Siamo nel business delle previsioni, e la nostra visione del passato non solo può, ma deve cambiare in base ai nuovi dati disponibili. C'è un prezzo da pagare per i dati che non si ridisegnano: il ritardo.
Ecco che arriva una nuova barra, che è l'araldo di un'inversione di mercato. Ma noi, pur continuando a nutrire la vacca sacra, non cambiamo la nostra visione della storia per amore di qualche idea presa dalla sezione "analisi".
Non dobbiamo avere paura dei cambiamenti degli indicatori.
È arrivato un nuovo bar. E al suo arrivo dobbiamo prendere decisioni nelle condizioni che questa nuova barra ha creato. Dobbiamo prevedere il futuro fino alla prossima previsione con un errore minimo. Non ho visto nessuna pubblicazione che colleghi la grandezza dell'errore di previsione ai cambiamenti del tipo di indicatori nella storia.
Sono tutti discorsi teorici. Dovremmo costruire un modello e ottenere la sua stima. Questo è quello che farò.
Fatto un piccolo set di dati di 5000 prezzi
Lo script non ha funzionato correttamente.
Quando tutto è stato contato, ho ricevuto un avvertimento.
....
....
5677 / 5688
5678 / 5688
5679 / 5688
5680 / 5688
5681 / 5688
5682 / 5688
5683 / 5688
5684 / 5688
5685 / 5688
5686 / 5688
5687 / 5688
5688 / 5688
Warning message:
In readChar(con, 5L, useBytes = TRUE) :
cannot open compressed file 'trainData.rdata', probable reason 'No such file or directory'
i dati stessi
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[2,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[4,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[5,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[2,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[4,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[5,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[2,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[4,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[5,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> target
[1,] NA NA NA NA NA NA NA NA NA
[2,] NA NA NA NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA
[4,] NA NA NA NA NA NA NA NA NA
[5,] NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA NA NA NA
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,] 8.621061e-05 10 0.0016378604 190 0 1 0 0 0 0 0 0 0
[5684,] 6.036304e-04 70 0.0010346611 120 0 0 0 0 0 1 0 0 0
[5685,] 1.208355e-03 140 0.0018122977 210 0 0 0 0 0 0 0 0 0
[5686,] 6.911447e-04 80 0.0019009764 220 0 0 0 0 0 0 0 0 0
[5687,] 2.592577e-04 30 0.0007778402 90 0 0 0 0 0 0 0 0 0
[5688,] 9.501188e-04 110 0.0016415396 190 0 0 0 0 0 0 0 0 0
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,] 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
[5684,] 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
[5685,] 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
[5686,] 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
[5687,] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
[5688,] 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
[5684,] 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[5685,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
[5686,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[5687,] 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
[5688,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> target
[5683,] NA NA NA NA NA NA 0 1 0 0 0 0 1 -1 -70
[5684,] NA NA NA NA NA NA 0 1 0 0 0 0 1 -1 -140
[5685,] NA NA NA NA NA NA 0 0 1 -1 0 0 1 -1 -90
[5686,] NA NA NA NA NA NA 0 0 1 -1 0 0 1 -1 20
[5687,] NA NA NA NA NA NA 0 0 1 -1 0 0 1 -1 100
[5688,] NA NA NA NA NA NA 0 0 1 -1 0 0 1 -1 50
C'è sempre NA nei dati, anche se non escludo di averlo fatto io stesso