Redes Neuronales en Metatrader II

Seguramente recuerden un artículo que publiqué hace unos años sobre la librería FANN para Metatrader que permitía entrenar redes neuronales para filtrar señales de Expert Advisors y para reconocer patrones de precios. Pues bien, hace poco me he topado con un interesante indicador que genera predicciones en tiempo real a la derecha del gráfico usando redes neuronales.

Seguramente recuerden un artículo que publiqué hace unos años sobre la librería FANN para Metatrader que permitía entrenar redes neuronales para filtrar señales de Expert Advisors y para reconocer patrones de precios. Sin embargo en mis últimas búsquedas por la Red me he topado con un interesante indicador que genera predicciones en tiempo real a la derecha del gráfico usando redes neuronales.


Me suena a chino eso de las redes neuronales

No hay que preocuparse: aunque su nombre pueda indicar que se trata de algo exótico o complicado, en realidad no es para tanto. Se trata simplemente de un modelo que genera datos de salida (outputs) a partir de una serie de datos de entrada (inputs) mediante una serie de parámetros. Para llegar a los outputs, los datos de entrada pasan por diferentes capas, esto es, funciones que interconectan los datos entre sí ponderados por diferentes pesos.

Posiblemente un ejemplo gráfico les aclare un poco cómo funciona en la práctica:

 

 

Como pueden ver, el término “red neuronal” se entiende rápidamente al ver este esquema ya que recuerda claramente a las interconexiones entre las neuronas del cerebro. Los datos entran por la capa de entrada, son procesados por dos capas ocultas (que, además, en el ejemplo, están a su vez sesgadas por una serie de inputs adicionales) y generan un valor final en la capa de salida mediante la multiplicación de los valores por diferentes ponderadores, obteniéndose una suma que, en ocasiones, es procesada por una función de activación para generar comportamientos no lineales más complejos.

En definitiva, si queremos describir una red neuronal necesitamos determinar:

  • Número de inputs
  • Número de outputs
  • Número de capas ocultas
  • Neuronas por capa oculta
  • Valores de los pesos que enlazan cada neurona

Estos últimos valores, los pesos o ponderaciones, se obtienen mediante el entrenamiento supervisado de la red neuronal, procedimiento mediante el que se introducen diferentes conjuntos de inputs pasados y se optimizan los pesos para obtener el menor error posible entre los outputs generados por la red y los valores reales.

 

Muy interesante, ¡quiero probarlo!
Entonces lo mejor es descargarse el indicador BPNN para Metatrader 4 y empezar a jugar con él. Podéis bajarlo haciendo click aquí. Una vez descomprimido el zip, tendréis los siguientes archivos:

  • BPNN.dll que debéis copiar en la carpeta Libraries de vuestra Metatrader.
  • BPNN Predictor.mq4, BPNN Predictor with Smoothing.mq4 y BPNN_Predictor_with_RSI.mq4, que debemos poner en la carpeta Indicators de Metatrader.

El más importante de todos es BPNN Predictor.mq4 pues con él vamos a poder hacer pruebas para predecir precios futuros a corto plazo. El input utilizado en el indicador es el ratio de precios de apertura. En particular la fórmula aplicada es:

x[i]=Open[test_bar]/Open[test_bar+delay[i]]-1.0

donde delay[i] es un número de Fibonacci (1,2,3,5,8,13, 21…). El output es el valor relativo de cambio del siguiente precio, deshaciendo la transformación para generar el precio futuro.

Los parámetros que podemos modificar en el indicador son los siguientes:

  • lastBar: última barra utilizada de datos pasados
  • futBars: número de barras futuras a predecir
  • numLayers: número de capas incluyendo input, ocultas y output
  • numInputs: número de inputs
  • numNeurons1… numNeurons5 : número de neuronas en la cada capa oculta o de salida
  • ntr: número de conjuntos para entrenamiento
  • nep: máximo número de epochs (iteraciones)
  • maxMSEpwr: máximo error cuadrático medio admitido en el entrenamiento. Cuando el error cuadrático medio es menor a este valor, el entrenamiento finaliza.
  • AFT: tipo de función de activación (0:sigmoidea (1/(1+exp(-x))), 1:tangente hiperbólica ((1-exp(-2x))/(1+exp(-2x))), 2:función racional (x/(1+|x|))

Gráficamente las funciones de activación tienen este aspecto:

 

Si hemos hecho todo correctamente, al insertar el indicador BPNN Predictor.mq4 debemos obtener algo como esto. No olvidéis marcar Allow DLL Imports antes de insertar el indicador:

 

El indicador dibuja tres líneas en el gráfico:

  • Línea roja (a la derecha del precio): predicción de precios de apertura futuros.
  • Línea negra: precios de apertura pasados utilizados en el entrenamiento utilizados como outputs esperados para la red neuronal.
  • Línea azul: salida obtenida por la red neuronal utilizando los inputs en el entrenamiento.

Si utilizamos el indicador BPNN Predictor with Smoothing.mq4 obtendremos una versión suavizada de las previsiones usando una media exponencial:

 

 

Y ya puestos, podemos pronosticar el comportamiento de un oscilador en lugar del precio en sí con el indicador BPNN Predictor with RSI.mq4:

 

 

 

Como pueden ver, colores para todos los gustos ;).

Lo he estado probando y no es para tanto…
Bueno, nadie dijo que esto fuera fácil. De entrada hay que entrenar adecuadamente la red y encontrar los mejores parámetros de ajuste, actualizándolos regularmente a medida que cambia el comportamiento del precio. De cara a realizar el proceso os propongo algunas ideas:

  • Generalmente una red neuronal de tres capas (una de entrada, una oculta y una de salida) es suficiente en la mayoría de los casos. Según el teorema de aproximación universal de Cybenko, una red neuronal de propagación hacia delante con una capa oculta conteniendo un número finito de neuronas puede aproximar funciones continuas en subconjuntos compactos de Rn, esto es, que con una red neuronal sencilla podemos representar una amplia variedad de funciones interesantes con los parámetros apropiados.
  • El número óptimo de neuronas en la capa oculta puede obtenerse mediante ensayo y error. Entre las reglas propuestas en la literatura tenemos las siguientes:

(Nº Inputs + Nº Outputs)/2
Raíz Cuadrada de (Nº Inputs x Nº Outputs)   

  • El número de conjuntos para el entrenamiento debe ser al menos de 2 a 5 veces el número total de pesos en la red. Así, si por ejemplo tenemos una red neuronal con 3 inputs, 2 neuronas en la capa oculta y 1 output tendremos (3+1)*2+(2+1) = 9 pesos, por lo que necesitaremos al menos de 18 conjuntos de entrenamiento para obtener resultados mínimamente fiables.
  • Los datos utilizados como input de la red deben ser estacionarios, requisito que no cumplen ni de lejos las series de precios de los mercados financieros, debiendo realizar transformaciones como la propuesta por el autor del indicador (ratio de dos precios de apertura) para después deshacer la transformación y realizar la predicción.

En resumidas cuentas, con este indicador se abre todo un mundo de experimentación más allá del trading tradicional con osciladores, medias y patrones chartistas al que nos tienen acostumbrados los gurús de turno ;).

Saludos,
X-Trader

COMPARTIR EN: