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

 
Dr.Trader:

Non credo che questo pacchetto sia sufficiente per costruire un modello capace di predire la variabile obiettivo. Tutto quello che ho trovato nell'aiuto è costruire un modello PCA basato su predittori, la variabile target non c'è affatto.


Ciao, hai usato la funzione sbagliata, avresti dovuto usare"nlPca" come indicato sul sito che ho dato, ma è colpa mia, avrei dovuto dare più dettagli...

Qui invece di prevedere - montato, prova, forse ci riuscirai

source("https://bioconductor.org/biocLite.R")
biocLite("pcaMethods")        

#создание  pca объекта
library(pcaMethods)

##  Data set with three variables where data points constitute a helix
data(helix)
helixNA <- helix
##  not a single complete observation
helixNA <- t(apply(helix, 1, function(x) { x[sample(1:3, 1)] <- NA; x}))
## 50 steps is not enough, for good estimation use 1000
helixNlPca <- pca(helixNA, nPcs=1, method="nlpca", maxSteps=50)
fittedData <- fitted(helixNlPca, helixNA)
plot(fittedData[which(is.na(helixNA))], helix[which(is.na(helixNA))])
		
 
Dr.Trader:

Non credo che questo pacchetto sia sufficiente per costruire un modello capace di predire la variabile obiettivo. Tutto quello che ho trovato nell'aiuto è costruire un modello PCA basato su predittori, la variabile target non c'è affatto.

Questo creerà un oggetto resNipals (Nonlinear Estimation by Iterative Partial Least Squares) con 5 componenti principali per analizzare la tabella metaboliteDataComplete. Invece di metaboliteDataComplete, puoi sostituire la tua tabella con i predittori. È importante non alimentare qui la variabile di destinazione, sarà usata più tardi.

Ma questo sarà sufficiente per analizzare le relazioni tra le variabili esaminando diversi grafici. Per creare un modello predittivo, viene quindi costruito un modello di regressione lineare che utilizza le componenti principali PC1,PC2,PC3,PC4,PC5 come variabili di input (x1,x2,x3,...). E la variabile obiettivo Y è già inserita nel modello lineare come risultato desiderato. Il problema è che resNipals è un oggetto di classe "pcaRes" del pacchetto pcaMethods. Non sono riuscito a trovare nell'aiuto come fare tutto questo.

Se fosse un modello PCA del pacchetto caret, andrebbe così:

Ma non funziona con resNipals, in teoria il pacchetto pcaMethods dovrebbe avere delle funzioni proprie per lavorare con questo oggetto, ma non ho trovato nulla.

Originariamente, la PCA è stata progettata per risolvere due problemi:

1. c'è un numero molto grande di predittori con un piccolo numero di osservazioni. Questo è comune nella chimica organica, nella genetica... Da noi è l'uso di dati macroeconomici su grandi TF, per esempio annuali.

2. Ci sono correlazioni tra i predittori.

Pertanto, gli algoritmi PCA risolvono questi due problemi principali:

1. Ridurre il numero di predittori originali con un nuovo numero di predittori, spesso radicalmente più piccolo. Così facendo, l'algoritmo assicura che questo piccolo numero possa spiegare una certa percentuale della variabilità dell'insieme originale di predittori, per esempio il 95%. Questo valore è scelto dal ricercatore.

2. Il nuovo set di predittori ha ZERO correlazione tra loro.

Ne consegue che, per noi, la PCA èuno degli algoritmi per preparare i dati grezzi per la modellizzazione, ma non può sostituire la modellizzazione per prevedere la variabile obiettivo.

Mi sembra che tra le discussioni sui vari dettagli della PCA si sia perso il senso delle mie osservazioni su questo punto. Quindi lasciate che vi ricordi: ho dato un riferimento all'uso della PCA in un modo che non solo riduce il numero di predittori originali, ma elimina anche i predittori che sono rumore per la variabile obiettivo. Che è ciò di cui si discute in questo thread.

Quindi propongo di tornare al problema del rumore tra i predittori, e al possibile uso di un'idea molto specifica di applicazione della PCA per risolvere questo problema.

 
Dr.Trader:

Questo creerà l'oggetto resNipals (Nonlinear Estimation by Iterative Partial Least Squares) con 5 componenti principali per l'analisi della tabella metaboliteDataComplete. Invece di metaboliteDataComplete, potete sostituire la vostra tabella ...........

Quella che hai provato è la Nipals, è mostrata nella seconda foto sul sito, non è neanche molto separabile, dovresti prendere quella della terza foto rete neurale PCA

=========================

un po' fuori tema ma ho bisogno di aiuto con il codice....

