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

 
Aleksey Nikolayev #:

Unarticolo con un approccio simile a quello promosso da Aleksey Vyazmikin. Invece di un albero di classificazione, viene costruito un "albero delle differenze", in cui ogni foglia corrisponde a una diversa probabilità di un evento (ad esempio, la frequenza degli incendi). In sostanza, si tratta di una variante del clustering.

Premetto subito che non sono pronto a raccontare l'articolo in dettaglio, poiché l'ho letto solo di sfuggita.

Grazie per l'articolo!

L'ho tradotto e letto.

Potete aiutarmi a tradurre l'algoritmo sotto forma di formule in un linguaggio più comprensibile? E proverò a scrivere il codice di questo metodo di costruzione di un albero.

 
Maxim Dmitrievsky #:
Ho risposto in modo specifico alla tua domanda specifica - in qualsiasi modo tu voglia. Sono affari tuoi. È persino strano il motivo per cui mi è stato chiesto. Non aveva nulla a che fare con l'argomento che mi interessava.

Hmm, avete parlato qui nel thread dei modelli di sollevamento, che sono un'evoluzione delle prove A-B. Quindi, il metodo è pensato per stimare l'impatto quando il bersaglio cambia rispetto al nuovo impatto. Quindi mi sembra ovvio che si debba stabilire il punto di partenza dell'influenza del predittore ricercato. Qui volevo sentire il vostro parere su questo problema. Compresi i motivi per cui ritenete che non sia importante.

 
Maxim Dmitrievsky #:
Perché chiamare i capolavori spazzatura? Ti ho offerto gratuitamente, anche i tuoi superlativi, proprio come Alexei. Ma sono stato mandato al kodobazu. E ora lui, il lamentatore, va in giro a chiamarmi per nome.

Chi è che si lamenta? Chi è che mi chiama per nome?

Se sono io, le accuse sono infondate. Spenderò le mie energie per eliminare gli indesiderati, in tutta onestà, solo se è necessario per raggiungere i miei obiettivi.

Mi sono offerto di fornire i valori dei predittori per una verifica, visto che è veloce.

Ho scritto prima che uso i predittori in gran numero sui dati di ZZ, ne ho anche descritto il succo. È controproducente riscriverlo in python.

 
Aleksey Vyazmikin #:

Grazie per l'articolo!

Tradotto, letto.

Potete aiutarmi a tradurre l'algoritmo sotto forma di formule in un linguaggio più comprensibile? E proverò a scrivere il codice di questo metodo di costruzione di un albero.

Nell'articolo, a pagina 10, c'è un'implementazione sotto forma di pseudocodice. Nella penultima pagina, in appendice, ci sono i riferimenti all'implementazione in linguaggio R e ai dati utilizzati nell'articolo.

In generale, come si implementano gli alberi decisionali in mql5? Attraverso array o modelli?

 
Aleksey Vyazmikin #:

Hmm, avete parlato qui nel thread dei modelli di sollevamento, che sono un'evoluzione dei test A-B. Quindi, il metodo è progettato per stimare l'influenza quando il target cambia rispetto alla nuova influenza. Mi sembra quindi ovvio che si debba stabilire il punto di partenza dell'influenza del predittore ricercato. Volevo sapere cosa ne pensate di questo problema. Compreso il motivo per cui ritenete che non sia importante.

I campioni negli esperimenti randomizzati sono determinati in modo casuale. L'inizio del libro.

C'è l'apertura di operazioni a caso e il corrispondente risultato sul gruppo di controllo, e c'è un modello costruito su un altro sottocampione, il gruppo di test. Dobbiamo determinare l'effetto dell'utilizzo di tale modello, se è positivo per il gruppo di controllo. In caso affermativo, si può modificare il modello in uno dei modi suggeriti.

Se si esegue un semplice test su nuovi dati, non è possibile determinare l'effetto perché spesso i dati sono distorti. Pertanto, la formula è costituita da due sommatorie ATE + Bias. Si può andare oltre e definire il CATE, cioè caso per caso, e selezionare solo quelli che vengono trattati meglio, mentre gli altri vengono ignorati/eliminati nel trading.

In termini di Sanych, cercare la stazionarietà nella non stazionarietà.
 
Aleksey Vyazmikin #:

Chi è che si lamenta? Chi fa i nomi?

Se si tratta di me, le accuse sono infondate. Spenderò le mie energie per eliminare l'indesiderabile, nella correttezza, solo se è necessario per raggiungere i miei obiettivi.

Mi sono offerto di fornire i valori dei predittori per una verifica, visto che è veloce.

Prima ho scritto che uso i predittori in gran numero sui dati di ZZ, e ne ho anche descritto il succo. Riscrivere questo in python è controproducente.

Ti lamenti e mi chiami per nome come un bambino
E in una piccola quantità di tutto ciò che è produttivo)?
 
