Русский Português
preview
Pronosticamos barras Renko con ayuda de IA CatBoost

Pronosticamos barras Renko con ayuda de IA CatBoost

MetaTrader 5Asesores Expertos |
68 4
Yevgeniy Koshtenko
Yevgeniy Koshtenko

Introducción

Solo la pantalla del monitor brilla en el silencio de mi despacho. El terminal MetaTrader 5 produce nuevos datos de ticks, y el algoritmo que he desarrollado convierte metódicamente el caos del mercado en un sistema ordenado de barras Renko. Las tres de la mañana es el momento en que nacen las verdaderas estrategias comerciales. Me paso la mano por la barbilla sin afeitar y doy un sorbo a mi café ya frío, mi Carte Noir favorito. El 59,27% de precisión del modelo es una victoria, todo un triunfo para quienes entienden la naturaleza impredecible de los mercados financieros.


Cuándo el análisis tradicionales se volvió inútil

Hace casi 10 años, entré en el mercado con la creencia de que el análisis técnico era la sagrada escritura del tráder. Trazaba líneas de apoyo y resistencia, observaba cruces de medias móviles, buscaba divergencias en RSI y MACD, pero año tras año veía cómo disminuía la eficacia de estos métodos. El mercado estaba cambiando, los algoritmos comerciales de alta frecuencia transformaban su naturaleza y las técnicas clásicas ya no ofrecían las mismas ventajas.

Un día, tras una semana comercial especialmente mala, me hice la siguiente pregunta: ¿y si todos los libros de análisis técnico escritos en el último siglo se hubieran convertido ahora en mera ficción para el entretenimiento? Esta pregunta me llevó a replantearme radicalmente mi forma de negociar y, finalmente, a crear un sistema de predicción de barras Renko basado en el aprendizaje automático.


Barras Renko: el zen digital del tráder

Entonces conocí los gráficos Renko en una conferencia en Singapur. Un tráder japonés, cuyo nombre prometí no revelar nunca, me mostró su terminal con unos inusuales bloques rectangulares en lugar de las habituales velas. "Es Renko", dijo, "gráficos que muestran solo lo que importa: el movimiento de los precios".

En un mundo sobresaturado de información, los gráficos Renko hacen posible una especie de zen digital: librarse del ruido, del factor tiempo, de todo lo que distrae del verdadero movimiento del mercado. Cada nuevo bloque se forma solo cuando el precio sube o baja una determinada distancia. En esa sencillez reside un poder increíble.

Así que empecé a experimentar con gráficos Renko en varios instrumentos. EURUSD, GBPUSD, DAX, S&P 500, en todas partes los gráficos permitían ver la estructura del mercado de forma más clara y limpia. Pero los análisis manuales requieren tiempo, que siempre escasea. Y entonces cuando recurrí al aprendizaje automático.


CatBoost: el algoritmo que conquistó los mercados mundiales

Elegir el algoritmo era tan importante como seleccionar la estrategia comercial. Tras probar docenas de modelos diferentes de aprendizaje automático, me decidí por CatBoost, un algoritmo de gradiente de refuerzo desarrollado por la compañía Yandex. Fue un auténtico hallazgo, desde el inicio del primer modelo.

# Инициализация модели CatBoost
params = {
    'iterations': 300,
    'learning_rate': 0.05,
    'depth': 5,
    'loss_function': 'Logloss',
    'random_seed': 42,
    'verbose': False
}

model = CatBoostClassifier(**params)
model.fit(X_train, y_train, eval_set=(X_test, y_test), early_stopping_rounds=30, verbose=False)

CatBoost no solo funciona bien con las características categóricas, que son fundamentales para analizar patrones de barras Renko. También es resistente al sobreentrenamiento, algo poco habitual en algoritmos de esta potencia, y funciona lo suficientemente rápido como para que el modelo pueda reentrenarse con datos nuevos incluso cada día.

Mi experimento comenzó descargando 60 días de datos del EURUSD, es decir, más de 12.000 barras de cinco minutos. Estos datos se transformaron en 11578 barras Renko con un tamaño de bloque calculado de forma algorítmicamente óptima de 0,00028 unidades de precio. El entrenamiento de características produjo 11572 muestras para el entrenamiento del modelo.

Y entonces llegó el momento de la verdad: ejecutar el entrenamiento del modelo CatBoost con los datos entrenados.


El descubrimiento en cifras: qué nos mostró el experimento

Cuando el algoritmo completó el entrenamiento y vi los resultados, fue como una epifanía. La precisión del modelo en la muestra de prueba era del 59,27%. Esta cifra puede parecer modesta a una persona poco experta en trading, pero para quienes conocen las despiadadas estadísticas de la negociación en los mercados financieros, se trata de un resultado extraordinario.

Merece la pena recordar el famoso estudio de la Universidad de Michigan que demuestra que la mayoría de los fondos gestionados activamente no logran superar a una simple estrategia de "compra y mantén". Y, sin embargo, estos fondos emplean a brillantes analistas con doctorados y acceso a información privilegiada. En este contexto, una precisión del 59,27% parece no solo buena, sino extraordinaria.

Pero más sorprendente aún fue el análisis de la importancia de las características. En contra de todos los cánones del análisis técnico, los indicadores de volumen resultaron mucho más importantes que los patrones de precios. "Last_volume" con una importancia de 18.36, "avg_volume" con 14.23 y "volume_ratio" con 12.81 ocuparon las tres primeras posiciones. Y solo entonces aparecieron los indicadores de los sucesivos movimientos de precios.

Por cierto, me acabo de acordar y añado: he visto un par de veces en una famosa red social a un tráder de éxito diciendo que el Grial consiste en dividir el volumen en bloques Renko y clústeres de volumen. ¿Quizá estos resultados no sean en absoluto una coincidencia y tengan sentido?


El arte de las barras Renko

El trabajo con los gráficos Renko comienza con la determinación del tamaño de bloque óptimo. Es como ajustar un microscopio: un aumento demasiado pequeño impedirá ver los detalles y un aumento demasiado grande distorsionará la imagen global. El tamaño del bloque Renko sería la resolución con la que miramos el mercado.

# Создание Ренко-баров с адаптивным размером блока
def create_renko_bars(df, brick_size=None):
    if brick_size is None:
        # Расчет ATR для определения размера блока
        df['tr'] = np.maximum(
            df['high'] - df['low'],
            np.maximum(
                np.abs(df['high'] - df['close'].shift(1)),
                np.abs(df['low'] - df['close'].shift(1))
            )
        )
        df['atr'] = df['tr'].rolling(window=14).mean()
        brick_size = df['atr'].mean() * 0.5
        print(f"Размер блока Ренко: {brick_size:.5f}")
    
    # Создание Ренко-баров
    renko_bars = []
    current_price = df.iloc[0]['close']
    # ... остальной код

Tras muchos experimentos, he llegado a la conclusión de que la mejor forma de definir el tamaño de los bloques es a través de la métrica ATR (Average True Range). Este enfoque hace que el tamaño del bloque se adapte a la volatilidad actual del instrumento.

En el caso del EURUSD, el algoritmo determinó que el tamaño de bloque óptimo era de 0,00028 unidades de precio, lo que se corresponde con unos 2,8 pips. A primera vista, esto parece insignificante, pero precisamente esta granularidad nos permite captar movimientos significativos y filtrar el ruido del mercado.

La creación de barras Renko no solo supone una transformación mecánica de los datos de precios: es el arte de extraer la señal del ruido, de distinguir el movimiento significativo de un océano de fluctuaciones. Y cuando vi los datos transformados en el gráfico, apareció ante mis ojos una imagen cristalina del mercado: una escalera de bloques rojos y verdes que reflejaba el verdadero movimiento de los precios sin distorsiones causadas por el factor temporal.


Formación de características: lo que realmente importa para la predicción

El éxito de cualquier modelo de aprendizaje automático depende en gran medida de la calidad y relevancia de las características. Para predecir la dirección de la próxima barra Renko, desarrollé un sistema de características de varios niveles que consideran tanto la historia de movimientos como las características del volumen.

