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

 
mytarmailS #:
E sarà comunque vuoto

Beh, sì, se non vuoi.

 
mytarmailS #:
È triste che l'apprendimento automatico con il targeting non funzioni e che non funzioni l'apprendimento in un'unica soluzione....

rimuovere le caratteristiche simmetriche per ridurre le distorsioni.

Ad esempio, sostituire gli incrementi con incrementi assoluti (volatilità).

a volte aiuta

 
Maxim Dmitrievsky #:

rimuovere le caratteristiche simmetriche per ridurre il bias

Ad esempio, sostituire gli incrementi con incrementi assoluti (volatilità).

A volte è utile.

No, è molto più complicato di così.
 
Aleksey Vyazmikin #:

La mia idea è di ottenere un modello che selezioni i segmenti quantistici stabili in base a una serie di caratteristiche statistiche. Tutti sono invitati a partecipare a questo progetto.

Perché sei così ossessionato da questi quanti...?

Non c'è nulla di intellettuale in loro. Basta dividere per esempio 10000 righe in 100 pezzi, cioè ordinare e partire dal basso contando 100 righe, se le seguenti coincidono con la centesima riga (cioè si ripetono), allora le riferiamo tutte al primo pezzo. Se i duplicati sono finiti, iniziamo a digitare le righe nel secondo quantum - le successive 100 + i duplicati, se ce ne sono. E così via fino a esaurire le righe.

Anche un solo albero contiene ordini di grandezza di informazioni più utili (perché è stato addestrato sui dati) rispetto a questi segmenti di quanti (solo 100 stringhe ordinate con duplicati).

 
Forester #:

Perché sei così attaccato a questi quants? ....

Non c'è nulla di intellettuale in esse. Basta dividere per esempio 10000 righe in 100 pezzi, cioè ordinare e partire dal basso contando 100 righe, se le successive coincidono con la centesima riga (cioè le ripetizioni), allora le riferiamo tutte al primo pezzo. Se i duplicati sono finiti, iniziamo a digitare le righe nel secondo quantum - le prossime 100 + i duplicati, se ce ne sono. E così via fino a esaurire le righe.

Anche un solo albero contiene ordini di grandezza di informazioni più utili (perché è stato addestrato sui dati) rispetto a questi segmenti di quanti (solo 100 righe ordinate con duplicati).

I segmenti quantici sono i mattoni con cui viene costruito il modello CatBoost. Inizialmente, a quanto ho capito, in questo modo è stata risolta la questione del risparmio di memoria e in generale dell'accelerazione dei calcoli. Un guadagno secondario è la riduzione delle varianti di combinazioni di indicatori predittivi, un passo avanti verso la riduzione della multicollinearità, che in generale contribuisce alla velocità e alla qualità della formazione. Inoltre, in parte, viene risolto il problema della deriva dei dati.

Vedo anche un vantaggio per un altro aspetto: l'esplorazione del potenziale della stima probabilistica nei dati dei segmenti quantistici. Se prendiamo il metodo di quantizzazione da voi proposto (in realtà è meglio immaginare che lo scopo del processo sia quello di selezionare gruppi omogenei - analogamente al clustering) e dividiamo i dati in 20 segmenti quantici uguali in base al numero di esempi, risulta che in ogni segmento quantico rimane solo il 5% dei dati. CatBoost crea per default 254 separatori - 255 segmenti. Da questi segmenti vengono poi costruiti gli alberi. Si presume che tutti i segmenti quantici siano ugualmente utili e che la loro interposizione debba essere determinata attraverso la suddivisione del gruppo in sottogruppi, con il metodo della costruzione di un albero decisionale. Il partizionamento viene effettuato sia in base alla radice che ad altri predittori. Anche se prendiamo un albero, quanti degli esempi originali della classe positiva "1" rimarranno nell'elenco finale dopo 6 suddivisioni? Dobbiamo tenere conto del fatto che la selezione degli split si basa sulla metrica del numero cumulativo di split quantistici. Tenendo conto del metodo di costruzione dell'albero stesso, diventa ovvio che quanto più qualitativa è la suddivisione del predittore in segmenti quantici, tanto meno split saranno necessari per ottenere la stessa precisione nella foglia. Noto che ogni suddivisione è un'ipotesi, e tutte le ipotesi non possono essere vere. Quindi, se effettuiamo la suddivisione tenendo conto del potenziale di un segmento quantistico di appartenere maggiormente a una delle classi, riduciamo il numero di suddivisioni per ottenere un'accuratezza simile, e quindi riduciamo il numero di ipotesi potenzialmente false (suddivisioni). Inoltre, se riusciamo a suddividere immediatamente il predittore in 3 regioni globali - due per l'appartenenza alla classe e una per l'incertezza, i modelli saranno in media più piccoli e con migliori prestazioni statistiche - mi aspetto anche più robusti.

