Como primer acercamiento al uso de redes neuronales, decidimos entrenar una red para tratar de predecir una serie de precios. Tomamos como ejemplo la serie del EURUSD.
En primer lugar, utilizamos la autocorrelación y autocorrelación parcial para determinar si tiene sentido tratar de predecir una serie con información pasada de la misma.
Durante los 20 primeros retrasos, tan sólo las series de high, low y punto medio tienen retrasos con una correlación suficientemente interesante como para que sean tenidos en cuenta. Decidimos utilizar la serie del punto medio, utilizando 5 retrasos.
Caso 1: un solo input
Definimos una red neuronal que sigue el siguiente esquema:
Tenemos:
- 1 input, y(t), que es la propia serie del punto medio.
y(t) = f(y(t –1), …, y(t – d)), donde d es el número de retrasos
- 1:5 – número de retrasos
- w – pesos sinápticos
- b – constante
- 10 capas ocultas
- 1 capa de salida
- 1 output, y(t)
La muestra pasada se divide en tres conjuntos de forma aleatoria: el 70% de entrenamiento, el 15% de validación y el 15% restante de testeo fuera de muestra.
El entrenamiento de la red viene caracterizado por:
Se trata de un entrenamiento supervisado, esto es, se le proporciona a la red el valor de la salida. Partiendo de un conjunto de pesos aleatorios, se inicia un proceso iterativo en el cual se intenta minimizar el error de la estimación. En este caso se ha utilizado el algoritmo Levenberg-Marquardt. El entrenamiento de la red continúa hasta que el error de validación deja de decrecer durante 6 iteraciones.
Para analizar los resultados, recurrimos a distintos estadísticos:
- Error de autocorrelación
Describe cómo se relacionan en el tiempo los errores de predicción. Lo ideal sería que los errores fueran cero (salvo en lag=0, que representa el error cuadrático medio). En nuestro caso la mayoría de los errores están dentro de los límites de confianza del 95%, por lo que el modelo parece adecuado.
- Error cuadrático medio en cada iteración
Los errores de las tres series decrecen hasta la iteración 11. Los errores de validación y testeo son similares. Estos últimos son algo superiores pero decrecen/crecen en momentos similares del tiempo.
- Gráficos de regresión
El resultado no es muy alentador. El ajuste es muy pobre, con un valor de R por debajo de 0.4, incluso en el entrenamiento.
Caso 2: Incluimos más información
Probamos a incluir más información a la red. Mantenemos todos los parámetros igual pero incluimos como inputs el resto de series de precios (open, high, low, close).
En este caso tenemos 5 series como inputs.
y(t) = f(y(t – 1), …, y(t – d), x(t – 1), …, (t – d)), donde d es el número de retrasos
Si estudiamos de nuevo los estadísticos:
Los errores de autocorrelación no son nulos, pero sí algo más reducidos.
Los errores de testeo a lo largo de las iteraciones son inferiores, y similares a los del entrenamiento. Sin embargo a partir de la iteración 14 se incrementan, mientras que en el entrenamiento y en la validación o se reducen o se mantienen constantes. Esto nos puede indicar la existencia de sobreajuste.
Conseguimos mejorar el ajuste de las estimaciones. En este caso, el valor de R se sitúa cerca de 0.7.
Precios estimados vs reales
Calculamos el precio estimado para saber cuánto se acercan estas estimaciones a la realidad. La siguiente tabla muestra el porcentaje de veces que el valor estimado se encuentra dentro / por encima / por debajo de la barra diaria de precios. El caso 1 es el calculado con un solo input, el caso 2 el que incluye más información.
Dentro | Por debajo | Por encima | |
Caso 1 | 71.48% | 14.01% | 14.51% |
Caso2 | 92.31% | 3.15% | 4.54% |
La mayoría de las veces el precio está dentro de la barra, hasta un 90% en el caso 2. Cuando está fuera, existe la misma probabilidad de que se sitúe por encima o por debajo de la barra. Viendo estos porcentajes, el caso 1 no parece tan malo.
Si dividimos la barra diaria en tres partes ((0-0.35), [0.35-0.65], (0.65-1)), en el caso 1 existe la misma probabilidad de que se sitúe en cualquiera de los tres tramos. En el caso 2 incluso es ligeramente menor en la zona central (28% vs 36% en las otras dos zonas). Por tanto, la aproximación no parece tan acertada como cabría esperar.
En mi opinión, el uso de redes neuronales tiene un gran potencial pero es muy complejo dar con la combinación adecuada. Las posibilidades son infinitas y no existen reglas que permitan saber qué es lo más conveniente en cada caso. La mejor configuración se va obteniendo por prueba y error, quedándonos con aquellas características que parecen ajustarse mejor a nuestro objetivo. Pero como en todos los procesos que utilizan información observada del pasado, es difícil saber dónde está límite entre un buen ajuste y un sobreajuste. Además, a medida que aumentamos la complejidad, se incrementa considerablemente el tiempo de computación y potencia necesaria para llevar a cabo el entrenamiento.
Por último, sólo comentar que existen numerosos recursos que pueden ser utilizados para crear una red neuronal, como el “Neural Network Toolbox” que ofrece Matlab y que ha sido utilizado en este ejemplo. Cuando se aborda el tema por primera vez cuesta saber qué funciones/procesos son los más adecuados, puesto que ofrece numerosas posibilidades. Pero es un toolbox realmente interesante y completo.
related posts
Gracias libesa, desde luego eso sería ideal pero desgraciadamente la red no proporciona información tan exacta. La cantidad de datos que incluimos como entrada en una red siempre hay que definirla analizando la propia serie de datos para saber qué cantidad de información es relevante. Lo mismo ocurre con el número de series que queremos incluir. Lo que sí es importante es adaptar la estructura de la red al número de datos utilizados, aunque ni siquiera aquí hay ninguna regla establecida, sólo recomendaciones. Sí que es verdad que a posteriori, si los resultados de la red no son los esperados… Read more »
Gracias por el post alarije! Es interesante ver una posible aplicación de redes neuronales a pesar de no tener resultados muy alentadores. A mi entender hay bastantes pocos parámetros de entrada en la red y uno de ellos, el número de retrasos del punto medio, tiene una gran importancia. ¿No sería capaz la red de decidir cuántos retrasos son relevantes o siempre hay que definirlos? Gracias.