# Подготовка признаков для модели
def prepare_features(renko_df, lookback=5):
    features = []
    targets = []
    
    for i in range(lookback, len(renko_df) - 1):
        window = renko_df.iloc[i-lookback:i]
        
        feature_dict = {
            # Направления последних n баров
            **{f'dir_{j}': window['direction'].iloc[-(j+1)] for j in range(lookback)},
            
            # Статистика по движениям
            'up_ratio': (window['direction'] > 0).mean(),
            'max_up_streak': window['consec_up_streak'].max(),
            'max_down_streak': window['consec_down_streak'].max(),
            'last_up_streak': window['consec_up_streak'].iloc[-1],
            'last_down_streak': window['consec_down_streak'].iloc[-1],
            
            # Объем
            'last_volume': window['volume'].iloc[-1],
            'avg_volume': window['volume'].mean(),
            'volume_ratio': window['volume'].iloc[-1] / window['volume'].mean() 
                if window['volume'].mean() > 0 else 1
        }
        
        features.append(feature_dict)
        
        # Направление следующего бара (1 - вверх, 0 - вниз)
        next_direction = 1 if renko_df.iloc[i+1]['direction'] > 0 else 0
        targets.append(next_direction)
    
    return pd.DataFrame(features), np.array(targets)

En primer lugar, incluí las señales obvias: las direcciones de las últimas barras. Después, añadí métricas estadísticas: la relación de barras alcistas y bajistas, la duración de los movimientos consecutivos en una dirección, las series máximas. Por último, incluí métricas de volumen: volumen de la última barra, volumen medio del periodo y relación entre el volumen actual y el volumen medio.

Fueron los indicadores volumétricos los que, para mi propia sorpresa, resultaron más significativos para la previsión. Esto puso patas arriba mi visión del análisis de precios. Durante años, yo, como la mayoría de los tráders, me centré en las formas de las velas, los patrones y las líneas de tendencia. Y la respuesta siempre ha estado en el volumen, una métrica que con frecuencia se ignora en Fórex debido a la naturaleza descentralizada del mercado.

El conjunto final de características incluía 14 parámetros, que resultaron óptimos para equilibrar la complejidad del modelo con su poder de pronóstico. Más señales conducían al sobreentrenamiento, menos señales provocaban una falta de precisión.


La previsión en acción: de la teoría a la práctica

El modelo construido no solo ofrece una predicción binaria de la dirección de la siguiente barra, sino también la probabilidad de dicho movimiento. En el último ejemplo, el modelo predijo un descenso con una probabilidad del 69,35%, que es una predicción bastante segura, pero no lo suficiente como para generar una señal comercial (para la que establecimos un umbral del 75%).

# Прогнозирование следующего бара
def predict_next_bar(model, renko_df, lookback=5, feature_names=None):
    if len(renko_df) < lookback:
        return {"error": "Недостаточно данных"}
    
    window = renko_df.iloc[-lookback:]
    
    feature_dict = {
        **{f'dir_{j}': window['direction'].iloc[-(j+1)] for j in range(lookback)},
        'up_ratio': (window['direction'] > 0).mean(),
        'max_up_streak': window['consec_up_streak'].max(),
        'max_down_streak': window['consec_down_streak'].max(),
        'last_up_streak': window['consec_up_streak'].iloc[-1],
        'last_down_streak': window['consec_down_streak'].iloc[-1],
        'last_volume': window['volume'].iloc[-1],
        'avg_volume': window['volume'].mean(),
        'volume_ratio': window['volume'].iloc[-1] / window['volume'].mean() 
            if window['volume'].mean() > 0 else 1
    }
    
    X_pred = pd.DataFrame([feature_dict])
    
    # Проверяем, что все признаки присутствуют
    if feature_names:
        for feature in feature_names:
            if feature not in X_pred.columns:
                X_pred[feature] = 0
        X_pred = X_pred[feature_names]
    
    prob = model.predict_proba(X_pred)[0]
    prediction = model.predict(X_pred)[0]
    
    return {
        'prediction': 'UP' if prediction == 1 else 'DOWN',
        'probability': prob[prediction],
        'prob_up': prob[1],
        'prob_down': prob[0],
        'signal': 'BUY' if prob[1] > 0.75 else 
                 'SELL' if prob[0] > 0.75 else 
                 'NEUTRAL'
    }

Sin embargo, el verdadero valor no reside en una única previsión, sino en el complejo sistema comercial. Las últimas cinco barras Renko han mostrado una dinámica interesante: tres caídas consecutivas seguidas de dos subidas. Esta microtendencia alcista, combinada con una previsión bajista con una probabilidad alta pero insuficiente para la señalización, nos sugiere una posible consolidación e incertidumbre en el mercado.

Estos momentos son los más peligrosos para el trading, y el sistema identificó correctamente esta condición, no generando una señal comercial, a pesar de la relativamente alta probabilidad de caída.


