Русский Português
preview
Visión por computadora para el trading (Parte 2): Complicamos la arquitectura para el análisis 2D de imágenes RGB

Visión por computadora para el trading (Parte 2): Complicamos la arquitectura para el análisis 2D de imágenes RGB

MetaTrader 5Sistemas comerciales |
50 0
Yevgeniy Koshtenko
Yevgeniy Koshtenko

Introducción: cuando los números cobran vida

En la primera parte de nuestro estudio, mostramos cómo las redes neuronales convolucionales pueden analizar series temporales de cotizaciones de divisas a través de filtros unidimensionales. Ahora estamos dando un salto cuántico: hoy vamos a enseñar a los algoritmos a percibir el mercado como un paisaje holístico lleno de texturas, patrones y señales ocultas.

La transformación de series numéricas secas en imágenes permite al algoritmo analizar el mercado desde una perspectiva completamente nueva. Así es exactamente como piensan los tráders expertos, que no solo ven tablas de datos, sino una imagen viva del mercado donde cada detalle implica una señal significativa. Nuestro algoritmo va más allá de la representación unidimensional, revelando estructuras y patrones que permanecen invisibles en las series numéricas.


La alquimia de los datos: de números a sinfonías visuales

Así, nuestro lienzo digital de 128x128 píxeles se convierte en el lienzo sobre el que se desarrolla el drama del mercado. Las líneas de cotizaciones de acciones se transforman en mapas visuales multicanal. 

El canal rojo late con los datos de precio: el Santo Grial que persiguen los tráders. El verde cobra vida gracias a los indicadores técnicos: medias móviles, MACD, bandas de Bollinger: herramientas perfeccionadas durante décadas. El canal azul es la pista de los osciladores: RSI, estocástico, indicadores de volatilidad, que, como un pulso, muestran el estado de ánimo del mercado.

El código que crea esta magia resulta engañosamente simple, pero detrás de él se esconde un poder que podría revolucionar nuestra comprensión de los mercados:

# Фрагмент кода, превращающий данные в RGB-изображение
for t in range(window_size):
    x = int(t / window_size * img_size[1])
    y = int((1 - img_data[j, t]) * img_size[0])
    if 0 <= y < img_size[0] and 0 <= x < img_size[1]:
        img[y, x, 0] = 1.0  # Красный канал для ценовых данных

Cuando los datos se convierten en una imagen, surgen formas sorprendentes, como las estrellas en el cielo nocturno. Es como ver una cara en una fotografía en lugar de describirla con fórmulas. Los patrones que los tráders pasan años aprendiendo a reconocer (“cabeza y hombros”, “doble fondo”, “bandera”) cobran vida ante el algoritmo y se vuelven tan obvios como el amanecer. 

Para hacer estas imágenes aún más ricas, hemos añadido patrones de velas. Las velas alcistas brillan en verde, como señal de esperanza de crecimiento, mientras que las velas bajistas brillan en rojo, como una advertencia de peligro. Las mechas están dibujadas en medios tonos, como sombras, haciendo alusión a la lucha entre compradores y vendedores. Esto permite que el modelo no solo capte tendencias generales, sino también detecte detalles sutiles como “martillo”, “envolvente” y “doji”.

Así es como se implementa en el código:

if close_y < open_y:  # Бычья свеча
    for y in range(close_y, open_y):
        if 0 <= y < img_size[0] and 0 <= x < img_size[1]:
            img[y, x, 1] = 1.0  # Зелёный
else:  # Медвежья свеча
    for y in range(open_y, close_y):
        if 0 <= y < img_size[0] and 0 <= x < img_size[1]:
            img[y, x, 0] = 1.0  # Красный

Estas imágenes no solo son visualizaciones. Son como mapas de calor, donde la intensidad del color refleja la energía del mercado, y cada vela supone una pequeña historia sobre la batalla entre toros y osos. Este es un nuevo lenguaje en el que el algoritmo habla al mercado y suena a poesía.


La arquitectura neuronal: un tráder artificial con triple visión