Ad esempio, immaginiamo che il predittore sia l'oscillatore RSI - le azioni significative dei partecipanti si verificano intorno ai livelli di 70, 50, 30 - tutto ciò che va oltre - diciamo - non influisce sul processo decisionale dei partecipanti al mercato. È quindi ragionevole costruire una tabella quantistica in modo da separare questi 3 valori dal resto della popolazione. Altrimenti, una delle suddivisioni avrà casualmente più esempi nel segmento quantistico di appartenenza alla classe e si otterrà una falsa regola su una falsa ipotesi.

È possibile disegnare un grafico a barre con i punteggi dei predittori quantizzati e tracciare una curva di probabilità di appartenenza alla classe "1" per ogni colonna. Se la curva è più probabile che sia una linea retta, allora non mi fido di un predittore di questo tipo. Un buon predittore, a mio avviso, avrà una linea inclinata o dei picchi su alcune colonne.

Possiamo dire che attraverso la quantificazione cerco eventi discreti che influenzino la probabilità di movimento dei prezzi.

 
La regola è esattamente quella che dividerà
rsi>69 & rsi<71....
Questa è solo quantizzazione.
Si prende un AMO di legno, lo si divide in alberi e si estraggono quelli giusti.

Quale quantizzazione? Sei talmente insensato che è patetico.

Si risolve tutto in tre righe di codice...
E tu lavori con questa quantizzazione da anni, come un professore pazzo.
 
mytarmailS #:
La regola si limita a dividere
rsi>69 & rsi<71....
Questa è tutta la quantizzazione...
Si prende un AMO di legno, lo si divide in alberi e si estraggono quelli giusti...

Quale quantificazione? Stai dicendo una tale sciocchezza che è patetica.

Si risolve tutto in tre righe di codice...
E tu hai armeggiato con questo mezzo di quantizzazione per anni, come un professore svitato.

Ci sono diversi modi per creare una tabella quantistica. Credo che sia possibile farlo attraverso un pacchetto standard che costruisce alberi su un singolo predittore con vincoli dati nel foglio sulla percentuale di esempi. Non so quale sia questo pacchetto e come ottenere i dati nel formato che mi serve.

L'importante non è solo suddividere, ma trovare criteri di valutazione di questa suddivisione quantistica che aumentino la probabilità che l'appartenenza alla classe sia conservata sui nuovi dati.

Perché lo faccio: perché questa è la chiave per costruire un modello qualitativo.

Perché ci vuole molto tempo: molti esperimenti e script di test. Ho un po' di comprensione di OpenCL e il codice è ora in parte conteggiato su una scheda video - ci vuole tempo - devo studiare molte cose.

 
Aleksey Vyazmikin #:

L'importante non è solo il partizionamento, ma trovare criteri di valutazione di questo cutoff quantistico che aumentino la probabilità che l'appartenenza alla classe persista sui nuovi dati.

Avete mai guardato il codice nello stesso catbuster? Lo state usando. Non utilizza pacchetti di terze parti. Ma questa è una funzione così piccola (è ancora più semplice di quella che ho descritto, non sposta il punto di separazione in base al numero di duplicati).
Ho scritto dei commenti su quello che viene fuori. L'input è una colonna ordinata.