Mirando bajo el capó: la arquitectura del sistema

El sistema desarrollado supone un mecanismo multicapa en el que cada componente cumple su función en la orquesta de predicción global. Veamos los elementos clave de esta arquitectura.

python# Основная функция
def main():
    # Получение данных EURUSD
    print("Загрузка данных EURUSD из MetaTrader5...")
    df = get_mt5_data(symbol='EURUSD', days=60)
    
    if df is None or len(df) == 0:
        print("Не удалось получить данные")
        return
    
    print(f"Загружено {len(df)} баров")
    
    # Создание Ренко-баров
    print("Создание Ренко-баров...")
    renko_df, brick_size = create_renko_bars(df)
    print(f"Создано {len(renko_df)} Ренко-баров")
    
    # Подготовка признаков
    print("Подготовка признаков...")
    X, y = prepare_features(renko_df)
    print(f"Подготовлено {len(X)} образцов")
    
    # Обучение модели
    print("Обучение модели...")
    model, X_test, y_test = train_model(X, y)
    
    # Прогноз следующего бара
    feature_names = X.columns.tolist()
    prediction = predict_next_bar(model, renko_df, feature_names=feature_names)
    
    print("\nПРОГНОЗ СЛЕДУЮЩЕГО РЕНКО-БАРА:")
    for k, v in prediction.items():
        print(f"{k}: {v}")
    
    # Информация о последних барах
    print("\nПоследние 5 Ренко-баров:")
    print(renko_df.tail(5)[['time', 'open', 'close', 'direction']])

La base del sistema es el módulo de carga de datos de MetaTrader 5. La integración con MetaTrader 5 permite obtener datos de mercado actualizados casi en tiempo real. Este módulo utiliza la API oficial de MetaTrader 5, lo cual garantiza la fiabilidad y estabilidad del funcionamiento. 

En la siguiente capa las barras de tiempo estándar se convierten a Renko. El algoritmo calcula el tamaño de bloque óptimo basándose en el ATR y realiza la transformación considerando el volumen y el tiempo. La peculiaridad de la aplicación reside en el recuento de los movimientos consecutivos y sus características directamente en el proceso de formación de la barra Renko, lo que mejora la eficacia de todo el sistema. 

El núcleo del sistema es el módulo de generación de características y el entrenamiento de modelos. Aquí, cada barra Renko se convierte en un conjunto de características numéricas que luego se introducen en la entrada del algoritmo CatBoost. Los parámetros óptimos del modelo se seleccionan mediante validación cruzada, considerando las especificidades de las series temporales financieras. 

Por último, el módulo de previsión admite el modelo entrenado y los datos reales, genera una previsión y, cuando se alcanza el umbral de confianza especificado, genera una señal comercial. 

Todo el sistema está escrito en Python usando las librerías numpy, pandas, MetaTrader 5 y catboost. Hemos elegido Python no solo por su facilidad de desarrollo, sino también por sus amplias capacidades para el análisis de datos y la visualización de resultados. 


Conclusiones y perspectivas: el futuro del trading algorítmico

Después de desarrollar y probar el sistema de predicción de barras Renko, he llegado a algunas conclusiones importantes que pueden cambiar su forma de ver el trading algorítmico. 

En primer lugar, los métodos clásicos de análisis técnico son inferiores en eficacia a los algoritmos de aprendizaje automático modernos. Quizá una precisión del 59,27% no suene tan impresionante, pero supera sistemáticamente a la mayoría de los indicadores técnicos en plazos largos. 

En segundo lugar, los indicadores de volumen han demostrado ser mucho más importantes que los patrones de precio a la hora de predecir los movimientos del mercado. Esto contradice muchos libros de texto clásicos sobre trading, pero está respaldado por resultados de modelización sobre datos reales. 

En tercer lugar, los gráficos Renko limpian de ruido los datos de precios, lo cual permite a los algoritmos de aprendizaje automático identificar patrones más estables en los movimientos del mercado. 

Pero lo más importante es que esto es solo el principio: veo un gran potencial para seguir desarrollando el sistema. Podemos incluir datos fundamentales, noticias y análisis del sentimiento del mercado a través de las redes sociales. La ampliación a otros instrumentos y marcos temporales es igualmente posible. También podemos crear un conjunto de modelos para mejorar la precisión de las predicciones. 