Crear un tráder artificial es como construir un rascacielos donde cada piso realiza su propia tarea y juntos crean algo grandioso. Nuestra arquitectura consta de tres caminos paralelos, cada uno de los cuales mira el mercado desde su propio ángulo. El primer camino, con filtros de convolución cortos, captura destellos instantáneos: rupturas de nivel, inversiones, saltos bruscos. El segundo, con filtros largos, analiza las grandes tendencias que, como los ríos, dan forma a los ciclos del mercado. La tercera vía monitorea la volatilidad y la energía, analizando los osciladores para comprender si el mercado está tranquilo o ya listo para explotar.

El código que muestra esta idea se ve así:

local_path = Conv1D(64, 3, padding='same', activation='relu')(inputs[:,:,:,0])
trend_path = Conv1D(64, 7, padding='same', activation='relu')(inputs[:,:,:,1])
vol_path = Conv1D(64, 5, padding='same', activation='relu')(inputs[:,:,:,2])

Estos caminos se fusionan en un todo único, pero antes de hacerlo pasan por el mecanismo de atención, una tecnología que enseña al modelo a centrarse en lo esencial, como un tráder que, en medio del ruido de las noticias y los gráficos, solo ve la señal clave. Marcus du Sautoy, autor de “El código de la creatividad”, lo compara con la meditación: “El modelo aprende a descartar el ruido y ver la esencia”. Una línea de código hace que esto sea una realidad:

attention_layer = Attention()([merged, merged])

Pero eso no es todo. Añadimos una capa LSTM bidireccional que mira los datos de un lado a otro, como un historiador que pasa las páginas del pasado y del futuro. Esto ayuda a capturar patrones complejos: consolidaciones prolongadas, reversiones ocultas, momentos en que el mercado se congela antes de un impulso. Y después, la unificación global de características, como un director de orquesta, reúne todas las notas en una única sinfonía, creando una visión holística del mercado.

El toque final es el aprendizaje multitarea. El modelo no solo decide si el precio subirá o bajará, sino que pronostica hasta dónde se moverá el mercado. Peter Lynch, el legendario inversor, dijo una vez: “Saber que una acción va a subir es una cosa: predecir que crecerá exactamente un 8% es otra cosa muy distinta”. Nuestro modelo hace exactamente eso, como un jugador de ajedrez que no solo ve el movimiento, sino la partida completa.


A través del ojo de la cerradura: cómo un algoritmo revela sus pensamientos

El código que lo hace posible es sencillo, pero detrás se esconde una auténtica revolución:

attention = np.mean(np.abs(attention_maps[i]), axis=-1)
heatmap = cv2.applyColorMap(np.uint8(255 * attention_resized), cv2.COLORMAP_JET)

Esta visualización es el comienzo de una nueva ciencia: la interpretación neuronal de los mercados. Por primera vez, no solo obtenemos un pronóstico de una caja negra, sino que entendemos por qué se ha hecho. 

Otro descubrimiento es la especialización de las neuronas. Analizando la activación de las capas internas, vimos que algunas neuronas se “iluminan” solo durante los giros bruscos, otras durante las tendencias suaves y otras durante la calma antes de la tormenta. Es como en el cerebro humano, donde distintas áreas son responsables de la visión o la audición.

El modelo creaba su propio mapa del mercado, clasificando las situaciones de una forma que ningún analista lo había hecho jamás. Por ejemplo, descubrimos divergencias inusuales entre el RSI y el precio que los tráders experimentados luego confirmaron como significativas. Esto no es simplemente un algoritmo: es una nueva forma de ver el mercado.


Transparencia de las decisiones: cuando una máquina se explica por sí sola

Nuestro sistema no solo produce predicciones: también explica cómo ha llegado a ellas. Podemos dibujar un gráfico donde las áreas de atención del modelo estén resaltadas en rojo, mostrando lo que está mirando. Sería como mirar dentro de la mente de un tráder mientras recorre puntos clave en un gráfico. El código para esta visualización se ve así:

def plot_prediction_with_attention(data, prediction, attention_weights):
    plt.plot(data.index, data['close'], label='Цена закрытия', color='black', linewidth=2)
    for i in range(len(data.index) - 1):
        plt.axvspan(data.index[i], data.index[i+1], 
                   alpha=attention_weights[i] * 0.3, color='red')

Este tipo de imágenes convierten un modelo misterioso en un compañero. El tráder no solo ve que el mercado subirá, sino también el motivo de ello: qué indicadores, qué velas y qué momentos han convencido al algoritmo. El modelo se desliza a través de los datos, produciendo predicciones cuadro por cuadro, como un director filmando una película del mercado. No se trata simplemente de números: es una historia contada en movimiento.

imageio.mimsave(gif_path, frames, duration=0.5)


Historia del éxito: cómo un modelo cambia las reglas del juego

Para entender cómo funciona el modelo en la práctica, vamos a imaginar a una tráder llamada Anna que trabaja para un pequeño fondo de trading por cuenta propia en Chicago. Anna confió en su experiencia e intuición durante años, pero el mercado se volvió cada vez más complejo y la competencia cada vez más dura. Una vez que comenzó a usar este modelo, su enfoque cambió. En lugar de pasar horas analizando gráficos, ahora mira los mapas de calor de atención que dibuja el modelo sobre el EURUSD. Estos mapas muestran dónde el mercado está a punto de revertirse, dónde la tendencia va ganando fuerza y dónde se debe esperar una pausa. Pero el modelo también puede aliviar por completo el estrés de la joven evolucionando hasta convertirse en un robot comercial. 


Sutilezas técnicas: cómo un modelo aprende a ver

Uno de los pasos clave ha sido utilizar RobustScaler para normalizar los datos. Los mercados son caóticos y los shocks, como las noticias repentinas, pueden distorsionar la imagen. RobustScaler ayuda a que el modelo siga siendo fiable al ignorar estas anomalías. Así es como funciona:

scaler = RobustScaler()
if window_data[indicator].std() != 0:
    img_data[j] = scaler.fit_transform(window_data[indicator].values.reshape(-1, 1)).flatten()

Otro truco es desenfocar las imágenes usando un filtro gaussiano. Esto suaviza el ruido y ayuda al modelo a centrarse en patrones generales en lugar de en picos aleatorios. Es como ponerse unas gafas para poder ver el bosque a través de los árboles:

img = gaussian_filter1d(img, sigma=0.5, axis=0)
img = gaussian_filter1d(img, sigma=0.5, axis=1)

El entrenamiento del modelo representa una saga aparte. Hemos usado callbacks para evitar el sobreajuste, hemos guardado las mejores versiones y adaptado la tasa de aprendizaje. EarlyStopping detiene el proceso si el modelo comienza a "atascarse" y a aprender los datos de memoria, mientras que ReduceLROnPlateau reduce el paso cuando el progreso se ralentiza. Es como enseñar a un niño a montar en bicicleta: le ofreces apoyo hasta que aprende a montar por sí solo.

callbacks = [
    EarlyStopping(monitor='val_direction_accuracy', patience=15, restore_best_weights=True, verbose=1, mode='max'),
    ModelCheckpoint(filepath=os.path.join(checkpoint_dir, 'best_model.keras'), monitor='val_direction_accuracy', save_best_only=True, verbose=1),
    ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=7, min_lr=0.00001, verbose=1)
]

Los resultados del programa de entrenamiento son alentadores: la precisión en el conjunto de prueba no disminuye tanto, manteniéndose constantemente por encima del 53%, y esto ocurre durante un pequeño número de épocas de entrenamiento:

Nuestra arquitectura mejorada ya demuestra resultados prometedores, pero esto es solo el comienzo. 

Integración de datos fundamentales

El modelo actual trabaja exclusivamente con datos técnicos. El siguiente paso lógico consiste en integrar factores fundamentales: indicadores económicos, noticias y sentimiento del mercado. Esto se puede conseguir a través del aprendizaje multimodal, donde el contexto de las noticias se transforma en representaciones vectoriales y se combina con datos técnicos.

