Discusión sobre el artículo "Gradient boosting (CatBoost) en las tareas de construcción de sistemas comerciales. Un enfoque ingenuo"

 

Artículo publicado Gradient boosting (CatBoost) en las tareas de construcción de sistemas comerciales. Un enfoque ingenuo:

Entrenamiento del clasificador CatBoost en el lenguaje Python, exportación al formato mql5; análisis de los parámetros del modelo y simulador de estrategias personalizado. Para preparar los datos y entrenar el modelo, se usan el lenguaje de programación Python y la biblioteca MetaTrader5.

Tras compilar el bot, podemos ponerlo a prueba en el simulador estándar de MetaTrader 5. No debemos olvidarnos de seleccionar el periodo temporal correcto (tiene que ser igual que en el entrenamiento del modelo), así como las entradas  look_back y MA_period, que también son similares a los parámetros del programa Python. Luego, comprobamos el modelo durante el periodo de entrenamiento (muestra de entrenamiento + muestra de validación):

Rendimiento del modelo (muestra de entrenamiento + muestra de validación)

Si comparamos el resultado con el resultado del simulador personalizado, son iguales, salvo algunas desviaciones en los diferenciales. Ahora, vamos a probar el modelo con datos completamente nuevos, desde principios de año:

Rendimiento del modelo con los nuevos datos.

El modelo se ha comportado significativamente peor con los nuevos datos. Este resultado tan negativo está relacionado con razones objetivas que intentaremos exponer más tarde.

Autor: Maxim Dmitrievsky

 

No hay necesidad de mezclar aquí

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

Según la ayuda de https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

shuffle bool, por defecto=True

Si barajar o no los datos antes de dividir. Si shuffle=False entonces stratify debe ser None.

Los datos se barajan antes de la división, es decir, algunos ejemplos de la prueba se incluirán en el tren.

En general, me gustó el artículo, muestra que es bastante fácil de implementar y utilizar la IA en el comercio.

sklearn.model_selection.train_test_split — scikit-learn 0.23.2 documentation
  • scikit-learn.org
*arrays , **options ¶ Quick utility that wraps input validation and and application to input data into a single call for splitting (and optionally subsampling) data in a oneliner. Parameters *arrays Allowed inputs are lists, numpy arrays, scipy-sparse matrices or pandas dataframes. test_size If float, should be between 0.0 and 1.0 and represent...
 
¿Puedes hacer el último gráfico del artículo pero sin mezclar?
Supongo que la validación empeoraría y la prueba con datos desconocidos podría mejorar.
 
elibrarius:

No hay necesidad de revolver aquí

Según la ayuda https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

Los datos se mezclan antes de la división, es decir, algunos ejemplos de la prueba se incluirán en el tren.

En general, me gustó el artículo, muestra que es bastante fácil de implementar y utilizar la IA en el comercio.

Yo lo hago a propósito para igualar un poco las muestras. Sin mezclar la prueba sale peor, pero casi no tiene efecto en los nuevos datos. Mostraré ejemplos más adelante.

 

Eso es lo que no entiendo:

if dataset['close'][i] >= (dataset['close'][i + rand]):
            labels.append(1.0)
        elif dataset['close'][i] <= (dataset['close'][i + rand]):
            labels.append(0.0)              
        else:
            labels.append(0.0)

Las condiciones que nunca funcionarán están marcadas en rojo.

 
Stanislav Korotky:

Eso es lo que no entiendo:

Las condiciones que nunca funcionarán están marcadas en rojo.

Aquí no pasa nada, he cambiado las condiciones y sigo teniendo artefactos.

 
Maxim mil gracias por compartir este tipo de artículos...
Sobre todo por la importación del modelo python en mql5.
Porque no soy un experto en ALGLIB pero creo firmemente que XGBoost CATBoost y Pytorch son de lejos superiores para hacer machine y deep learning.
 
Un trabajo muy interesante. Gracias al autor.
 
Hay una pregunta relacionada con el artículo no directamente, pero indirectamente, a través de la dependencia de CatBoost.

¿Puede alguien explicar con los dedos cómo dentro de CatBoost (o más generalizado - en el árbol de decisión boosting gradiente basado en histograma) se realiza la separación por característica (variable de entrada) sobre la base del histograma? Está claro que para cada bin (barra del histograma) se calcula la estadística: el número total de aciertos de vectores con un valor en el rango del bin y su desglose por pertenencia a clases de salida (en este caso, dos). Y teniendo un histograma con estas estadísticas, ¿cómo elegir una división para crear el siguiente nivel de árbol?

 
Stanislav Korotky:
Había una pregunta relacionada con el artículo, no directamente, sino indirectamente a través de la dependencia de CatBoost.

¿Puede alguien explicar con los dedos cómo dentro de CatBoost (o más generalizado - en el árbol de decisión boosting gradiente basado en histograma) se realiza la separación por característica (variable de entrada) sobre la base del histograma? Está claro que para cada bin (barra del histograma) se calcula la estadística: el número total de aciertos de vectores con un valor en el rango del bin y su desglose por pertenencia a clases de salida (en este caso, dos). Y teniendo un histograma con estas estadísticas, ¿cómo elegir una división para crear el árbol del siguiente nivel?

Los árboles se construyen independientemente unos de otros, y luego se hace el recuento en las hojas (enumeración por predictores no cuantificados) de forma que se reduzca el error de gradiente.

Al seleccionar los predictores para la construcción del árbol y las divisiones del árbol, se utilizan coeficientes aleatorios, lo que permite, en teoría, aumentar la exhaustividad (Recall) y evitar el sobreentrenamiento.

 
Stanislav Korotky:
Había una pregunta relacionada con el artículo, no directamente, sino indirectamente a través de la dependencia de CatBoost.

¿Puede alguien explicar con los dedos cómo dentro de CatBoost (o más generalizado - en el árbol de decisión boosting gradiente basado en histograma) se realiza la separación por característica (variable de entrada) sobre la base del histograma? Está claro que para cada bin (barra del histograma) se calcula la estadística: el número total de aciertos de vectores con un valor en el rango del bin y su desglose por pertenencia a clases de salida (en este caso, dos). Y teniendo un histograma con estas estadísticas, ¿cómo elegir una división para crear el árbol del siguiente nivel?

Es mejor preguntar a los desarrolladores