Ho dei predittori in colonne, voglio contare la differenza di tutti i predittori con tutte quelle combinazioni, l'ho implementato, il problema è che ora ho bisogno di nominare adeguatamente ogni combinazione per capire cosa è cosa

Diciamo che abbiamo colonne con predittori "A" , "Б" , "С"

Faccio combinazioni di differenze

1) A - B

2) A - C

3) C - B

domanda: come faccio a dare alle nuove colonne dei nomi come "a_minus_b" , "a_minus_c"

Sto padroneggiando R e la programmazione in generale, quindi non ho familiarità con questi trucchi

Cosa devo aggiungere a questo codice?

a <- 1:5
b <- 6:10
c <- 11:15
d <- 16:20
dt <- data.frame(a,b,c,d) 
dt

#  все комбинации индексов между двумя переменными
#  еще транспонирую(переворачиваю матрицу) мне так удобней воспринимать
combi <- t(  combn(1:ncol(dt),2)  )  
combi  

#  пустая фрейм куда буду записывать результат вычислений с комбинацыями
res.dt <- as.data.frame(  matrix(nrow = nrow(dt) , ncol = nrow(combi))   )
res.dt

for(i in 1:ncol(res.dt)){
  #  буду проводить вычитание одной перем из другой во всех комбинацыях
  #  и записывать в res.dt
  ii <- combi[i,1]
  jj <- combi[i,2]
  
  res.dt[,i] <- dt[,ii] - dt[,jj]
}
res.dt
 
mytarmailS:

Quella che hai provato è la Nipals, è mostrata nella seconda foto sul sito, non è nemmeno molto separabile, dovresti prendere quella nella terza foto rete neurale PCA

=========================

un po' fuori tema ma ho bisogno di aiuto con il codice....

Ho dei predittori in colonne, voglio contare la differenza di tutti i predittori con tutte quelle combinazioni, l'ho implementato, il problema è che ora ho bisogno di nominare adeguatamente ogni combinazione per capire cosa è cosa

Diciamo che abbiamo colonne con predittori "A" , "Б" , "С"

Faccio combinazioni di differenze

1) A - B

2) A - C

3) C - B

domanda: come faccio a dare alle nuove colonne dei nomi come "a_minus_b" , "a_minus_c"

Sto padroneggiando R e la programmazione in generale, quindi non ho familiarità con questi trucchi

Cosa devo aggiungere a questo codice?

Sembra così.

colnames() <- c(".", ".")

Ci sono anche i nomi

Vedere l'aiuto.

 
SanSanych Fomenko:

La PCA è stata originariamente progettata per risolvere due problemi:

La PCA era originariamente destinata a ridurre la dimensionalità della serie originale. Questo è tutto. Usarlo per selezionare i predittori non ha senso.
 
SanSanych Fomenko:

All'incirca così.

colnames() <- c(".", ".")

Ci sono anche dei nomi

Vedi riferimento.

)) sì, lo so, ma se ci sono 1000 variabili, perché scrivere manualmente ognuna di esse?
 

Dr.Trader:

...

I dati sono presi da eurusd d1, classe 0 o 1 - caduta o aumento del prezzo per la prossima barra. Se il modello predice correttamente il risultato per test.csv almeno in 6 casi su 10, allora si può provare a fare trading con esso nel Forex, in linea di principio, non perderà, ma non aspettatevi troppo profitto. Se predice correttamente in 7 casi su 10 (e più in alto) - questa è la strada giusta per il graal, dobbiamo provare l'allenamento e testare il modello su altri anni e mesi, e se tutto sarà lo stesso - allora molto bene.

...


Più specificamente nel file di report:

/**
* La qualità della modellazione in fuori campione:
*
* TruePositives: 182
* TrueNegatives: 181
* FalsePositive: 1
* FalsiNegativi: 1
* Totale dei modelli su campioni con statistiche: 365
* Errori totali nel fuori campione: 2
* Sensibilità della capacità di generalizzazione: 99.4535519125683%.
* Specificità della capacità di generalizzazione: 99.45054945054946%
* Capacità di generalizzazione: 98.90410136311776%
* Indicatore di Reshetov: 8.852456238401455
*/


È il momento di costruire una squadra e creare un progetto Open Source - sistema automatizzato per questo scopo su mql5 e Java. Mostrerò il codice sorgente del classificatore binario in Java e lo script MQL5, che crea un campione per la formazione dei modelli.

