Aprendizaje automático en el trading: teoría, práctica, operaciones y más - página 3154

 
Maxim Dmitrievsky #:
¿Por qué llamar basura a las obras maestras? Te ofrecí gratis, incluso en sus superlativos, al igual que Alexei. Pero me enviaron al kodobazu. Y ahora él, el quejica, va por ahí insultándome.

¿Quién es el quejoso? ¿Quién me insulta?

Si soy yo, las acusaciones son infundadas. Gastaré mis energías en eliminar a los indeseables, en justicia, sólo si es necesario para alcanzar mis objetivos.

Me ofrecí a dar los valores de los predictores para su verificación, ya que es rápido.

Escribí antes que utilizo predictores en grandes cantidades sobre datos de ZZ, incluso describí lo esencial. Es contraproducente reescribirlo en python.

 
Aleksey Vyazmikin #:

Gracias por el artículo.

Traducido y leído.

¿Puedes ayudarme a traducir el algoritmo en forma de fórmulas en un lenguaje más comprensible? Y voy a tratar de escribir el código de este método de construcción de un árbol.

Allí, en el artículo, en la página 10, hay una implementación en forma de pseudocódigo. En la penúltima página, en el apéndice, hay referencias a la implementación en el lenguaje R y a los datos utilizados en el artículo.

En términos generales, ¿cómo se implementan los árboles de decisión en mql5? ¿A través de matrices o plantillas?

 
Aleksey Vyazmikin #:

Hmm, usted ha informado aquí en el hilo sobre los modelos de levantamiento, que son una evolución de las pruebas A-B. Así pues, el método está diseñado para estimar la influencia cuando el objetivo cambia a partir de la nueva influencia. Así que me parece obvio que se debe establecer el punto de partida de la influencia del predictor que se busca. Aquí quería conocer su opinión sobre esta cuestión. Incluida la razón por la que crees que no es importante.

Las muestras en los experimentos aleatorios se determinan al azar. Al principio del libro.

Existe la apertura de operaciones al azar y el resultado correspondiente en el grupo de control, y existe un modelo construido sobre otra submuestra, el grupo de prueba. Tenemos que determinar el efecto de utilizar dicho modelo, si es positivo para el grupo de control. Si es así, entonces aplique el modelo de una de las formas sugeridas.

Simplemente probando con nuevos datos, no se puede determinar el efecto porque a menudo hay sesgo en los datos. Por lo tanto, la fórmula es de dos sumandos ATE + Sesgo. Se puede ir aún más lejos y definir CATE, es decir, caso por caso, y seleccionar sólo los que son mejor tratados, el resto ignorar / omitir en el comercio.

En términos de Sanych, buscar lo estacionario en lo no estacionario.
 
Aleksey Vyazmikin #:

¿Quién es el que se queja? ¿Quién insulta?

Si se trata de mí, las acusaciones carecen de fundamento. Gastaré mis energías en eliminar a los indeseables, en justicia, sólo si es necesario para alcanzar mis objetivos.

Me ofrecí a dar los valores de predicción para la verificación, ya que es rápido.

Escribí antes que utilizo predictores en grandes cantidades en los datos de ZZ, incluso describí la esencia de la misma. Reescribir esto en python es contraproducente.

Te quejas y me insultas como un niño
Y en una pequeña cantidad de todo es productivo)
 
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

Este enfoque no funciona bien con datos nuevos. Aparentemente porque hice un mal trabajo definiendo qué debería ser un tritente y en relación a qué :)

la idea de R-learner está tomada de aquí
 
Maxim Dmitrievsky #:

Este enfoque no funciona bien con datos nuevos. Aparentemente porque hice un mal trabajo definiendo qué debería ser un tritente y en relación a qué :)

la idea de R-learner está tomada de aquí

El artículo utiliza conocimientos muy importantes sobre los insumos - elasticidad de la oferta-demanda. De ahí el persistente olor a sobreajuste.

No disponemos de esos datos fundamentales de cotización, es más, es probable que la elasticidad no funcione: el precio de un activo puede variar de cero a las nubes.

El código que has colgado, así como el propio enfoque causal, sólo tendrán valor después de ejecutarlo en el probador MKL-5, y necesariamente con un forward.

 

Incluso ajustado a la elasticidad, no funcionó en absoluto con los nuevos datos. Sin embargo, se mantuvo bien en el traine.

Se están determinando las razones...

Debido a que puede haber funcionado, pero no en la forma en que le gustaría que funcionara


 
Maxim Dmitrievsky #:

Incluso ajustado por elasticidad, no funcionó en absoluto con los nuevos datos. Aunque se mantuvo bien en el traine.

Se están estableciendo las razones...

Porque puede haber funcionado, pero no de la manera que te gustaría que funcionara


Los gráficos no muestran una clara causa y efecto como la temperatura del aire y --> comprar helado.
 
Forester #:
No hay una causa y un efecto obvios en los gráficos, como la temperatura del aire y --> comprar helado.

El tritment es cómo influyes en el sistema. Ahí es donde se considera el impacto de los cambios de precio (tu impacto) en las ventas.

Yo influí en la dirección de las transacciones entrenando el modelo. Lerner me mostró que esto no hace nada ) pero tampoco arregló nada.
 
¿Cuál es la conclusión? ) Continúa ofreciendo

Doble/Debiased ML# no científico

que es casi una copia completa de mi enfoque, pero sin las importantes, desde mi punto de vista, adiciones

Y funciona mejor.

¡Bingo! Yo también he llegado a la cima del kozul. No podría estar más contento.


Y como expresa deleite con esta foto:

ahora por lo menos sé cómo llamar a mi enfoque :)

Tendré que pagarle por momentos tan agradables.