Conclusión

El mundo del trading algorítmico está en la cúspide de una nueva revolución, y la combinación de gráficos Renko con modernos algoritmos de aprendizaje automático podría convertirse en uno de sus motores. Invito a todos los interesados en este tema a sumergirse en el mundo de los datos, los algoritmos y la predicción. El futuro del trading ya está aquí, y es algorítmico. 

Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/17531

Archivos adjuntos |
RenkoPredict.py (9.13 KB)
Aliaksandr Kazunka
Aliaksandr Kazunka | 15 may 2025 en 19:12
No se puede obtener más del 63%. Se añadan los signos que se añadan. 63 para forex es un fiasco
Yevgeniy Koshtenko
Yevgeniy Koshtenko | 15 may 2025 en 22:22
sportoman #:
No se puede obtener más del 63%. Se añadan los signos que se añadan. 63 para forex es un fiasco

Conseguí más del 75% en Midas (multimodular, donde muchos módulos combinan sus señales en una sola señal). Pero entonces surge otro problema - las señales una vez al mes y medio)))) Cuanto más fiable sea la señal, menos a menudo se produce ... Es por eso que empecé a olvidarme de alta winrate en los robots recientes, trato de predecir la profundidad de los movimientos a tomar el riesgo de beneficio en 1:3, 1:4, etc. He configurado las marcas de tal manera que dan bonificaciones a los modelos a través de DQN para marcar correctamente los movimientos profundos....Esto finalmente resultó en el robot LSTM Europa.

Aliaksandr Kazunka
Aliaksandr Kazunka | 17 may 2025 en 21:10
Yevgeniy Koshtenko #:

Conseguí por encima del 75% en Midas (multi-modular, donde muchos módulos combinan sus señales en una sola señal). Pero entonces surge otro problema - señales una vez al mes y medio)))) Cuanto más fiable es la señal, menos a menudo se produce...Por eso empecé a olvidarme de la alta rentabilidad en los últimos robots, intento predecir la profundidad de los movimientos para asumir el riesgo de obtener beneficios en 1:3, 1:4, etc. He configurado las marcas de tal manera que dan bonificaciones a los modelos a través de DQN para marcar correctamente los movimientos profundos....Esto finalmente resultó en el robot LSTM Europa.

75 en LTSM en lookback = 5 bars_ahead = 1 pero esto es para el comercio binario, no para forex.

Vladimir Perervenko
Vladimir Perervenko | 18 may 2025 en 18:46

¿Y dónde está la IA? ¿O has elevado a catbust a ese rango?

Deberías hacer una prueba o algo. ¿58% está bien? Esta Precisión es sólo un indicador. El indicador principal es el balance en la prueba basado en las señales recibidas.

No es interesante.

Utilizando redes neuronales en MetaTrader Utilizando redes neuronales en MetaTrader
En el artículo se muestra la aplicación de las redes neuronales en los programas de MQL, usando la biblioteca de libre difusión FANN. Usando como ejemplo una estrategia que utiliza el indicador MACD se ha construido un experto que usa el filtrado con red neuronal de las operaciones. Dicho filtrado ha mejorado las características del sistema comercial.
Creación de un sistema personalizado de detección de regímenes de mercado en MQL5 (Parte 2): Asesor experto Creación de un sistema personalizado de detección de regímenes de mercado en MQL5 (Parte 2): Asesor experto
Este artículo detalla la construcción de un Asesor Experto Adaptativo (MarketRegimeEA) utilizando el detector de régimen de la Parte 1. Cambia automáticamente las estrategias comerciales y los parámetros de riesgo para mercados con tendencia, rango o volátiles. Se incluyen optimización práctica, manejo de transiciones y un indicador de múltiples marcos de tiempo.
Particularidades del trabajo con números del tipo double en MQL4 Particularidades del trabajo con números del tipo double en MQL4
En estos apuntes hemos reunido consejos para resolver los errores más frecuentes al trabajar con números del tipo double en los programas en MQL4.
Análisis espectral singular unidimensional Análisis espectral singular unidimensional
El artículo aborda aspectos teóricos y prácticos del método de análisis espectral singular (ARS), un método eficaz de análisis de series temporales que permite representar la compleja estructura de una serie como una descomposición en componentes simples, como la tendencia, las fluctuaciones estacionales (periódicas) y el ruido.