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

 

Alexey, ho un'altra domanda sulla tua funzione per setacciare i predittori - che intervallo di valori di ritorno dovrebbe avere? Ho eseguito quella funzione di fitness sui miei dati con ingressi casuali (fitness_f(runif(predictor_number, min = 0, max = 1)), ho visto risultati da 0 a 0,03. Vedo anche nel codice che in caso di errore (ingressi zero) la funzione restituisce 0. Qui c'è qualcosa che non va, GenSA cerca di minimizzare i risultati, cioè alla fine GenSA arriva a zero ingressi e si ferma. Forse allora dovremmo cambiare il segno del risultato della funzione fitness in modo che GenSA agisca nella direzione opposta?
Se la funzione di fitness a un certo punto dell'ottimizzazione inizia a restituire numeri negativi e più sono bassi meglio è - allora tutto è ok ora.

 
Dr.Trader:

Alexey, ho un'altra domanda per la tua funzione per setacciare i predittori - che intervallo di valori di ritorno dovrebbe avere? Ho eseguito quella funzione di fitness sui miei dati con ingressi casuali (fitness_f(runif(predictor_number, min = 0, max = 1)), ho visto risultati da 0 a 0,03. Vedo anche nel codice che in caso di errore (ingressi zero) la funzione restituisce 0. Qui c'è qualcosa che non va, GenSA cerca di minimizzare i risultati, cioè alla fine GenSA arriva a zero ingressi e si ferma. Forse allora dovremmo cambiare il segno del risultato della funzione fitness in modo che GenSA agisca nella direzione opposta?
Se la funzione di fitness ad un certo punto dell'ottimizzazione inizia a restituire numeri negativi e più sono bassi meglio è - allora tutto è ok ora.

Questa è una buona domanda. Tu lo capisci.

Sto scrivendo un articolo su questo metodo ed ecco un estratto:


Schema a blocchi dell'algoritmo basato sulla mutua informazione corretta e sulla ricerca stocastica per un sottoinsieme di predittori.


  • a) Classificare il set di dati in uno dei modi noti.
  • b) Stimare i parametri del dataset come il numero di righe, i predittori, il numero medio di livelli dei predittori (se hanno diversi numeri di livelli) e sulla base di questi dati calcolare il "numero ottimale" di predittori nel sottoinsieme finale.
  • c) Inizializzare un vettore di tipo numerico con la lunghezza nel numero di variabili di ingresso dell'insieme, utilizzando numeri casuali distribuiti uniformemente nell'intervallo [0, 1] e assegnare il limite inferiore (0) e superiore (1) per i valori del vettore - che è l'argomento della funzione SA.
  • d) Inizializzare la funzione di valutazione quantile multinformazione, la funzione quantile di mutua informazione e la funzione di fitness che combina tutti i calcoli.
  • e) Impostare il numero di simulazioni Monte Carlo per stimare i quantili del MI e del WI; impostare i quantili (ad esempio 0,9) per i valori di rumore del MI e del WI.
  • f) Impostare il tempo o il numero di iterazioni dell'algoritmo. Più sono, meglio è.
  • g) Eseguire l'algoritmo, attendere i risultati.


Il punto "b" deve essere chiarito. Il numero ottimale di variabili è un valore condizionale che viene calcolato con la formula:

optim_var_num < - log(x = sample_size / 100, base = round(mean_levels, 0))


L'intuizione è che, data l'assunzione di indipendenza delle variabili di input, il numero medio di livelli di una variabile deve essere elevato alla potenza richiesta per ottenere un numero totale di livelli unici interagenti tali che ognuno di essi abbia in media almeno n osservazioni concentrate, dove n è preso come 100.

Non possiamo avere troppe variabili di input con troppi livelli, poiché una stima conservativa della frequenza delle osservazioni sui livelli di input sarebbe troppo piccola per dare un'inferenza statistica sulla dipendenza della variabile di output sull'insieme dei livelli di input.

Impostando la soglia al di sopra della quale i valori vettoriali del numero di variabili di input saranno convertiti in 1 (il flag di inclusione dell'indice delle variabili), facciamo un calcolo probabilistico:

threshold < - 1 - optim_var_num / predictor_number


La sua essenza è che impostiamo il valore massimo di probabilità per selezionare il numero ottimale calcolato di ingressi. E questa logica è verificata applicando la distribuzione binomiale.

Per esempio, prendiamo i nostri dati: metà dell'intero set, che viene utilizzato per l'allenamento.

Abbiamo 17.973 righe, 12 predittori, ognuno con 5 livelli. Applicando le formule di cui sopra, otteniamo che il numero ottimale di predittori è 3.226.

Applicando la formula della soglia per includere un predittore nel set, otteniamo 0,731.

Qual è il numero più probabile di variabili selezionate che si ottiene in una distribuzione binomiale?


Il massimo è 3 osservazioni. Per essere precisi, 5 ^ 3.226 ci darebbe 178 livelli, che ospiterebbero una media di 100 osservazioni ciascuno.
 
Continua. Il valore 0 all'uscita della funzione è il valore massimo del caso peggiore. Se nessun elemento del vettore par supera la soglia, automaticamente il valore è 0. Il miglior valore possibile è -1. Significa che l'uscita è completamente deterministica dal sottoinsieme di ingressi.
 

Sì, ho trovato un sottoinsieme di predittori con un valore di fitness negativo. C'erano molti predittori, diverse migliaia, ho limitato gensa a solo 2 iterazioni, mi ci sono volute 8 ore :). Il risultato della funzione di fitness è 6%. Nel fronttest su questi predittori con nnet ho ottenuto il 45% di errore. Non è molto, non credo che l'EA sarebbe in profitto. Ho messo un limite di 10 iterazioni di nuovo per trovare un risultato migliore, l'ho eseguito, sono stato in attesa per 24 ore, speriamo che gensa sia mai completo. Dovrò provare genetica (libreria GA), funzionerà più velocemente con più thread (GA minimizza piuttosto che massimizzare il risultato, cioè il risultato della funzione fitness per GA dovrebbe cambiare il suo segno). Continuerò a sperimentare.

Ho letto vari articoli sul modello a componenti principali e ho cercato di insegnare il modello non solo per misurare R^2 e massimizzarlo selezionando i predittori, ma anche per testare il modello su dati fronttest. Sta uscendo un po' ambiguo. Da un lato ho aumentato la R^2 del modello rimuovendo le coppie correlate di predittori (funzione findCorrelation da bibiloteka caret), ma come si è scoperto la R^2 quando si testa il modello sui dati fronttest da questo diminuisce. Il miracolo non è avvenuto, anche il modello PCA viene riqualificato. Voglio provare una stima del predittore più complessa - dividere il campione di allenamento in due - per l'allenamento vero e proprio e per la validazione, formare il modello PCA, poi testare immediatamente sul campione di validazione, restituire il minimo R^2 come risultato finale. Se tale funzione viene utilizzata per la valutazione di un insieme di predittori e la massimizzazione di questo valore, allora verranno trovati solo quegli insiemi di predittori che danno buoni risultati sul campione addestrato e sui nuovi dati. Dobbiamo controllare.

Inoltre devo aver frainteso il testo del primo articolo sulla PCA in questo thread. Stava dicendo che il numero di componenti deve essere scelto per descrivere il 95% della variazione, pensavo che stessero parlando della precisione della previsione della variabile obiettivo. Ma non è questo il caso, le componenti principali sono costruite senza variabili target, e il 95% di accuratezza è quanto accuratamente i dati grezzi sono descritti usando proprio quelle componenti. E l'accuratezza delle previsioni non c'entra affatto.

 
Dr.Trader:

Sì, ho trovato un sottoinsieme di predittori con un valore di fitness negativo. C'erano molti predittori, diverse migliaia, ho limitato gensa a solo 2 iterazioni, mi ci sono volute 8 ore :). Il risultato della funzione di fitness è 6%. Nel fronttest su questi predittori con nnet ho ottenuto il 45% di errore. Non è molto, non credo che l'EA sarebbe in profitto. Ho messo un limite di 10 iterazioni di nuovo per trovare un risultato migliore, l'ho eseguito, sono stato in attesa per 24 ore, speriamo che gensa sia mai completo. Dovrò provare la genetica (libreria GA), funzionerà più velocemente con più thread (GA minimizza piuttosto che massimizzare il risultato, cioè il risultato della funzione fitness per GA dovrebbe cambiare il suo segno). Sperimenterò di più.

Ho letto vari articoli sul modello a componenti principali e ho cercato non solo di addestrare il modello per misurare R^2 e massimizzarlo selezionando i predittori, ma anche di testare realmente il modello sui dati fronttest. Sta uscendo un po' ambiguo. Da un lato ho aumentato R^2 del modello rimuovendo le coppie correlate di predittori (funzione findCorrelation da bibiloteka caret), ma come si è scoperto R^2 quando si testa il modello sui dati fronttest da questo cade. Il miracolo non è avvenuto, anche il modello PCA viene riqualificato. Voglio provare una stima del predittore più complessa - dividere il campione di allenamento in due - per l'allenamento vero e proprio e per la validazione, formare il modello PCA, poi testare immediatamente sul campione di validazione, restituire il minimo R^2 come risultato finale. Se tale funzione viene utilizzata per la valutazione di un insieme di predittori e la massimizzazione di questo valore, allora verranno trovati solo quegli insiemi di predittori che danno buoni risultati sui dati addestrati e nuovi. Dovremo controllare.

Inoltre, devo aver sbagliato il testo del primo articolo sulla PCA in questo thread. Stava dicendo che il numero di componenti dovrebbe essere scelto per descrivere il 95% della variazione, pensavo che stessero parlando dell'accuratezza della previsione della variabile obiettivo. Ma non è questo il caso, le componenti principali sono costruite senza variabili target, e il 95% di accuratezza è quanto accuratamente i dati grezzi sono descritti usando proprio quelle componenti. E l'accuratezza delle previsioni non c'entra affatto.

Sì, si scopre che non si capisce.

La PCA può essere applicata come strumento indipendente, ma l'articolo non ne parla.

Ciò che viene discusso è come filtrare il rumore da un grande insieme di predittori.

Secondo la mia comprensione questo viene fatto nei seguenti passi:

1. Y-aware. Si tratta di scalare i predittori a seconda della variabile obiettivo

2. Utilizzando l'algoritmo PCA, un insieme di predittori viene ordinato e viene presa la parte che spiega il 95% della varianza.

2. O così (non l'ho capito io) usando l'algoritmo PCA, si costruisce un nuovo insieme di predittori moltiplicando quello originale per i coefficienti calcolati (carico). Questo set è ordinato. Prendiamo tanti di questi nuovi vettori quanti spiegano il 95% della varianza.

PS.

Andiamo alle pubblicazioni che Y-aware è il nuovo peep nel campo del filtraggio dei predittori di rumore.

Successo

 
SanSanych Fomenko:

2. Utilizzando l'algoritmo PCA, l'insieme dei predittori viene ordinato e viene presa la parte che spiega il 95% della varianza.

Questo non l'ho ancora capito. (Ora scriverò solo dell'approccio y-aware, per non confonderlo con l'altro). L'articolo stesso è qui:http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

Dopo il codice"princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" c'è una situazione: i dati vengono letti, scalati per Y, i componenti PC vengono costruiti. Questa funzione non limita il numero di componenti - tanti quanti sono i predittori. La prima cosa da fare è selezionare solo una parte di essi (si raccomanda di descrivere il 95% delle variazioni). Nell'articolo stesso l'autore ha guardato il grafico sdev (alcune varianze non specificate) per i componenti, e ha detto che 2 o 5 sarebbero stati sufficienti, perché si distinguono nel grafico. In qualche modo non spicca nulla, il grafico è dolcemente decrescente.

C'è una tabella sdev, il numero di voci in essa è uguale al numero di componenti. È possibile calcolare quanti componenti prendere da questo? La somma di tutti i numeri non è necessariamente limitata a 1, ho visto una somma di 6, e probabilmente di più.

> princ$sdev
[1] 0.17585066 0.15322845 0.13818021 0.13090573 0.12177070 0.11854969
[7] 0.11176954 0.10910302 0.10616631 0.10265987 0.10056754 0.09441041
[13] 0.09343688 0.08832101 0.08620753 0.08235531 0.08132748 0.07992235
[19] 0.07800569 0.07575063 0.07463254 0.07311194 0.07210698 0.07032990
[25] 0.06907964 0.06763711 0.06634935 0.06544930 0.06451703 0.06260861
 
Dr.Trader:

Non l'ho ancora capito. (Ora scriverò solo dell'approccio y-aware, per non confonderlo con l'altro). L'articolo stesso è qui:http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

Dopo il codice"princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" abbiamo questa situazione: i dati vengono letti, scalati per Y, le componenti PC vengono costruite. Questa funzione non limita il numero di componenti - tanti quanti sono i predittori. La prima cosa da fare è selezionare solo una parte di essi (si raccomanda di descrivere il 95% delle variazioni). Nell'articolo stesso l'autore ha guardato il grafico sdev (alcune varianze non specificate) per i componenti, e ha detto che 2 o 5 sarebbero stati sufficienti, perché si distinguono nel grafico. In qualche modo non spicca nulla, il grafico è dolcemente decrescente.

C'è una tabella sdev, il numero di voci in essa è uguale al numero di componenti. È possibile calcolare quanti componenti prendere da questo? La somma di tutti i numeri non è necessariamente limitata a 1, ho visto una somma di 6, e probabilmente di più.

Eseguo rattle e ottengo tre tavoli:

  • Deviazioni standard: qui si possono avere tutti i tipi di valori e dire che la somma = 1 non è necessaria
  • Rotazione: questi sono i coefficienti per i quali dovremmo moltiplicare i vettori originali per ottenere quelli nuovi
  • Importanza dei componenti. cosa viene discusso

L'ultima ha la 1a colonna che dice che se si prende solo PC1 spiegherà 0,9761 della variabilità (proporzione cumulativa), se si prendono DUE componenti - PC1 e PC2 spiegherà 0,99996 ecc.

(Non so come inserire le tabelle)

Importanza dei componenti:

PC1 PC2 PC3 PC4 PC5

Deviazione standard 2,2092 0,34555 0,01057 0,008382 0,004236

Percentuale della varianza 0,9761 0,02388 0,00002 0,000010 0,000000

Proporzione cumulativa 0,9761 0,99996 0,99998 1,000000 1,000000

 

Ho cercato questa tabella per molto tempo, finalmente l'ho trovata nel riassunto. Il posto più ovvio in realtà :) , grazie per averlo mostrato. Questo è il caso in cui qualcosa è nel sommario, ma non negli attributi dell'oggetto.

summary(princ)$importance[3,]

Si scopre che quell'articolo ha un seguito, dedicato proprio alla questione della selezione dei componenti, con qualche soluzione speciale per Y-aware. Non l'ho ancora provato.

http://www.win-vector.com/blog/2016/05/pcr_part3_pickk/

 
Dr.Trader:

Ho cercato questa tabella per molto tempo, finalmente l'ho trovata nel riassunto. Il posto più ovvio in realtà :) , grazie per averlo mostrato. Questo è il caso in cui qualcosa è nel sommario, ma non negli attributi dell'oggetto.

Si scopre che quell'articolo ha un seguito, dedicato proprio alla questione della selezione dei componenti, con qualche soluzione speciale per Y-aware. Non l'ho ancora provato.

http://www.win-vector.com/blog/2016/05/pcr_part3_pickk/

In questo R, non appena si ottiene un oggetto, si mette str e summary su di esso, e anche plot. Si possono vedere un sacco di cose incredibili. Il punto è che la cosa "oggetto" in R è molto più complicata che in molti linguaggi di programmazione.
 
Dr.Trader:

Sì, ho trovato un sottoinsieme di predittori con un valore di fitness negativo. C'erano molti predittori, diverse migliaia, ho limitato gensa a solo 2 iterazioni, mi ci sono volute 8 ore :). Il risultato della funzione di fitness è 6%. Nel fronttest su questi predittori con nnet ho ottenuto il 45% di errore. Non è molto, non credo che l'EA sarebbe in profitto. Ho messo un limite di 10 iterazioni di nuovo per trovare un risultato migliore, l'ho eseguito, sono stato in attesa per 24 ore, speriamo che gensa sia mai completo. Dovrò provare genetica (libreria GA), funzionerà più velocemente con più thread (GA minimizza piuttosto che massimizzare il risultato, cioè il risultato della funzione fitness per GA dovrebbe cambiare il suo segno). Sperimenterò di più.

Ho letto vari articoli sul modello a componenti principali, e ora ho cercato non solo di addestrare il modello per misurare R^2 e massimizzarlo selezionando i predittori, ma anche di testare realmente il modello sui dati del fronttest. Sta uscendo un po' ambiguo. Da un lato ho aumentato la R^2 del modello rimuovendo le coppie correlate di predittori (funzione findCorrelation da bibiloteka caret), ma come si è scoperto la R^2 quando si testa il modello sui dati fronttest da questo diminuisce. Il miracolo non è avvenuto, anche il modello PCA viene riqualificato. Voglio provare una stima del predittore più complessa - dividere il campione di allenamento in due - per l'allenamento vero e proprio e per la validazione, formare il modello PCA, poi testare immediatamente sul campione di validazione, restituire il minimo R^2 come risultato finale. Se tale funzione viene utilizzata per la valutazione di un insieme di predittori e la massimizzazione di questo valore, allora verranno trovati solo quegli insiemi di predittori che danno buoni risultati sul campione addestrato e sui nuovi dati. Dovremo controllare.

Inoltre, devo aver sbagliato il testo del primo articolo sulla PCA in questo thread. Lì è stato detto che il numero di componenti dovrebbe essere scelto per descrivere il 95% della variazione, pensavo che stessero parlando della precisione della previsione della variabile obiettivo. Ma non è questo il caso, le componenti principali sono costruite senza variabili target, e il 95% di accuratezza è quanto accuratamente i dati grezzi sono descritti usando proprio quelle componenti. E l'accuratezza delle previsioni non c'entra affatto.

Non capisco perché ci sia voluto così tanto tempo. Quanti numeri di optim_var_number hai ottenuto? Dovrebbe essere entro il 10. Impostatelo a 1200 secondi e dovrebbe essere già qualcosa.