Jerarquía temporal y estructura fractal de los mercados

Los mercados tienen una naturaleza fractal: los patrones aparecen en diferentes periodos de tiempo con sorprendente autosimilitud. Una arquitectura basada en el procesamiento jerárquico de distintos marcos temporales (desde gráficos de minutos hasta gráficos mensuales) puede revelar patrones complejos de múltiples niveles.

Aprendizaje adaptativo y metaaprendizaje

Los mercados están en constante evolución, lo cual requiere una adaptación continua de los modelos. Una dirección prometedora sería el desarrollo de un sistema de metaaprendizaje que ajuste automáticamente la arquitectura y los parámetros de un modelo dependiendo de las condiciones cambiantes del mercado.

Estos detalles no son solo código, sino también la base sobre la cual el modelo aprende a ver el mercado más profundamente que cualquier tráder.


Mirando hacia el futuro: nuevos horizontes

Nuestro modelo es solo el comienzo, el primer trazo de un lienzo mayor. Imaginemos que hemos añadido noticias y datos económicos. Los transformadores convertirán los titulares de Bloomberg y los informes de la Fed en vectores, que el modelo combinará con gráficos e indicadores. Una subida de los tipos de interés o un tuit repentino de Elon Musk se convertirán en parte de la imagen que ve el algoritmo. Es como darle a un tráder no solo un gráfico, sino todo el contexto del mundo.

Los mercados son fractales donde los patrones se repiten en diferentes escalas de tiempo, desde minutos hasta meses. Si entrenamos el modelo para que observe todos los marcos temporales simultáneamente, podrá encontrar tendencias anidadas que eluden incluso a los mejores analistas. Imagine un modelo que ve un patrón de cabeza y hombros en el gráfico diario y, dentro de él, un micropatrón en el gráfico de cinco minutos. Sería como ver una galaxia y sus estrellas de un vistazo.

¿Qué pasaría si el modelo se mejorase a sí mismo? El metaaprendizaje nos permitirá adaptarnos a las condiciones cambiantes del mercado, desde la calma hasta la tormenta. Si el mercado se vuelve volátil, ajustará sus parámetros por sí mismo, como un capitán que dirige el timón en medio de una tormenta. Esto no es una fantasía: es el siguiente paso que ya vislumbramos en el horizonte.

La transparencia es otro objetivo. Queremos que los tráders no solo confíen en el modelo, sino que aprendan de él. Visualizaciones más profundas de la atención y la activación revelarán cómo piensa el algoritmo y quizás nos enseñen a ver el mercado de forma distinta. Imaginemos que el modelo identifica un patrón que nadie había notado antes y los tráders comienzan a llamarlo “cruz neuronal” en su honor. No será solo una herramienta, sino una nueva forma de pensar.

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

Archivos adjuntos |
CV_2_D.py (41.61 KB)
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.
Algoritmo de camello — Camel Algorithm (CA) Algoritmo de camello — Camel Algorithm (CA)
El algoritmo del camello, desarrollado en 2016, modela el comportamiento de los camellos en el desierto para resolver problemas de optimización, considerando factores como la temperatura, las reservas y la resistencia. Este artículo presenta una versión modificada del mismo (CAm) con mejoras clave: el uso de una distribución gaussiana en la generación de soluciones y la optimización de los parámetros del efecto oasis.
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.
Creación de clases de negociación similares a MQL5 en Python para MetaTrader 5 Creación de clases de negociación similares a MQL5 en Python para MetaTrader 5
El paquete Python de MetaTrader 5 ofrece una forma sencilla de crear aplicaciones de trading para la plataforma MetaTrader 5 en lenguaje Python. Aunque se trata de una herramienta potente y útil, este módulo no es tan fácil de usar como el lenguaje de programación MQL5 a la hora de crear una solución de trading algorítmico. En este artículo, vamos a crear clases de trading similares a las que se ofrecen en MQL5 para crear una sintaxis similar y facilitar la creación de robots de trading en Python como en MQL5.