def R_learner():
    dataset = get_prices()
    dataset = labeling(dataset)

    data = dataset[dataset.index < FORWARD].copy()
    data['treatment'] = data['labels'].apply(lambda x: np.random.choice([0, 1], p=[0.2, 0.8])) // случайно выбрал элементы для лечения


    X = data[data['treatment'] == 1]
    X = X[X.columns[1:-2]]
    X_t = data[data['treatment'] == 0]
    X_t = X_t[X_t.columns[1:-2]]

    y = data[data['treatment'] == 1]
    y = y[y.columns[-2]]
    y_t = data[data['treatment'] == 0]
    y_t = y_t[y_t.columns[-2]]

    treat_m = CatBoostClassifier(iterations=1000,
                                depth=6,
                                custom_loss=['Accuracy'],
                                eval_metric='Accuracy',
                                verbose=False,
                                use_best_model=True,
                                task_type='CPU')
    treat_m.fit(X, y, eval_set=(X_t, y_t),
                    early_stopping_rounds=50, plot=False) // обучил модель на этих примерах, остальные попали в валидацию

    data['y_t'] = [x[0] < 0.5 for x in treat_m.predict_proba(data[data.columns[1:-2]])] // теперь метки классов - это предсказания обученной модели
    data['y_t'] = data['y_t'].astype(float)
    
    # perform residualisation
    debias_m = CatBoostClassifier(iterations = 5,
                                    max_depth = 1,
                                    early_stopping_rounds = 2,
                                    verbose = False) // эта модель определяет смещение в оценках тритмента
    denoise_m = CatBoostClassifier(iterations = 5,
                                    max_depth = 1,
                                    early_stopping_rounds = 2,
                                    verbose = False) // эта модель определяет смещение в оценках целевой

    t_diff = data['treatment'] - cross_val_predict(debias_m, 
                                                data[data.columns[1:-3]], 
                                                data[data.columns[-2]], 
                                                method='predict_proba', cv=5)[:, 0] // определяем тритмент эффект

    y_diff =  data['y_t'] - cross_val_predict(denoise_m, 
                                                data[data.columns[1:-3]], 
                                                data[data.columns[-1]], 
                                                method='predict_proba', cv=5)[:, 0] // определяем байес

    # create the weights
    w = t_diff ** 2 // новые веса для модели
    # create the transformed target
    y_debias = (y_diff / t_diff).apply(lambda x: 1 if x > 0.0 else 0) // новые метки без смещения

    data['weights'] = w
    data['y_debias'] = y_debias
    data = data.drop(['labels', 'treatment', 'y_t'], axis=1)


    X = data[data.columns[1:-2]]
    y = data[data.columns[-2:]]

    train_X, test_X, train_y, test_y = train_test_split(
            X, y, train_size=0.5, test_size=0.5, shuffle=True)

    train_data = Pool(
        data=train_X,
        label=train_y[train_y.columns[1]],
        weight=train_y[train_y.columns[0]] // добавляем веса к обучению
    )

    eval_data = Pool(
        data=test_X,
        label=test_y[test_y.columns[1]],
        weight=test_y[test_y.columns[0]]
    )

    # learn final model with train and validation subsets
    model = CatBoostClassifier(iterations=1000,
                                depth=6,
                                learning_rate=0.1,
                                custom_loss=['Accuracy'],
                                eval_metric='Accuracy',
                                verbose=False,
                                use_best_model=True,
                                task_type='CPU')

    model.fit(X= train_data, eval_set=eval_data,
                early_stopping_rounds=50, plot=False) // учим новую модель с обесшумленными метками и дополнительными весами

    return model

Questo approccio non funziona bene con i nuovi dati. Apparentemente perché ho fatto un pessimo lavoro nel definire cosa dovrebbe essere un tritolo e in relazione a cosa :)

l'idea di R-learner è tratta da qui
 
Maxim Dmitrievsky #:

Questo approccio non funziona bene con i nuovi dati. Apparentemente perché ho fatto un pessimo lavoro nel definire cosa dovrebbe essere un tritolo e in relazione a cosa :)

l'idea di R-learner è tratta da qui

L'articolo utilizza conoscenze molto importanti sugli input - l'elasticità della domanda e dell'offerta. Da qui l'odore persistente di adattamento eccessivo.

Non disponiamodi tali dati fondamentali sulle quotazioni, inoltre è probabile che l'elasticità non funzioni: il prezzo di un asset può variare da zero alle stelle.

Il codice che avete postato, così come l'approccio causale stesso, sarà utile solo dopo averlo eseguito nel tester MKL-5, e necessariamente con un forward.

 

Anche se aggiustato per l'elasticità, non ha funzionato affatto con i nuovi dati. Invece, è rimasto inalterato sulla linea.

I motivi sono in corso di definizione...

Perché potrebbe aver funzionato, ma non nel modo in cui si desiderava che funzionasse.


 
Maxim Dmitrievsky #:

Anche se aggiustato per l'elasticità, non ha funzionato affatto sui nuovi dati. Anche se è rimasto valido sulla traccia.

Le ragioni sono in corso di definizione...

Perché potrebbe aver funzionato, ma non nel modo in cui si desiderava che funzionasse.


I grafici non mostrano una chiara causa-effetto come la temperatura dell'aria e --> l'acquisto di gelato.