Discusión sobre el artículo "Trading con algoritmos: La IA y su camino hacia las alturas doradas"

 

Artículo publicado Trading con algoritmos: La IA y su camino hacia las alturas doradas:

En este artículo veremos un método para crear estrategias comerciales para el oro utilizando el aprendizaje automático. Considerando el enfoque propuesto para el análisis y la previsión de series temporales desde distintos ángulos, podemos determinar sus ventajas e inconvenientes en comparación con otras formas de crear sistemas comerciales basados únicamente en el análisis y la previsión de series temporales financieras.

La evolución en la comprensión de las capacidades de los métodos de aprendizaje automático en el trading ha llevado a la creación de diferentes algoritmos que son igual de buenos en la misma tarea, pero fundamentalmente diferentes. En este artículo volveremos a analizar un sistema comercial de tendencia unidireccional utilizando el oro como ejemplo, pero empleando un algoritmo de clusterización.

Al examinar este importante enfoque del análisis y la previsión de series temporales desde distintos ángulos, es posible identificar sus ventajas e inconvenientes en comparación con otras formas de creación de sistemas comerciales basados únicamente en el análisis y la previsión de series temporales financieras. En algunos casos, estos algoritmos resultan bastante eficaces y superan a los enfoques clásicos tanto en velocidad de creación como en la calidad de los sistemas comerciales a la salida.

En este artículo, nos centraremos en el trading unidireccional, en el que el algoritmo solo abrirá operaciones de compra o venta. Utilizaremos los algoritmos CatBoost y K-Means como algoritmos de base. CatBoost es un modelo básico que actúa como clasificador binario para clasificar las transacciones. K-Means, por su parte, se usa para identificar los modos de mercado durante la fase de preprocesamiento.


Autor: dmitrievsky

[Eliminado]  

Después de leer el artículo, tuve la idea de jugar con el propio proceso de clustering.

Escribí una variante que realiza la agrupación en una ventana deslizante en lugar de en todo el conjunto de datos. Esto puede mejorar la partición de los clusters, teniendo en cuenta la estructura temporal de BP.

def sliding_window_clustering(dataset, n_clusters: int, window_size=200) -> pd.DataFrame:
    import numpy as np
    
    data = dataset[(dataset.index < hyper_params['forward']) & (dataset.index > hyper_params['backward'])].copy()
    meta_X = data.loc[:, data.columns.str.contains('meta_feature')]
    
    # Primero creamos los centroides de referencia globales
    global_kmeans = KMeans(n_clusters=n_clusters).fit(meta_X)
    global_centroids = global_kmeans.cluster_centers_
    
    clusters = np.zeros(len(data))
    
    # Apply clustering in a sliding window
    for i in range(0, len(data) - window_size + 1, window_size):
        window_data = meta_X.iloc[i:i+window_size]
        
        # Enseñar KMeans en la ventana actual
        local_kmeans = KMeans(n_clusters=n_clusters).fit(window_data)
        local_centroids = local_kmeans.cluster_centers_
        
        # Hacer coincidir los centroides locales con los centroides globales
        # para garantizar la coherencia de las etiquetas de las agrupaciones
        centroid_mapping = {}
        for local_idx in range(n_clusters):
            # Encuentra el centroide global más cercano a este centroide local
            distances = np.linalg.norm(local_centroids[local_idx] - global_centroids, axis=1)
            global_idx = np.argmin(distances)
            centroid_mapping[local_idx] = global_idx + 1  # +1 para empezar a numerar desde 1
        
        # Obtener las etiquetas de la ventana actual
        local_labels = local_kmeans.predict(window_data)
        
        # Convertir las etiquetas locales en etiquetas globales coherentes
        for j in range(window_size):
            if i+j < len(clusters):  # Checking for out of bounds
                clusters[i+j] = centroid_mapping[local_labels[j]]
    
    data['clusters'] = clusters
    return data

Inserte esta función en el código y sustituya clustering por sliding_window_clustering.

Parece que mejora los resultados.

Aún así, a veces es útil escribir artículos.

 

