Predicciones de Series de Tiempo Con Redes Neuronales PDF
Predicciones de Series de Tiempo Con Redes Neuronales PDF
Predicciones de Series de Tiempo Con Redes Neuronales PDF
Racionalidad Acotada
Un gran número de estudios han utilizados redes neuronales artificiales para modelar las bolsas de
valores de distintos países del mundo. Sin embargo, no existía un trabajo que lograse una predicción
exitosa del índice bursátil argentino.
Nuestra investigación utiliza un modelo de redes neuronales artificiales para predecir el Merval a partir
de la tasa de interés, el valor del dolar, la inflación, el tipo de cambio real, el día de la semana, la
actividad productiva industrial y el índice bursátil de Estados Unidos. El principal hallazgo encontrado
es que las redes neuronales son un buen predictor del Merval. Estos resultados son robustos a varias
especificaciones de la red: ventana de tiempo, cantidad de nodos, restricciones en los inputs y testeo en
base separadas al entrenamiento. Esto genera evidencia en contra de la hipótesis de mercados eficientes.
1. Introducción
Trabajos previos se han aprovechado de esta metodología para predecir distintas series
financieras: Bretney y Coburn (2008) utilizaron una red neuronal artificial para predecir el precio
intra-diario de acciones de ciertas empresas de tecnología en Estados Unidos; Dutta, Jha, Laha y
Mohan (2006) estudiaron la efectividad de esta metodología para modelar el mercado de valores
de India; Shachmurove y Witkowska (2000) examinaron las interrelaciones dinámicas entre los
mercados de valores más importantes del mundo a través del uso de estos modelos; entre otros
trabajos. Como antecedente más directo a nuestro trabajo, Maradona (2007) entrenó una red
neuronal con el fin de predecir el índice Merval. Sin embargo, las predicciones de su red no
logran un desempeño superior al obtenido utilizando un modelo de camino aleatorio. Nuestro
trabajo contribuye a esta literatura demostrando que sofisticando este modelo, es decir,
aumentando la cantidad de insumos, el desempeño en la predicción del Merval a través de las
redes neuronales mejora significativamente.
El principal hallazgo encontrado en esta investigación es que las redes neuronales son un
buen predictor del Merval. Estos resultados son robustos a varias especificaciones de la red:
ventana de tiempo, cantidad de nodos, restricciones en los inputs y testeo en base separadas al
entrenamiento. Esto genera evidencia en contra de la hipótesis de mercados eficientes, que
sostiene que toda la información relevante está contenida en los precios y que consecuentemente
no es imposible obtener ganancias sistemáticamente en el mercado de valores. En todos los
modelos desarrollados la estrategia de trade con redes neuronales genera ganancias que superan
ampliamente a la estrategia de buy and hold.
El trabajo si divide en dos secciones más. La segunda sección desarrolla en general, los
modelos de redes neuronales y, en particular, los modelos de redes neuronales aplicados a series
financieras. Además, introduce la discusión sobre los mercados eficientes. La tercera sección
contiene la información de nuestro modelo: los datos utilizados, la metodología de nuestras redes
y los principales resultados. Por último, figuran las conclusiones, con las limitaciones y posibles
extensiones del trabajo.
Las redes neuronales son métodos de aprendizaje que resultan eficaces para
aproximaciones de valores reales. Se trata de un sistema de interconexión de neuronas en una red
que colabora para producir un estímulo de salida.
El estudio de redes neuronales artificiales está inspirado en la observación de los sistemas
biológicos de aprendizaje, que se construyen de redes muy complejas interconectadas por
neuronas. Las redes neuronales artificiales, imitando a las biológicas (no se entiende sino), se
construyen a partir de conexiones de unidades simples, donde cada unidad tiene un número de
entradas con valores reales (posiblemente los resultados de otras unidades) y produce un único
valor real de salida, que puede llegar a ser, a su vez, un valor de entrada a otras unidades
(Mitchell, 1997, p. 82).
Una de las tareas de una red neuronal consiste en simular las propiedades observadas en
los sistemas neuronales biológicos a través de modelos matemáticos recreados mediante
mecanismos artificiales (como un circuito integrado, un ordenador o un conjunto de válvulas). El
objetivo es conseguir que las máquinas den respuestas similares a las que es capaz de dar el
cerebro que se caracterizan por su generalización y su robustez.
La investigación relacionada con redes neuronales se puede dividir en dos direcciones:
1) Investigaciones dirigidas con el objetivo de explorar las propiedades de los sistemas
biológicos de redes neuronales (la neurociencia computacional)
2) Investigaciones dirigidas al desarrollo de sistemas capaces de aproximar funciones
complejas de manera eficiente independientemente de que sean "espejos" o no de las redes
biológicas.
2.2 Funcionamiento
Cada neurona recibe una serie de entradas a través de interconexiones y emite una salida.
Esta salida viene dada por tres funciones:
2.3 Estructura
Neuronas de entrada
El número de neuronas de entrada se selecciona una vez que las variables independientes
se han pre-procesado, ya que cada variable independiente es representada por su neurona de
entrada propia.
Número de capas ocultas
Las capas ocultas proporcionarán a la red la capacidad de generalizar. En la práctica, se
suelen usar redes neuronales con una o dos capas ocultas. Sin embargo, no hay un criterio natural
acerca de la fórmula de selección óptima del número de neuronas ocultas. Baily y Thompson
(1990) sugieren que el número de neuronas ocultas en una red neuronal de tres capas debe ser de
75% del número de neuronas de entrada mientras que Ersoy (1990) propone duplicar el número
de neuronas ocultas hasta que el rendimiento de la red comience a deteriorarse.
En principio, parecería ser conveniente aumentar su número ya que, un mayor número de
neuronas permite una mayor variedad de valores posibles para las sinapsis, aproximando con
más exactitud los valores requeridos. Sin embargo, aumentar el número de capas ocultas también
aumenta el tiempo de cálculo y el peligro de sobreajuste. El overfitting ocurre cuando un modelo
tiene muy pocos grados de libertad y “sobreajusta” la red a la muestra de los datos que se le
proveen durante la etapa de entrenamiento, haciendo que la predicción sea buena cuando los
insumos pertenecen al conjunto de datos con el que se calibró o entrenó la red y deficiente con
datos fuera de la muestra. Tiene relativamente pocas observaciones en relación con sus
parámetros y, por lo tanto, memoriza puntos individuales en lugar de aprender los patrones
generales. Ergo, tenemos un trade off entre la cantidad de parámetros a estimar y la precisión del
modelo.
Etapas o fases:
Las características de las RN las hacen muy apropiadas para aplicaciones en las que no se
dispone a priori de un modelo identificable que pueda ser programado, pero cuando se dispone
de un conjunto básico de ejemplos de entrada (previamente clasificados o no). Asimismo, son
altamente robustas tanto al ruido como a la disfunción de elementos concretos y son fácilmente
paralelizables. Las redes neuronales tienen muchas ventajas, entre ellas:
1. Aprendizaje: Las RN tienen la habilidad de aprender con un alto grado de
precisión mediante una etapa de aprendizaje.
3. Auto-organización: Una red neuronal construye su propia representación de la
información en su interior, libreando al analista de este trabajo.
4. Tolerancia a fallos: La red puede seguir respondiendo aceptablemente aún si se
daña parcialmente.
5. Flexibilidad: La red puede manejar cambios no importantes en la información de
entrada, como señales con ruido, sin sufrir cambios drásticos.
6. Tiempo real: La estructura de una RNA es paralela, por lo cual se pueden
obtener respuestas en tiempo real.
7. Modela los patrones de datos: los generaliza y sus técnicas son robustas.
8. No hay que realizar supuestos para el modelo. No están sesgadas en su análisis.
Topología de redes
a) Según aprendizaje:
Una de las clasificaciones que se suele hacer de redes neuronales es en función del tipo
de aprendizaje de que es capaz (si necesita o no un conjunto de entrenamiento supervisado). Para
cada tipo de aprendizaje encontramos varios modelos propuestos por diferentes autores:
Aprendizaje supervisado: necesitan un conjunto de datos de entrada previamente
clasificado o cuya respuesta objetivo se conoce. Ejemplos de este tipo de redes son: el perceptrón
simple, la red Adaline, el perceptrón multicapa y la memoria asociativa bidireccional.
Aprendizaje no supervisado o auto organizado: no necesitan de tal conjunto previo.
Ejemplos de este tipo de redes son: las memorias asociativas, las redes de Hopfield, la máquina
de Bolzman y la máquina de Cauchy, las redes de aprendizaje competitivo, las redes de Kohonen
o mapas auto organizados y las redes de resonancia adaptativa .
Redes híbridas: son un enfoque mixto en el que se utiliza una función de mejora para
facilitar la convergencia. Un ejemplo de este último tipo son las redes de base radial.
Aprendizaje reforzado: se sitúa a medio camino entre el supervisado y el auto organizado.
Las redes neuronales artificiales han demostrado ser una herramienta eficaz para la
modelación no paramétrica de datos en una variedad de contextos diferentes, donde el producto
final es una función no lineal de los insumos. Una amplia literatura ha aplicado estos modelos a:
previsiones de negocio, calificación crediticia, calificación de los bonos, la predicción del
fracaso empresarial, la medicina, el reconocimiento de patrones y el procesamiento de imágenes.
Sin embrago, en esta revisión de la literatura previa concentraremos nuestra atención en los
trabajos que utilizaron las redes neuronales para la predicción de series financieras alrededor del
mundo. En particular, resumiremos algunos de estos trabajos para Estados Unidos, la India, el
resto del mundo y, por último, la Argentina.
El trabajo “High frequency Trading with an artificial neural network” de Coburn y
Bretney, utiliza una red neuronal para predecir el precio intra-diario (High-Frequency-Trading)
de acciones de ciertas empresas de tecnología (Apple Incorporated, Cisco Systems Incorporated,
Intel Corporation, Microsoft Corporation, Oracle Corporation, Qualcomm Incorporated) que
cotizaban en el NYSE en enero del 2000. Algunas de las características de su red neuronal son:
es Feed-Foward, con algoritmo de aprendizaje del tipo back-propagation, 100 nodos ocultos en
una única capa oculta, 5 insumos (precio y volúmenes de demanda y oferta y precio realizado de
acciones de empresas tecnológicas). La red se re-entrena cada 20 períodos (intervalos de 30
minutos con datos por minuto) y el parámetro de look-back es de 25 períodos. Se utiliza una
función de activación de los insumos tangente hiperbólica (tanh). Los autores concluyen que, en
la mayoría de los casos, la estrategia obtenida siguiendo esta red neuronal supera el desempeño
de una estrategia de Buy-and-Hold, aunque no siempre se obtienen ganancias.
“Artificial Neural Network Models for Forecasting Stock Price Index in the Bombay
Stock Exchange” de Dutta, Jha Laha y Mohan modela con redes neuronales el mercado de
valores de la India. Desarrollaron dos redes neuronales con tres capas ocultas y utilizaron como
insumos rezagos del producto y promedios de rezagos del producto. El desempeño de sus redes
es mesurado a través del error cuadrático medio y el error medio absoluto. La primera de sus
redes logra un ECM de 4.82 por ciento y EMA de %3.93, mientras que la segunda red logra un
ECM de %6.87 y un EMA de %5.52.
La investigación “Utilizing Artificial Neural Network Model to Predict Stock Markets” de
Shachmurove y Witkowska examina las interrelaciones dinámicas entre los distintos mercados
de valores del mundo utilizando esta metodología. Los datos usados provienen de índices diarios
los mercados bursátiles más importantes del mundo: Canadá, Francia, Alemania, Japón, Reino
Unido (UK), Estados Unidos (EE.UU.), entre otros. Modelos multicapa perceptron con
funciones de activación logística resultaron tener mejores condiciones para prever los
rendimientos de las acciones diarias que los modelos tradicionales de predicción, en términos de
menores errores cuadráticos medios. Por otra parte, un multicapa perceptron con cinco unidades
en la capa oculta predice con mayor precisión el rendimiento de los índices bursátiles que una
red neuronal con dos elementos ocultos.
Por último, el trabajo “Resultados de una aproximación preliminar a la predicción de
series financieras utilizando redes neuronales” de Gustavo Maradona (presentado en la AAEP
en 2007), entrena una red neuronal con el fin de predecir el índice Merval en Argentina y
comparar su desempeño con el de un camino aleatorio. Utiliza una red neuronal de tipo
recurrente (Total-Recurrent) con dos capas ocultas. El algoritmo de aprendizaje es el de
optimización de Powells. En los nodos de la primera capa oculta se utiliza función de activación
arco-tangente, lineal umbral en los de la segunda capa oculta y sigmoidea en la capa de output.
Se utilizan como insumos dos rezagos de la tasa de interés pasiva que reporta el BCRA y un
rezago del Merval. Se concluye que las redes estimadas no logran un desempeño superior al
obtenido en la aplicación de un modelo de camino aleatorio, presentando evidencia a favor de la
hipótesis de mercados eficientes.
Puede observarse que la mayoría de los trabajos concluye que las redes neuronales son un
buen predictor de las series financieras analizadas, si bien no siempre resultan significativamente
distintas de un camino aleatorio.
3. Nuestro modelo: Predicción del índice Merval con redes neuronales
Producto de la red
Índice Merval: El Merval es el índice más difundido del mercado accionario argentino.
En particular, este índice es el valor de mercado de una cartera de acciones, seleccionada
de acuerdo a la participación en la cantidad de transacciones y el monto operado en la
Bolsa de Comercio de Buenos Aires.
Insumos de la red
Tasa de interés pasiva: es el porcentaje que pagaron las instituciones bancarias a quienes
depositaron dinero en pesos en un plazo fijo a 30 días exclusivamente. Estos datos son
reportados por el Banco Central de la República Argentina.
Índice de Precios al Consumidor: Debido a que los datos del IPC (Índice de Precios al
Consumidor) reportados por el INDEC no son confiables a partir de diciembre de 2006,
esta serie mensual es reemplazada por el IPC-CqP (Índice de Precios al Consumidor de
Cosas que Pasan, publicado por CqP) a partir de esa fecha. El IPC-CqP es un promedio
geométrico ponderado de IPCs provinciales. Para computar este índice se utilizan los
datos de nueve provincias y las ponderaciones son proporcionales a las correlaciones que
tenían estos índices con el IPC-GBA (a mayor correlación, mayor peso en el índice).
Variación anual del IPC: Se trata de datos a nivel mensual de la variación anual del índice
anteriormente mencionado.
Tipo de Cambio Nominal: Para medir el Tipo de Cambio Nominal se utiliza el precio
diario de venta del dólar estadounidense en Capital Federal.
Tipo de Cambio Real: Debido a que los datos del Índice de Tipo de Cambio Real
Multilateral (ITCRM) reportados por el BCRA utiliza el IPC del INDEC, estos datos no
son confiables a partir de diciembre de 2006. En consecuencia, esta serie mensual es
reemplazada por el Tipo de Cambio Real Efectivo (TCRE) publicado por CqP.
Existen algunas diferencias metodológicas entre estos dos índices. Por un lado, el ITCRM
posee un número mayor de países en su muestra. Sin embargo, los países abarcados en el TCRE
son los responsables de más del 60% del comercio de la Argentina. Por otro lado, para sus
ponderaciones el ITCRM no incluye el comercio de bienes básicos, mientras que el TCRE utiliza
la totalidad del intercambio comercial. Por último, el TCRE usa un double-weighting para las
exportaciones. Es decir, la ponderación de cada país en el índice se compone de tres partes (en
lugar de los dos usados por el ITCRM): participación en las importaciones, participación en las
exportaciones, y una tercera: competitividad en los terceros mercados. Al igual que el ITCRM, el
TCRE toma como base Diciembre 2001=100, el último mes en que se mantuvo el régimen de
convertibilidad.
Índice Dow Jones: (Dow Jones Industrial Average) es el principal índice bursátil de
Estados Unidos. Mide el desempeño de las 30 mayores empresas transadas en la bolsa de
Estados Unidos. Estas empresas no corresponden únicamente a la industria pesada sino
que tiene como componentes compañías financieras y de informática, entre otras. En el
apéndice III figuran los nombres de estas 30 empresas y la industria a la que pertenecen.
Para compensar los efectos de divisiones de acciones y otros ajustes, el promedio es
calculado a escala en relación al tamaño e importancia de una empresa.
Día de la semana: Debido a que pueden existir ciclos intrasemanales en las series
financieras, el día de la semana puede ser un insumo relevante para predecir el valor del
Merval. Este insumo toma el valor 1 el día lunes, 2 el día martes y así sucesivamente.
Índice Merval: además de ser el producto de nuestras redes, rezagos del Merval son
utilizados como insumos.
Ventanas Temporal
Este trabajo utiliza, para su análisis, observaciones diarias desde el 01/012003 al 30/09/2011.
Decidimos considerar la dinámica del Merval a partir del 2003 debido a la posible presencia de
un cambio estructural de la serie en los años 2001 y 2002. Dentro de esta serie sólo consideramos
los días hábiles debido a la ausencia de datos para nuestro producto y algunos insumos durante
los días del fin de semana y feriados. En total la base consta de 2192 períodos (días).
El tipo de red neuronal de series de tiempo utilizada para este trabajo es la red NARX:
Nonlinear Autorregresive Network with Exogenous inputs. El modelo NARX está basado en el
modelo lineal ARX de difundido uso en series de tiempo. La principal ventaja de la red NARX
sobre una red feed-forward es que permite ganar grados de libertad al incluir la predicción de un
período como dato en períodos siguientes, resumiendo información de las variables exógenas,
permitiendo incluir menos rezagos de las mismas y resumiendo el número de parámetros “a
estimar”.
Cuando el feedback loop está abierto en la red neuronal NARX, predice el próximo valor de y(t)
de los valores previos de y(t) y x(t) (insumos externos). Cuando el feedback loop está cerrado, la
red se puede utilizar para ejecutar predicciones varios pasos hacia adelante. Esto se debe a que
las predicciones de la variable dependiente en t, van a ser usadas en lugar de valores
efectivamente futuros de la misma.
Desempeño de la red
Correlación entre errores e insumos
Validación
Para el segundo modelo los datos fueron divididos de forma no aleatoria entre las tres
fases, con un bloque después del otro. A continuación se ilustra el buen desempeño de esta red
con diferentes gráficos.
Desempeño de la red
Las correlaciones entre el Merval y sus rezagos son más fuertes que en el modelo previo:
SE
Estrategias
¿Contra qué referencia podríamos medir el desempeño de estas redes entrenadas?
Utilizaremos como referencia el modelo que resulta de predecir el valor del Merval en función
de la observación anterior, estableciendo como hipótesis que la estructura es la correspondiente a
un camino aleatorio.
Definimos:
Vender = ir short
Comprar = ir long
Estrategia activa: Las ganancias se calculan del siguiente modo: si la red predice que el
precio va a subir, el agente compra. Luego, cuando predice que va a bajar, cierra esta posición
(donde está Long) y va short. Ahí registra su ganancia, la diferencia entre el valor al comprar y al
vender su posición long. Después por ejemplo, si predice que va a subir de nuevo estando short,
cierra su posición short y calcula la diferencia de nuevo. La ganancia final será la suma de todas
estas diferencias diarias.
Para evitar el problema del sobreajuste, es aconsejable utilizar un segundo grupo de datos
diferentes a los de entrenamiento, el grupo de validación, que permita controlar el proceso de
aprendizaje. Durante el aprendizaje la red va modificando los pesos en función de los datos de
entrenamiento y de forma alternada se va obteniendo el error que comete la red ante los datos de
validación. De este modo, podemos averiguar cuál es el número de ponderadores óptimo, en
función de la arquitectura que ha tenido la mejor ejecución con los datos de validación. Como se
verá más adelante, mediante el grupo de validación también se puede determinar el valor de otros
parámetros que intervienen en el aprendizaje de la red.
Por último, si se desea medir de una forma completamente objetiva la eficacia final del
sistema construido, no deberíamos basarnos en el error que se comete ante los datos de
validación, ya que de alguna forma, estos datos han participado en el proceso de entrenamiento.
Se debería contar con un tercer grupo de datos independientes, el grupo de test el cual
proporcionará una estimación insesgada del error de generalización.
Dentro de los distintos modelos de redes se incluyeron validaciones separadas para evitar
el problema del sobreajuste, utilizando un segundo grupo de datos diferentes a los de
entrenamiento, que permita controlar el proceso de aprendizaje y proporcione una estimación
insesgada del error de generalización. Este testeo es fundamental ya que evalúa de una forma
completamente objetiva la eficacia final del sistema construido, uno no se debe basar solamente
en el error que se comete ante los datos de validación, ya que estos datos participaron en el
proceso de entrenamiento.
Otras especificaciones son: distinto número de nodos (el trade off entre sesgo y ajuste fue
explicado en la segunda sección), cambio en la cantidad de insumos (reducir el número a los
más relevantes, cuya metodología y elecciones se encuentra descripta en el apéndice), y cambio
en la asignación de las fases en el entrenamiento: por bloques secuenciales o aleatoria.
Luego analizamos la capacidad predictiva de las redes; por un lado usamos el indicador
convencional, el error cuadrático medio y por el otro evaluamos el porcentaje de cambios de
signos correctamente predichos: es decir, analizamos tanto la dirección como el nivel de la
predicción.
Modelo ECM (%) Aciertos Trading con la red vs. Estrategia Buy and Hold
Acumulados
al final del
período
Ganancias Ganancias con Dif.
realizando trading estrategia Buy and
con la red neuronal Hold
1 173513.08 55.72 2113.11 -206.35 2319.46
2 1061.46 57.59 7434.74 2351.11 5083.63
3 1030.25 56.19 4257.89 2351.11 1906.78
4 471.20 61.48 3249.13 1303.21 1945.92
5 207.08 62.5 3211.98 1303.21 1908.77
6 60407.22 35.36 965.02 1961.79 -996.77
7 12474.52 51.11 1776.48 34.08 1742.4
8 433.51 57.7 2699.31 1303.21 1396.1
9 45554.50 50.38 2690.57 2351.11 339.46
En todos los casos la Estrategia de Trade con Redes Neuronales condujo a ganancias y
9/10 casos logró superar a la estrategia tradicional de Buy and Hold, con diferencias que
alcanzan miles de puntos del índice Merval al final del período en cuestión. De todas maneras, la
varianza es considerable a través de las distintas especificaciones de redes, y a través de distintos
los periodos de tiempo. De esta manera, con el modelo número 2 en el período 2003- septiembre
/2011, se logran ganancias de 5083 puntos respecto de Buy and Hold, pero también se pierden
casi mil puntos con el modelo número 6 en el período 2003-mayo/2006. Estos resultados son
también un poco azarosos, ya que la ganancia, en definitiva, que obtiene un individuo con
estratega de retención de acciones, no es más que la diferencia entre el valor del índice en el
momento en que adquirió por primera vez la cartera de mercado, y el valor de la cartera de
mercado al final del período que marcamos nosotros. Con lo cual, el hecho de que en un test se
obtengan pérdidas relativas, no invalida la capacidad de predicción de la misma. Por otro lado,
está claro que una red que está en continuo proceso de entrenamiento, va a tender a ejecutar
predicciones más certera y precisas que en caso contrario. Al simular y realizar tests sobre una
base con datos cada vez más alejados del proceso de entrenamiento, la red va a predecir menos,
particularmente en contextos de altas fluctuaciones en el índice y los insumos de la red, y
principalmente en momentos de cambios bruscos de tendencia, donde lo aprendido muchos
periodos atrás ya no es útil para predecir el futuro.
Además, en 9/10 casos la red acertó en más de 50% en la predicción del signo de la
variación del índice respecto del período anterior, superando en promedio, a un camino aleatorio.
Esto podría estar dando evidencia de que por un lado, las redes pueden aprender cosas de
precios pasados y de valores pasados de insumos a la red, e incluso bastante mejor que un
camino aleatorio. Este resultado va en contra de la hipótesis de eficiencia de mercado, que dice
que toda información relevante está contenida en los precios y por ende es imposible obtener
continuamente ganancias en el mercado. No obstante, debe reconocerse que los resultados están
lejos de presentar dura evidencia contra dicha hipótesis: es verdaderamente complejo predecir
variables financieras y obtener ganancias significativas con estrategias de este estilo.
Ganancias de Trading con de red neuronal vs. Buy and Hold.
3000
2500
2000
1500
1000
500
0
139
576
116
162
185
208
231
254
277
300
323
346
369
392
415
438
461
484
507
530
553
599
622
645
668
691
714
737
760
783
806
829
1
24
47
70
93
-500
Para el cuarto modelo se observa una sistemática ventaja de la estrategia de trading con
redes neuronales sobre la estrategia pasiva Buy and Hold, generando ganancias superiores a
3000 puntos durante el periodo, tan sólo haciendo transacciones con una cartera que replica
constantemente la composición del Merval.
Ganancias de trading para el modelo 8
2500
2000
1500
1000
500
485
551
617
683
749
111
133
155
177
199
221
243
265
287
309
331
353
375
397
419
441
463
507
529
573
595
639
661
705
727
771
793
815
837
1
23
45
67
89
-500
Una amplia literatura ha demostrado que las redes neuronales artificiales son una
herramienta eficaz para la modelación no paramétrica de datos en una variedad de contextos
diferentes, donde el producto final es una función no lineal de los insumos. Estos modelos han
sido aplicados exitosamente a: previsiones de negocio, calificación crediticia, calificación de los
bonos, la predicción del fracaso empresarial, la medicina, el reconocimiento de patrones y el
procesamiento de imágenes. A su vez, en la literatura más específica de redes neuronales y series
financieras, también existen muchos casos éxito: las redes neuronales lograron predecir mejor el
comportamiento de índices bursátiles en Estados Unidos, India y otros mercados que otros
modelos tradicionales de predicción.
Sin embargo, no existía hasta el momento un modelo que lograse predecir exitosamente
el índice bursátil de la Argentina. Maradona realizó un intento: entrenó una red neuronal que
utilizaba como insumos la tasa de interés pasiva reportada por el Banco Central y un rezago del
Merval. Sin embargo, las predicciones de su red no logran un desempeño superior al obtenido
utilizando un modelo de camino aleatorio. Nuestro trabajo contribuye a esta literatura
demostrando que sofisticando este modelo, es decir, aumentando la cantidad de insumos, el
desempeño en la predicción del Merval a través de las redes neuronales mejora
significativamente.
El principal hallazgo encontrado en esta investigación es que las redes neuronales son un
buen predictor del Merval. Estos resultados son robustos a varias especificaciones de la red:
ventana de tiempo, cantidad de nodos, restricciones en los inputs y testeo en base separadas al
entrenamiento. Esto genera evidencia en contra de la hipótesis de mercados eficientes, que
sostiene que toda la información relevante está contenida en los precios y que consecuentemente
no es imposible obtener ganancias sistemáticamente en el mercado de valores. En todos los
modelos desarrollados la estrategia de trade con redes neuronales genera ganancias que superan
ampliamente a la estrategia de buy and hold.
Más allá de los resultados encontrados, el análisis de este trabajo está claramente acotado
al testeo de la hipótesis de eficiencia de mercado y una aproximación al entendimiento del
proceso de generación de datos detrás de las fluctuaciones del índice del Merval. A modo de
ejemplo de estas limitaciones, nuestro trabajo no imita con precisión cómo un trader debería
utilizar las redes neuronales para generar ganancias en sus transacciones. Para ello, una posible
extensión de este trabajo sería replicar un escenario más realista del ámbito de trading. En el día
a día, un trader haría el siguiente procedimiento: en vez de usar data histórica hasta cierta fecha
y desde allí entonces utilizar las predicciones de la red, el trader actualizaría diariamente esta
base de datos de series históricas. De esta manera, el set de datos que se utilizaría para el
entrenamiento de la red incorporaría nueva información con cada día y así iría ajustando la red
para poder predecir los precios del día siguiente de manera más informada. La implementación
en MATLAB requeriría la generación de N bases , una para cada “día del trader” que toman M
periodos de tiempo desde la fecha hacia atrás. Estas deberían ser consecutivas. Después se
realizaría la predicción con la red neuronal para cada fecha con la base de datos que corresponde
a la información hasta el día previo a esa fecha.
Por otro lado, la hipótesis de eficiencia de mercado fue diseñada pensada en precios de
activos de empresas y no para índices de bolsas de valores. Para mejorar este aspecto, otra
posible extensión de nuestro trabajo sería testear otras especificaciones de la hipótesis de
eficiencia de mercado. En primer lugar, se podría hacer el mismo testeo para datos de empresas y
no para el índice en su totalidad. Claramente, habría que cambiar los inputs, sacando algunos e
incorporando otros asociados a las empresas. En segundo lugar, se podría profundizar el testeo
sobre empresas replicando el ejercicio sobre precios intradiarios, suponiendo liquidez en todos
los periodos.
Por último, dentro de la metodología de redes neuronales, como no existe un criterio
exacto para la especificación de la red, se podrían realizar aún más chequeos de robustez a las
predicciones de la red con toda la gama de opciones de estructura de la red. Se podría programar
en MATLAB una rutina que corra la red para distintas especificaciones y vaya guardando el
desempeño de cada una de ellas. Habría que ser cauteloso con las conclusiones de que estructura
de red se desempeña mejor, ya que no es obvio que sean generalizables para otros contextos, sino
únicamente para este ejercicio con el Merval.
VI. Bibliografia
Bretney K. and Coburn Z. (2008), “High frequency trading with an artificial neural
network”, Mimeo
Dutta, Goutam, Jha Pankaj, Laha, Arnab Kumar y Neeraj Mohan (2006) , “Artificial
Neural Network Models for Forecasting Stock Price Index in the Bombay Stock Exchange”,
Journal of Emerging Market Finance, 2006;5;283.
Medeiros, Marcelo y Timo Teräsvirta (2001), “Statistical Methods for modelling neural
networks”, texto para discussao Nº 445, Departamento de Economía, UC de Rio de Janeiro.
Rech, Gianluigi (2002), “Forecasting with artificial neural network models”, SSE/EFI
Working Paper Series in Economics and Finance, nbr. 491, Stockholm School of Economics.
Páginas web:
http://www.merval.sba.com.ar/htm/mv_preguntas_frecuentes.aspx
http://www.bolsar.com/NET/Research/Metodologia/MERVAL.asp
VII. Apéndices
Como chequeo de robustez y con el objetivo de determinar que variables eran más
significativas para generar un modelo reducido, realizamos regresiones bajo un modelo ARIMA
y un modelo MCO. A continuación se muestran los p-value asociados a las variables de interés:
Regresión ARIMA
Variable P-value
Venta del dólar 0.006
Tasa de interés 0.271
IPC 0.000
IPC (variación anual) 0.733
TCR 0.000
IPI 0.997
Dow Jones 0.000
Regresión MCO
Variable P-value
Venta del dólar 0.017
Tasa de interés 0.000
IPC 0.000
IPC (variación anual) 0.000
TCR 0.000
IPI 0.000
Dow Jones 0.000
Día de la semana 0.695
Apéndice II: Especificación de redes
Función de asignación DIVIDERAND
insumos=num2cell(insumos_columna', [1,8])
targets=num2cell(targets_columna')
inputSeries = insumos;
targetSeries = targets;
% Creamos una Red No-Lineal Auto-regresiva con Insumos Externos. (NARX por sus siglas en
Inglés. Tiene 2 rezagos cada variable dependiente e independiente. 5 nodos ocultos en la única
capa oculta.
feedbackDelays = 1:2;
hiddenLayerSize = 5;
net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize);
% Para una lista de todas las funciones de procesamiento, tiperar: “help nnprocess”.
net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};
net.inputs{2}.processFcns = {'removeconstantrows','mapminmax'};
% La function “PREPARETS” prepara los datos de serie de tiempo para una red particular,
moviendo la variable temporal la menor cantidad possible para completer input y layer states.
% “PREPARETS” nos permite mantener nuestos datos originals de series de tiempo invariables,
mientras facilmente los adaptamos a redes con diversos numeros de rezagos, con modelos de
Feedback de open-loop o close-loop.
[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries);
% entrenamos la red
outputs = net(inputs,inputStates,layerStates);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)
% visualizamos la red
view(net)
insumos=num2cell(insumos_columna', [1,8])
targets=num2cell(targets_columna')
inputSeries = insumos;
targetSeries = targets;
% Creamos una Red No-Lineal Auto-regresiva con Insumos Externos. (NARX por sus siglas en
Inglés. Tiene 2 rezagos cada variable dependiente e independiente. 5 nodos ocultos en la única
capa oculta.
feedbackDelays = 1:2;
hiddenLayerSize = 5;
net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize);
% Para una lista de todas las funciones de procesamiento, tiperar: “help nnprocess”.
net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};
net.inputs{2}.processFcns = {'removeconstantrows','mapminmax'};
% La function “PREPARETS” prepara los datos de serie de tiempo para una red particular,
moviendo la variable temporal la menor cantidad possible para completer input y layer states.
% “PREPARETS” nos permite mantener nuestos datos originals de series de tiempo invariables,
mientras facilmente los adaptamos a redes con diversos numeros de rezagos, con modelos de
Feedback de open-loop o close-loop.
[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries);
% entrenamos la red
outputs = net(inputs,inputStates,layerStates);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)
% visualizamos la red
view(net)
% graficamos los resultados
figure, plotperform(tr)
figure, plottrainstate(tr)
figure, plotregression(targets,outputs)
figure, plotresponse(targets,outputs)
figure, ploterrcorr(errors)
figure, plotinerrcorr(inputs,errors)
%3) Ahora cambiamos por segunda vez las especificaciones. Ponemos 1 capa oculta y 10 nodos
%ocultos, que es el DEFAULT de la red NARX en MATLAB 2011%
%recordar cerrar el workspace anterior con "clear" y abrir otro limpio"
%Insertamos una matriz de insumos (insumos_columna) y un vector de producto
(targets_columna), columna, de excel%
% Transformamos las matrices de insumos y productos, en matrices que se puedan leer como
time-steps (en ese caso, pensemos en una matriz con 8 insumos)%
insumos=num2cell(insumos_columna', [1,10])
targets=num2cell(targets_columna')
inputSeries = insumos;
targetSeries = targets;
% Creamos una Red No-Lineal Auto-regresiva con Insumos Externos. (NARX por sus siglas en
Inglés. Tiene 2 rezagos cada variable dependiente e independiente. 5 nodos ocultos en la única
capa oculta.
feedbackDelays = 1:2;
hiddenLayerSize = 5;
net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize);
% Para una lista de todas las funciones de procesamiento, tiperar: “help nnprocess”.
net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};
net.inputs{2}.processFcns = {'removeconstantrows','mapminmax'};
% La function “PREPARETS” prepara los datos de serie de tiempo para una red particular,
moviendo la variable temporal la menor cantidad possible para completer input y layer states.
% “PREPARETS” nos permite mantener nuestos datos originals de series de tiempo invariables,
mientras facilmente los adaptamos a redes con diversos numeros de rezagos, con modelos de
Feedback de open-loop o close-loop.
[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries);
% entrenamos la red
outputs = net(inputs,inputStates,layerStates);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)
% visualizamos la red
view(net)
%4) Ahora cambiamos por tercera vez las especificaciones. Ponemos 1 capa oculta y 100 nodos
%ocultos.
%recordar cerrar el workspace anterior con "clear" y abrir otro limpio"
%Insertamos una matriz de insumos (insumos_columna) y un vector de producto
(targets_columna), columna, de excel%
% Transformamos las matrices de insumos y productos, en matrices que se puedan leer como
time-steps (en ese caso, pensemos en una matriz con 8 insumos)%
insumos=num2cell(insumos_columna', [1,100])
targets=num2cell(targets_columna')
inputSeries = insumos;
targetSeries = targets;
% Creamos una Red No-Lineal Auto-regresiva con Insumos Externos. (NARX por sus siglas en
Inglés. Tiene 2 rezagos cada variable dependiente e independiente. 5 nodos ocultos en la única
capa oculta.
feedbackDelays = 1:2;
hiddenLayerSize = 5;
net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize);
% Para una lista de todas las funciones de procesamiento, tiperar: “help nnprocess”.
net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};
net.inputs{2}.processFcns = {'removeconstantrows','mapminmax'};
% La function “PREPARETS” prepara los datos de serie de tiempo para una red particular,
moviendo la variable temporal la menor cantidad possible para completer input y layer states.
% “PREPARETS” nos permite mantener nuestos datos originals de series de tiempo invariables,
mientras facilmente los adaptamos a redes con diversos numeros de rezagos, con modelos de
Feedback de open-loop o close-loop.
[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries);
% Configurar la División de los datos hacia grupo de Entrenamiento, Validación y Testeo.
% La función “DIVIDERAND” asigna valores target de manera aleatoria al grupo
Entrenamiento, Validación y Testeo durante el Entrenamiento de la Red Neuronal.
net.divideFcn = 'dividerand';
net.divideMode = 'value';
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
% entrenamos la red
outputs = net(inputs,inputStates,layerStates);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)
% visualizamos la red
view(net)
% Para una lista de todas las funciones de procesamiento, tiperar: “help nnprocess”.
net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};
net.inputs{2}.processFcns = {'removeconstantrows','mapminmax'};
% La function “PREPARETS” prepara los datos de serie de tiempo para una red particular,
moviendo la variable temporal la menor cantidad possible para completer input y layer states.
% “PREPARETS” nos permite mantener nuestos datos originals de series de tiempo invariables,
mientras facilmente los adaptamos a redes con diversos numeros de rezagos, con modelos de
Feedback de open-loop o close-loop.
[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries);
net.divideFcn = 'dividerand';
net.divideMode = 'value';
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
% entrenamos la red
outputs = net(inputs,inputStates,layerStates);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)
% visualizamos la red
view(net)
% Para una lista de todas las funciones de procesamiento, tiperar: “help nnprocess”.
net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};
net.inputs{2}.processFcns = {'removeconstantrows','mapminmax'};
% La function “PREPARETS” prepara los datos de serie de tiempo para una red particular,
moviendo la variable temporal la menor cantidad possible para completer input y layer states.
% “PREPARETS” nos permite mantener nuestos datos originals de series de tiempo invariables,
mientras facilmente los adaptamos a redes con diversos numeros de rezagos, con modelos de
Feedback de open-loop o close-loop.
[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries);
% entrenamos la red
outputs = net(inputs,inputStates,layerStates);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)
% visualizamos la red
view(net)
% DIVIDE BLOCK%
inputSeries = insumos;
targetSeries = targets;
% Creamos una Red No-Lineal Auto-regresiva con Insumos Externos. (NARX por sus siglas en
Inglés. Tiene 2 rezagos cada variable dependiente e independiente. 5 nodos ocultos en la única
capa oculta.
feedbackDelays = 1:2;
hiddenLayerSize = 5;
net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize);
% Para una lista de todas las funciones de procesamiento, tiperar: “help nnprocess”.
net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};
net.inputs{2}.processFcns = {'removeconstantrows','mapminmax'};
% La function “PREPARETS” prepara los datos de serie de tiempo para una red particular,
moviendo la variable temporal la menor cantidad possible para completer input y layer states.
% “PREPARETS” nos permite mantener nuestos datos originals de series de tiempo invariables,
mientras facilmente los adaptamos a redes con diversos numeros de rezagos, con modelos de
Feedback de open-loop o close-loop.
[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries);
% usamos divideblock
net.divideFcn = 'divideblock';
net.divideMode = 'value'; %
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
% entrenamos la red
outputs = net(inputs,inputStates,layerStates);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)
% visualizamos la red
view(net)
% Para una lista de todas las funciones de procesamiento, tiperar: “help nnprocess”.
net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};
net.inputs{2}.processFcns = {'removeconstantrows','mapminmax'};
% Preparamos la base de datos para Entrenamiento (Training) y Simulación.
% La function “PREPARETS” prepara los datos de serie de tiempo para una red particular,
moviendo la variable temporal la menor cantidad possible para completer input y layer states.
% “PREPARETS” nos permite mantener nuestos datos originals de series de tiempo invariables,
mientras facilmente los adaptamos a redes con diversos numeros de rezagos, con modelos de
Feedback de open-loop o close-loop.
[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries);
% usamos divideblock
net.divideFcn = 'divideblock';
net.divideMode = 'value'; %
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
% entrenamos la red
outputs = net(inputs,inputStates,layerStates);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)
%8)DIVIDEBLOCK 8 nodos
%DIVIDEBLOCK con 2 rezagos y 8 inputs%
inputSeries = insumos;
targetSeries = targets;
% Para una lista de todas las funciones de procesamiento, tiperar: “help nnprocess”.
net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};
net.inputs{2}.processFcns = {'removeconstantrows','mapminmax'};
% Preparamos la base de datos para Entrenamiento (Training) y Simulación.
% La function “PREPARETS” prepara los datos de serie de tiempo para una red particular,
moviendo la variable temporal la menor cantidad possible para completer input y layer states.
% “PREPARETS” nos permite mantener nuestos datos originals de series de tiempo invariables,
mientras facilmente los adaptamos a redes con diversos numeros de rezagos, con modelos de
Feedback de open-loop o close-loop.
[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries);
% usamos divideblock
net.divideFcn = 'divideblock'; %
net.divideMode = 'value'; %
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
% entrenamos la red
outputs = net(inputs,inputStates,layerStates);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)
%9)Validacion separada.Por ejemplo con una muestra dada, usamos %70 para entrenamiento,
%30 para TESTEO en una base que no haya sido considerada en la etapaprevia.
%En el caso de 2003-2011 tenemos en total 2192 observaciones (timesteps).
%Utilizamos l535 observaciones en la primer etapa y 657 en la segunda.
%Para esto, construimos DOS matrices de insumos distintas y dos vectores de%target distintos.
netc = closeloop(net);
netc.name = [net.name ' - Closed Loop'];
view(netc)
[xc,xic,aic,tc] = preparets(netc,insumos_test,{},targets_test);
yc = netc(xc,xic,aic);
closedLoopPerformance = perform(netc,tc,yc)