Piano approssimativo di come funzionerà il complesso:

  1. Per ogni strumento finanziario ci sono robot separati sui grafici, che vengono attivati dai prezzi di apertura delle barre e scaricano i modelli nei file.
  2. L'applicazione Java (classificatore binario) scarica i modelli per ogni simbolo e attende con un intervallo di 1 secondo i file creati dai robot dal passo 1. Il file pattern viene quindi cancellato dal disco. Sulla base del modello, lo strumento classifica un segnale di trading secondo il modello e lo salva nel file.
  3. Un robot aspetta i file dall'hedge dal passo 2. Non appena il file viene trovato, il robot legge lo strumento e il segnale da esso e apre o inverte un'operazione sullo strumento secondo il segnale. Il file letto viene cancellato.

Se sei interessato ad unirti al progetto e sai programmare in Java o MQL5, iscriviti a questo thread.

 
mytarmailS:

Ciao, hai usato la funzione sbagliata, avresti dovuto usare"nlPca" come indicato nel sito che ho dato, ma è colpa mia, hai bisogno di più dettagli...

Qui invece di prevedere - montato, prova, forse ci riuscirai

Questo esempio viene da un altro thread purtroppo. Per esempio in Forex possiamo sempre ottenere il 100% dei dati, ma in altri campi dove i dati sono acquisiti sperimentalmente ci saranno sempre valori mancanti. In questo esempio la PCA è usata per ricostruire i valori mancanti nei predittori stessi. Nell'esempio si cancella a caso il valore in una delle tre colonne, si crea un modello pca e lo si usa per ricostruire i valori mancanti.

Non ho mai provato questo, ma tecnicamente si potrebbe anche trattare la variabile target come un predittore includendola nel modello pca. Poi, nei nuovi dati il suo valore sarà sconosciuto, quindi pca può riempire quei valori mancanti.

source("https://bioconductor.org/biocLite.R")
biocLite("pcaMethods")        

#создание  pca объекта
library(pcaMethods)

##  Data set with three variables where data points constitute a helix
#trainData - таблица с обучающими примерами. Целевая переменная тоже должна быть в этойже таблице. Пример колонок: Close,Hour,MA30,target. (target - целевая переменная, со значениями например 0 или 1 обозначающими падение/рост цены)
## 50 steps is not enough, for good estimation use 1000
NlPca <- pca(trainData, nPcs=1, method="nlpca", maxSteps=50)
#newData - таблица с новыми данными, для проверки модели. Колонки должны быть теже Close,Hour,MA30,target
newData[,"target"] <- NA  #целевая  переменная на новых данных не должны быть известна модели, и в случае NA - функция fitted должна подставить туда подходящие значения
fittedNewData <- fitted(NlPca, newData)
fittedNewData[,"target"] #  ваш результат предсказания
Я не могу начать новую нормальную строку :/ В общем можно сделать как я написал выше, но это не предсказание а реконструкция. PCA модель может просто найти некие значения которые "подойдут". Гарантий никаких нет, я предполагаю что ошибка будет 50%
 
Combinatore:
La PCA era originariamente intesa a ridurre la dimensionalità della serie originale. Questo è tutto. Usarlo per selezionare i predittori non ha senso.

No, va bene. Poiché i predittori utilizzati per ciascuna delle componenti principali sono noti, possiamo tranquillamente escludere i predittori che non sono utilizzati nelle componenti principali. Leggi questo, mi è piaciuto: http://www.win-vector.com/blog/2016/05/pcr_part2_yaware/ Contiene 5 buoni predittori e decine di predittori di rumore. Setacciano il rumore con l'aiuto dell'analisi. Ho usato lo stesso codice per altri esempi incontrati in questo thread, generalmente funziona. Ma il forex è più complicato, non ho immagini così belle con gli indicatori, dovrei pensare a qualcosa di più intelligente.

 
Dr.Trader:

Questo esempio è purtroppo di un altro argomento. In Forex per esempio possiamo sempre recuperare il 100% dei dati, ma in altri campi dove i dati sono ottenuti sperimentalmente ci saranno sempre dei vuoti, dei valori mancanti. In questo esempio la PCA è usata per ricostruire i valori mancanti nei predittori stessi. Nell'esempio si cancella a caso un valore in una delle tre colonne, si crea un modello pca e lo si usa per ricostruire i valori mancanti.

Non ho mai provato questo, ma tecnicamente si potrebbe anche trattare la variabile target come un predittore includendola nel modello pca. Poi, nei nuovi dati il suo valore sarà sconosciuto, quindi pca può riempire i valori mancanti.

Ho sospettato che non è un caso che questi "NA" siano buttati nella data, ma ho letto il manuale, dice chiaramente PCA con una rete neurale, ma poi non è ancora chiaro come questo tizio del sito abbia ottenuto questa bella immagine con un buon partizionamento per classi