Gracias por el artículo Dmitrievsky. Parece que el EA cargado y su archivo de inclusión no coinciden entre sí. Se refiere el archivo mpq en la carpeta "tendencia siguiente", pero los archivos de ejemplo estaban en "reversión media".
y la función get_features en el "causal una dirección.py" no son los mismos que lo que aparece en el artículo. Además, el archivo mqh generado por "causal one direction.py" al exportar .onnx no es el mismo que el ofrecido en MQL5_files.zip.

Muy agradecido si puedes hacer las aclaraciones necesarias.

Paul


Maxim Dmitrievsky
Maxim Dmitrievsky
  • 2025.04.16
  • www.mql5.com
Профиль трейдера
[Eliminado]  
Sun Paul #:

Gracias por el artículo Dmitrievsky. Parece que el EA cargado y su archivo de inclusión no coinciden entre sí. Se refiere el archivo mpq en la carpeta "tendencia siguiente", pero los archivos de ejemplo estaban en "reversión media".
y la función get_features en el "causal una dirección.py" no son los mismos que lo que aparece en el artículo. Además el fichero mqh generado por "causal one direction.py" al exportar .onnx no es el mismo que el ofrecido en MQL5_files.zip.

Muy agradecido si pueden hacer las aclaraciones necesarias.

Paul

Gracias, lo comprobaré y lo volveré a subir, quizá mezclé algunos archivos.
[Eliminado]  

Actualizados los archivos + añadido un nuevo método de agrupación.

Ahora todas las rutas y funciones coinciden.

Archivos adjuntos:
Python_files.zip  548 kb
MQL5_files.zip  104 kb
 
Creo que deberíamos añadir la enumeración de parámetros RandomisedSearchCV para que el modelo CatBoost seleccione los mejores parámetros. Y la validación cruzada no vendría mal. Todo esto mejora la precisión del modelo.
 
Maxim Dmitrievsky #:

Actualización de los archivos + adición de un nuevo método de agrupación.

Ahora todas las rutas y funciones coinciden.

Subido estos archivos al artículo

[Eliminado]  
sportoman modelo CatBoost seleccione los mejores parámetros. Y la validación cruzada no vendría mal. Todo esto mejora la precisión del modelo.
Se obtiene aleatoriedad multiplicada por aleatoriedad. Será difícil de reproducir, entonces necesitas arreglar las semillas en todas partes.
Por lo general, unos pocos re-entrenamientos en bucle son suficientes para evaluar la estrategia.
 
Así que tienes R2 es un índice modificado, cuya eficiencia se basa en el beneficio en pips. ¿Qué pasa con la reducción y otros indicadores de rendimiento? Si obtenemos un modelo que da más del 90% en el entrenamiento y al menos el 85% en la prueba, entonces su índice dará cifras impresionantes. No importa cuántas veces he ejecutado el probador en MT5, nunca he recibido un beneficio en el historial. El depósito se agota. Esto es a pesar del hecho de que su probador en Python da 0.97-0.98
[Eliminado]  
sportoman #:
Así que tienes R2 es un índice modificado, cuya eficiencia se basa en el beneficio en pips. ¿Qué pasa con la reducción y otros indicadores de rendimiento? Si obtenemos un modelo que da más del 90% en el entrenamiento y al menos el 85% en la prueba, entonces su índice dará cifras impresionantes. No importa cuántas veces he ejecutado el probador en MT5, nunca he recibido un beneficio en el historial. El depósito se agota. Esto es a pesar del hecho de que su probador en Python da 0.97-0.98

No entiendo que tiene que ver esto con CV.

Todas estas estrategias tienen bajo poder de prueba, porque se basan sólo en la historia de las cotizaciones no estacionarias. Pero pueden detectar tendencias.

Cualquier doble comprobación sobre la historia no aumenta las probabilidades si las tendencias cambian. Es decir, no se puede demostrar algo sobre el futuro basándose en la historia, sólo se puede estimar lo bien que generaliza el modelo con los datos disponibles. Para eso existe un periodo de prueba.

Si ya se ha inventado alguna nueva forma eficaz de probar modelos sobre series no estacionarias, por favor, hágamelo saber :).
[Eliminado]  
También hay un artículo sobre estrategias de reversión a la media. En él se parte del supuesto más sólido de que una serie temporal vuelve a la media casi siempre. A diferencia de las tendencias, que cambian.