static THashSet<float> GenerateMedianBorders(
    const TVector<float>& featureValues, const TMaybe<TVector<float>>& initialBorders, int maxBordersCount) {
    THashSet<float> result;
    ui64 total = featureValues.size(); //число строк в столбце
    if (total == 0 || featureValues.front() == featureValues.back()) { // проверки
        return result;
    }

    for (int i = 0; i < maxBordersCount; ++i) { // цикл по числу квантов
        ui64 i1 = (i + 1) * total / (maxBordersCount + 1); // номер строки начала кванта номер i
        i1 = Min(i1, total - 1); // не больше числа строк 
        float val1 = featureValues[i1]; // значение в строке i1
        if (val1 != featureValues[0]) { // если != значению в 0-й строке, чтобы не было дубля с 0-й строкой
            result.insert(RegularBorder(val1, featureValues, initialBorders)); // сохранить значение в массив границ разделяющих кванты (не смотрел, но очевидно, что дубликаты пропустит и не создаст им квант)
        }
    }
    return result;
}

Come si può vedere, tutto è molto semplice e non c'è nulla di intellettuale: basta contare, per esempio, 100 righe e questo è tutto.
Varianti leggermente più complesse possono spostare il punto di separazione in base al numero di duplicati, si può anche ottimizzare la dimensione dei quanti (per esempio, se su 10000 righe 9000 duplicati, la funzione semplice sarà di 11 quanti: 10 dalle prime 1000 righe e nell'undicesima i restanti 9000 duplicati, oppure si possono dividere le prime 1000 righe in 99 quanti + 1 quanto con 9000 duplicati).
Ma non hanno nulla di intellettuale: la base è lo stesso semplice conteggio del numero di stringhe richiesto.

L'originale (esistono varianti più complicate) https://github.com/catboost/catboost/blob/3cde523d326e08b32caf1b8b138c2c5303dc52e5/library/cpp/grid_creator/binarization.cpp
Studiate le funzioni di questa pagina per una settimana e risparmierete diversi anni.

P.s. Il motivo principale per cui il prossimo quantum non ha esattamente 100 stringhe, ma 315 o 88 o 4121, non sta in qualche formula complicatissima (in cui le stringhe vengono combinate in base al potere predittivo, che si vuole usare per cercare i criteri di valutazione di questo segmento quantistico ), ma semplicemente nel numero di duplicati.
catboost/binarization.cpp at 3cde523d326e08b32caf1b8b138c2c5303dc52e5 · catboost/catboost
catboost/binarization.cpp at 3cde523d326e08b32caf1b8b138c2c5303dc52e5 · catboost/catboost
  • catboost
  • github.com
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 
È necessario salvare una persona che sta palesemente annegando ma che si diverte a suicidarsi?
Quando gli offrite una mano, lui la rifiuta, litiga con voi, non cerca di fare nulla per uscire da solo e detta le sue condizioni come:
"O mi salvi tu stesso, mi porti fuori dall'acqua tenendomi sopra la testa al ritmo della mia musica preferita, oppure non lo fai.
E poi non hai alcun desiderio di salvarmi.


 
Forester #:

Hai mai guardato il codice negli stessi catbuster? Lo state usando. Non utilizza pacchetti di terze parti. Ma questa è una funzione così piccola (è ancora più semplice di quella che ho descritto, non sposta il punto di separazione in base al numero di duplicati).
Ho scritto dei commenti su quello che viene fuori. L'input è una colonna ordinata.

Naturalmente l'ho guardato. Inoltre, sono pronto a pagare il lavoro per riprodurre tutti i metodi di quantizzazione in MQL5. Finora i tentativi sono stati infruttuosi, volete provare?

Forester #:

Come si può vedere, tutto è molto semplice e non c'è nulla di intellettuale - basta contare, ad esempio, 100 righe e il gioco è fatto.

Hai dato il metodo più semplice - sì, non è difficile.

Inoltre, ho forse scritto che esistono metodi ingegnosi di quantizzazione o qualcosa del genere? In che modo questo contraddice ciò che ho scritto?