Logo Studenta

Análisis de mercado financiero TFG_PINA CANELLES_Analisis tecnico de mercados financieros

¡Este material tiene más páginas!

Vista previa del material en texto

Análisis técnico de mercados financieros basado en
técnicas de inteligencia artificial
Ángel Pina Canelles
5 de septiembre de 2014
Índice general
0.1. Abstract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1. El Problema 9
1.1. El Análisis de los Mercados Financieros . . . . . . . . . . . . . . . . . . . . 9
1.1.1. El Análisis Fundamental y el Análisis Técnico . . . . . . . . . . . . 9
1.1.2. Los Principios y Métodos del Análisis Técnico . . . . . . . . . . . . 10
1.1.3. Algunas Técnicas de Análisis Chartista . . . . . . . . . . . . . . . . 11
1.1.4. Algunas Técnicas del Análisis de Osciladores . . . . . . . . . . . . . 12
1.2. Traders Automáticos y Talentum . . . . . . . . . . . . . . . . . . . . . . . 14
1.3. Problema Propuesto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2. Desarrollo de la Solución 17
2.1. Solución Propuesta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.1. Visión General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.2. Redes Neuronales como Predictores . . . . . . . . . . . . . . . . . . 18
2.1.3. El Procedimiento Completo . . . . . . . . . . . . . . . . . . . . . . 21
2.2. Etapas del Proceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.2.1. Obtención y Tratamiento de los Datos . . . . . . . . . . . . . . . . 22
2.2.2. Entrenamiento de Redes Neuronales . . . . . . . . . . . . . . . . . . 24
2.2.3. Puesta en Marcha a Mercado Real . . . . . . . . . . . . . . . . . . 26
2.2.4. Monitorización y Fiabilidad . . . . . . . . . . . . . . . . . . . . . . 27
3. Aspectos Técnicos 29
3.1. Software Desarrollado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.1.1. Librerias Utilizadas . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.1.2. Módulos Desarrollados . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.1.3. Estructura General . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.1.4. Interfaz de Usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.2. Detalles Técnicos del Entrenamiento de Redes . . . . . . . . . . . . . . . . 37
3.2.1. El Problema del Overfitting . . . . . . . . . . . . . . . . . . . . . . 37
3.2.2. El Proceso Completo de Entrenamiento . . . . . . . . . . . . . . . . 39
3.3. Análisis de Componentes Principales . . . . . . . . . . . . . . . . . . . . . 40
3.4. Tests Estadisticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.5. Medidas de Error y Fiabilidad . . . . . . . . . . . . . . . . . . . . . . . . . 44
3
4 ÍNDICE GENERAL
4. Resultados y Conclusiones 49
4.1. Resultados del Prototipo Inicial . . . . . . . . . . . . . . . . . . . . . . . . 49
4.2. Resultados Finales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.3. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
0.1. ABSTRACT 5
0.1. Abstract
The original goal of this work was to apply machine learning techniques to the study of
financial markets. We quickly discarded the problem of trying to predict the evolution of
the market itself, since this is a very well studied problem, and it is too complex for the
purposes of a final degree project. Instead, we were contacted by the company Talentum,
which proposed us to solve a problem they were currently facing.
Talentum is a startup company focused on automatic trading to operate on currency
exchange markets such as FOREX. They have a lot of automatic traders (that is, robots)
programmed using a wide variety of techniques, following the indications of experts from
different fields: mainly computer science, economy and mathematics, but also physics,
chemistry... etc. Since the Company’s foundation in February 2014, they have developed
and programmed more than a thousand robots, and so, as the number of available robots
scaled so quickly, their actual problem is deciding, at a given moment, which robots they
should use in their systems to operate in the market.
Their first approaches not being satisfactory, they proposed us the problem of designing
and implementing a system that could help them making that decision. That is, ideally,
the system should be able to predict the expected performance of every robot, and provide
metrics to an external agent developed by them, that will use this data to choose a subset
of robots to operate in a given situation. In order to achieve this goal, our software would
study the way that every robot had performed in the past, comparing the current market
situation with the one in which the robot operated previously (and concluding from the
result obtained then).
In order to solve the proposed problem, we have had to design, implement and combine
techniques from both computer-science and mathematics. The theoretical basis of most of
them are also included in this document. Particularly, the main techniques that we used
are:
Artificial Neural Networks. Artificial neural networks are computational models
inspired by the architecture of animals’ brain. It is a well known machine learning
technique, specially suited for problems related to pattern recognition. We use them
as the kernel of our system, using them for implementing predictors on the robots’
expected performance.
The Principal Component Analysis (PCA) is a statistical procedure that we
use for preprocessing the data extracted from the market, in order to reduce the
dimension of the data that models the market situation at a given moment. PCA uses
an orthogonal transformation to convert a possibly correlated set of observations into
a set of linearly uncorrelated ones.
Statistical hypothesis testing is a method of statistical inference to assess the
acceptance of a given hypothesis. We will use it as part of the process of choosing
the structure for each network.
Weighted least squares. The least squares problem consists on, given a set of
points in the plane, adjusting the line that minimizes the total error of calculating,
6 ÍNDICE GENERAL
using the line as a function of x, the y value for every point (x, y) in the set. We
will use a variation of that method, that allows us to assign different importances
to each point, as a method to fix the error made by our predictors.
The software that has been developed for this work has been programmed using the
Java programming language, along with some external libraries that implement some of
the more technical algorithms. For example, we have used Encog ([8]) for the algorithms
related to creation, training and execution of neural networks, and WEKA ([9]) for the
implementation of the Principal Component Analysis.
The document is structured as follows:
In the first chapter we make an introduction to financial market analysis, explaining
its two main branches: Fundamental analysis and technical analysis. On the one hand,
fundamental analysis is based on the belief that the price of shares doesn’t represent their
real value. Therefore, its goal is that of, using all possibly available information, knowing
the real value of the shares and therefore being able to buy or sell them efficiently.
On the other hand, technical analysis focuses on finding behavioral patterns in shares’
prices: Studying the behavior they had in the past, trying to predict their future changes.
After this introduction, we focus on technical analysis, which is the one directly related
to this work. We will present its principles and premises. We also introduce the two
main groups in which technical analysis techniques can be divided: Charts analysis and
bounders analysis, and give some sample techniques of both of them.
After this section, we make a brief introduction to the automatic trading, and to
Talentum, the company we have been working with. To end the chapter, we introduce in
more detail the problem we solved during this work.
In the second chapter we expose the solution we have developed, which can be summa-
rized as follows:The kernel of our system, i.e. the predictors, are implemented using neural networks.
The problem the network tries to solve is that of, considering the situation of the financial
market at a given moment, predicting the balance (whether positive or negative) a robot
is going to have.
For the network being able to solve this problem, we use the available information
about how the robot performed in the past. This way, when a new case comes, the network
will make its prediction based on similar situations whose result we already know1.
As modeling the state of the market can be very complex, and since we expect to have
a great deal of variables related to it, we have to apply some preprocessing to the data
before the neural network can use it efficiently. Firstly, we will reduce the dimensionality
of the data (that is, the number of variables) using the Principal Components Analysis.
Also, we will apply a normalization process before giving the data to the network. The
description and details of the whole process are given in the document.
1The given explanation is a really general idea of how a neural network actually works, we will give
the detailed procedure in the correspondent sections of this document.
0.1. ABSTRACT 7
After this overall vision, we explain in detail the steps that are followed through the
software. Those steps are:
Obtaining and processing the data. In this step we get the operations records
of our robot, and our aim is to obtain a set of test cases for training the neural
network. We also apply the principal component analysis and normalization.
Training our neural networks. We use the set of test cases obtained in the
previous step to train a new network that will make predictions about the robot’s
performance.
Running the system in real-time market. In this step we run the neural net-
work just trained. We have to get the real time market information from Talentum
databases and apply to them the same preprocessing procedures as with the trai-
ning data. Next, we can execute our networks and send the predictions and related
information to the agent that will control the robots.
Monitoring the results. Once our system is running in the real-time market, we
monitor the operations that are being done. Every time a robot makes an operation,
we update the estimation of the error and reliability for the network that controls
it. We also implement the functionality to check the predictions being made by the
networks at any given moment, and getting the operations that have been done up
to date.
In the third chapter, we review all the technical aspects of our work, including the
theoretical base of the principal component analysis, technical details related to the neural
networks training (such as the overfitting problem), etc.
Also in this chapter, we explain the whole estructure of the software developed for the
processes described above, both from the programming point of view (libraries, modules,
classes diagrams...) and the user’s point of view (that is, we show the user interface and
explain how to use it).
Finally, in the fourth and last chapter we present the results obtained from our work. In
a first section we introduce the results obtained from a first prototype, which run during
the past month of June and didn’t include any measure of the networks estimated error,
yet. In a second section we include the results obtained by the final prototype, which
has been running during last August, and included all the techniques covered by this
document. We analyze the results from both experiments, and compare them with the
results that would have been obtained by the same robots without using our system.
Finally, we give our conclusions for the work, as well as propose several future ways
to improve the software and results.
8 ÍNDICE GENERAL
Caṕıtulo 1
El Problema
1.1. El Análisis de los Mercados Financieros
1.1.1. El Análisis Fundamental y el Análisis Técnico
El análisis de los mercados financieros, o análisis bursátil, consiste en el estudio de los
activos del mercado financiero. Su objetivo consiste en obtener información anticipada
sobre la evolución de sus cotizaciones, de forma que se puedan realizas operaciones de
compra y venta en bolsa que arrojen beneficios. El contenido de esta sección está basado
principalmente en [1].
El análisis de los mercados se puede dividir en dos grandes ramas principales: El
análisis fundamental y el análisis técnico.
El análisis fundamental se basa en la creencia de que el mercado tiene una eficiencia
débil, es decir, que el precio de las acciones no es representativo de su valor. El analista
utiliza toda la información a su alcance sobre la empresa para realizar una estimación del
precio que considera correcto para las acciones de la misma, y realizar una compra o una
venta según piense que éstas están infravaloradas o sobrevaloradas. Realmente no hay una
forma completamente objetiva de valorar una acción, y por lo tanto varios analistas pueden
llegar a distintos resultados, concluyendo uno de ellos que la acción está infravalorada y
el otro que está sobrevalorada. Esto es lógico, por otra parte, ya que para que alguien
pueda comprar una acción otra persona debe querer venderla.
El análisis técnico, por el contrario, no plantea si las acciones están correctamente
valoradas, sino que busca patrones de comportamiento en la cotización de las acciones,
basándose en la historia de comportamientos de éstas, y trata con ellas de predecir mo-
vimientos futuros para obtener beneficios. El análisis técnico es un análisis más gráfico,
visual, y que se ayuda de unos indicadores u osciladores que proporcionan información
sobre tendencias.
Aunque se utilizan diversas herramientas, es especialmente común el uso de gráficos
que reflejen los movimientos de las cotizaciones. Al igual que ocurŕıa en el análisis funda-
mental, no se trata de una ciencia exacta, y ante los mismos datos dos analistas pueden
emitir opniniones contrarias.
9
10 CAPÍTULO 1. EL PROBLEMA
Podŕıa decirse que el análisis técnico es un análisis para el corto plazo mientras que
el análisis fundamental lo es para el largo plazo. Por ejemplo, aunque las previsiones de
una empresa sean buenos y ser esperable a largo plazo que su cotización suba, ésta puede
bajar a corto plazo debido a la toma de beneficios por parte de los inversores. Son patrones
como éstos de los que el análisis técnico trata de sacar partido.
De hecho, a menudo se combinan ambos análisis: El análisis fundamental indica qué t́ıtu-
los hay que comprar y cuáles hay que vender, mientras que el análisis técnico muestra el
momento exacto para realizar dicha compra o venta.
1.1.2. Los Principios y Métodos del Análisis Técnico
El análisis técnico, que como hemos comentado se basa en tratar de encontrar patrones
o tendencias en las cotizaciones, se basa en tres premisas:
Todo lo que puede afectar al precio de cualquier valor está descontado.
Los precios se mueven por tendencias. Existen tres tendencias:
• La tendencia primaria que engloba periodos anuales.
• La secundaria, con periodos mensuales o semanales.
• La terciaria con periodos diarios.
El mercado tiene memoria.
La primera premisa niega el principio básico del análisis fundamental, y asume que las
acciones no están sobrevaloradas ni infravaloradas, sino que reflejan su valor exacto. La
segunda refleja que el mercado se mueve por tendencias más largas o más cortas, y la
tercera premisa establece que lo que ocurrió en el pasado tiende a repetirse, y que por
tanto podemos usar los datos de éste para predecir los futuros.
Los métodos del análisis técnico pueden dividirse en dos grandes grupos: El análisis
chartista y el análisis por osciladores. El chartismo es un sistema basado únicamente en
el estudio de los gráficos. Supone que los movimientos de los precios son debidos a una
combinación de expectativas y sentimientos de los inversores, y que éstosactuarán de la
misma manera en el futuro de lo que lo hicieron en el pasado, por lo que trata de descubrir
patrones en las figuras que forman las evoluciones de los precios.
El análisis de osciladores, por otro lado, utiliza ecuaciones matemáticas para deter-
minar señales de compra o venta en los gráficos, utilizando como variable principal las
cotizaciones de los precios.
En las siguientes dos secciones se establecen ejemplos de uno y otro tipo de análisis.
1.1. EL ANÁLISIS DE LOS MERCADOS FINANCIEROS 11
1.1.3. Algunas Técnicas de Análisis Chartista
Un ejemplo de análisis chartista es establecer que el mercado, respecto a un determi-
nado t́ıtulo, puede encontrarse en una tendencia alcista o bajista. Aśı, basándonos en los
comportamientos de la cotización en el pasado para situaciones similares, podemos esta-
blecer que pasará determinadas fase prefijadas. Por ejemplo, en el caso de encontrarnos
con un t́ıtulo con una tendencia alcista (Figura 1.1) podemos distinguir las siguientes tres
fases:
Fase de Acumulación. El análisis fundamental establece predicciones de bajada y
los inversores venden sus acciones al no ver una rentabilidad satisfactoria. Sin em-
bargo, los operadores de Bolsa con más información comienzan a comprar acciones
lentamente (a acumularlas) y el recorrido del precio es horizontal con una ligera
tendencia alcista.
Fase de Expansión. Se confirma la mejora de los datos, que llegan al público ge-
neral, y se produce la compra masiva de t́ıtulos, por lo que se eleva rápidamente
su cotización y produciendo altas rentabilidades, que a su vez motiva de nuevo la
compra.
Fase de Distribución. El público general compra gran cantidad de t́ıtulos hasta que
el mercado alcanza un punto en el que ya no crece. Algunos inversores venden para
recoger beneficios y otros compran estos t́ıtulos animados precisamente por estas
rentabilidades obtenidas, lo que hace que el precio crezca y baje ligeramente.
Figura 1.1: Tendencia Alcista: IBEX-35 desde 1996 hasta mitad del año 1998. [1]
12 CAPÍTULO 1. EL PROBLEMA
Y de la misma forma, una vez estabilizada su cotización, puede producirse a continua-
ción una tendencia bajista, que de nuevo podemos dividir en tres fases principales (Figura
1.2):
Fase de Distribución. Coincide con la última fase del mercado alcista. Se producen
algunas compras y ventas sin mucha rentabilidad, lo que hace que los inversores
comiencen a buscar alternativas en otros mercados.
Fase de Pánico. Cuando se percibe el efecto de las ventas, comienza un pánico
muchas veces no justificado por los datos fundamentales y los inversores comienzan
a querer vender, por lo que el precio cae abruptamente, y aunque puede haber ligeras
subidas la tendencia es bajista.
Fase de Consolidación. Finalmente la bajada comienza a atenuar y se vuelve a los
recorridos horizontales, hasta que acaba la tendencia bajista.
Figura 1.2: Tendencia Bajista: IBEX-35 durante el año 2000. [1]
De esta forma, asumiendo que el mercado se va a comportar de acuerdo a estos patrones
y fases, el conocedor de las técnicas de análisis chartista podŕıa decidir los momentos
adecuados para comprar y vender sus t́ıtulos obteniendo altas rentabilidades.
1.1.4. Algunas Técnicas del Análisis de Osciladores
El ejemplo más sencillo de oscilador (y uno de los más utilizados) es la media móvil.
La media móvil de un periodo es el promedio de los precios de un determinado t́ıtulo
1.1. EL ANÁLISIS DE LOS MERCADOS FINANCIEROS 13
durante ese periodo. Al suavizar la curva de precios, constituye una forma más sencilla
de observar las tendencias del mercado.
Además, una técnica para obtener señales de compra o de venta seŕıa observar cuándo
la gráfica de la cotización del valor corta la gráfica formada por la media móvil, lo que
indicará que el mercado está sufriendo una tendencia bajista o alcista a corto plazo.
Por ejemplo, si una cotización ascendente corta la media móvil significa que el precio ha
ascendido de forma más rápida de lo normal, por lo que es de suponer que nos encontramos
ante una tendencia alcista y ésta seguirá subiendo, por lo que es conveniente comprar.
Podemos encontrar un ejemplo de este procedimiento en la figura 1.3. En ella, se muestran
las medias móviles de 14 d́ıas (ĺınea continua) y de 150 d́ıas (ĺınea discontinua). Aśı,
cuando la cotización corta la media que usemos como referencia, se producirá una orden
de compra (señaladas con un 1) o una orden de venta (señalada con un 2).
Figura 1.3: Medias Móviles: Cotización del BBVA durante el año 2000. Medias móviles de
14 d́ıas (ĺınea continua) y de 150 d́ıas (ĺınea discontinua). Se ha señalado con un 1 señales
de compra, y con un 2 señales de venta. [1]
Pese a la simplicidad de este método, existen varias modificaciones. Por una parte, tomar
medias móviles de periodos más largos o más pequeños vaŕıa el riesgo y la rentabilidad
esperada: Tomando medias móviles más largas las tendencias que detectemos serán más
seguras pero de menor rentabilidad que con medias móviles más cortas.
Existen por otra parte muchas variaciones y mejoras a este método, que van desde el
uso de varias medias móviles simultáneamente (para detectar por ejemplo los cortes entre
ellas en lugar de con la cotización) hasta otras formas de calcular estas medias, dando por
ejemplo más importancia a las cotizaciones más recientes.
14 CAPÍTULO 1. EL PROBLEMA
Existen otras técnicas más complejas basadas en ideas matemáticas, como son por
ejemplo las Bandas de Bollinger, que utiliza la regla estad́ıstica de las tres sigmas, que
establece que el 99 % de una distribución normal está comprendida entre la media menos
tres veces la desviación t́ıpica y la media más tres veces la desviación t́ıpica. Por tanto, la
técnica se basa en que si la cotización alcanza la cota dada por la media móvil más tres
veces su desviación t́ıpica, es de esperar que su precio comience a caer y emitimos una
orden de venta, y si la cotización alcanza la media móvil menos tres veces su desviación
t́ıpica emitimos una de compra. Un gráfico reflejando esta técnica podemos encontrarlo
en la figura 1.4. En ella, encontramos las bandas de Bollinger referidas a la media móvil
de 20 d́ıas. Cuando la cotización alcanza la banda superior, se espera que posteriormente
caiga, por lo que nuestra acción será de venta, mientras que si la cotización alcanza la
banda inferior emitiremos una señal de compra.
Figura 1.4: Bandas de Bollinger: Cotización de la empresa Altadis durante el año 2000.
[1]
1.2. Traders Automáticos y Talentum
Los sistemas de trading automatizados, o traders automáticos permiten establecer una
serie de reglas automáticas que dictan cuándo realizar una operación y cuándo cerrarla,
de forma que ésta se ejecute de forma autónoma sin intervención humana posterior. Las
reglas que en éstos se programan pueden ser relativamente sencillas, como las medias
móviles que vimos anteriormente, o mucho más complejas.
1.3. PROBLEMA PROPUESTO 15
Los sistemas automáticos han ido tomando mucha fuerza los últimos años. Entre sus
ventajas se encuentra la rapidez a la que puede detectar y realizar las operaciones, la
facilidad de diversificación o el hecho de que evitar que las emociones del broker influyan
en las decisiones del sistema. Como desventajas, por otra parte, podŕıan citarse los posibles
fallos mecánicos o la necesidad de monitorización.
Talentum es una empresa dedicada precisamente a este campo. Fundada en Febrero del
2013, Talentum se dedica principalmente al estudio y desarrollo de sistemas automáticos
para invertir en bolsa. Cuenta con profesionales de distintas ramas, principalmente eco-
nomistas, informáticos, qúımicos y matemáticos, cuyas técnicas espećıficas combinadas se
programan en los robots.
En la actualidad, Talentum cuenta con más de 1.000 robots programados y optimizados
con distintos parámetros para diferentes divisas. Por el momento,los robots de Talentum
operan únicamente en el mercado FOREX (cambio de divisas). Han comercializado por
separado varios de sus robots, como Ulysses o Helena. Sin embargo, su producto estrella
es Diana, un sistema de trading automático consistente en un conjunto de 5 robots que
rotan cada cierto tiempo dependiendo de las condiciones del mercado. [2]
1.3. Problema Propuesto
Como hemos comentado, Talentum posee más de 1.000 robots capaces de operar en
bolsa, basados en diferentes técnicas y algoritmos. En la mayoŕıa de sus sistemas, como
Diana, no se utilizan de forma independiente, sino que se toma un subconjunto de robots
para que operen a la vez. De forma, se logra que las pérdidas se compensen entre ellos y se
diversifican las operaciones, lo que permite minimizar el riesgo. Además, su sistema Diana
cambia los robots que operan cada poco tiempo, de forma que es capaz de adaptarse a
los cambios que se produzcan en el mercado, y retirar los robots que no funcionen bien y
sustituirlos por otros que, presumiblemente, lo harán mejor.
En ese punto, la empresa se encontraba ante un problema que no hab́ıan logrado resolver
satisfactoriamente: La elección del subconjunto de robots para operar en cada momento.
La aproximación que hab́ıan realizado hasta entonces, consistente en simular los resultados
que hubieran tenido todos los robots la semana anterior, y elegir aquellos que lo hubieran
hecho mejor, no daba buenos resultados. Esto era debido a que la situación del mercado,
especialmente del de divisas y operando a corto plazo, es muy cambiante de una semana
a la siguiente.
Por tanto, el problema que se propuso para la realización de este trabajo fin de grado
fue dar a Talentum criterios para poder elegir con mayor efectividad qué robots elegir
para que operen en cada momento. Para ello, nuestra idea básica era utilizar los resultados
pasados de cada robot en situaciones del mercado similares para tratar de predecir cómo
se comportarán en la situación actual.
Aśı, deb́ıamos desarrollar unos “predictores” que nos proporcionen información sobre los
resultados que tendrá un robot concreto si operara en el momento actual. Esta información
16 CAPÍTULO 1. EL PROBLEMA
seŕıa entonces utilizada por un agente externo de Talentum, que con sus propios criterios
decidiŕıa qué robots utilizar.
Además del sistema básico de realización de predicciones sobre el desempeño de un
robot, incorporamos otros mecanismos para estimar los errores que cometemos en las
mismas, de forma que diéramos al agente externo la mayor cantidad de información posible
para realizar sus decisiones.
Por tanto, nuestro objetivo final es implementar un sistema que nos proporcione predic-
ciones sobre el rendimiento de cada robot, junto con una medida de la fiabilidad de esta
predicción. Todo ello será interpretado por un agente externo que elegirá un determinado
conjunto de robots en para que operen en cada momento, en función del riesgo deseado.
Caṕıtulo 2
Desarrollo de la Solución
2.1. Solución Propuesta
2.1.1. Visión General
Puesto que nuestro objetivo es lograr hacer predicciones sobre el resultado que tendrá un
robot puesto a operar sobre el mercado, el núcleo de nuestro sistema lo constituirán los
predictores. Un predictor es un elemento relativo a un robot concreto, que basándose en
su historial de operaciones realizará sus predicciones. Además, estableceremos otra capa
superior al predictor que nos proporcionará una medida de la fiabilidad de las predicciones
realizadas por éste en cada momento.
Toda esta información de cada robot será utilizada por un agente externo para ele-
gir qué robots dejar operar en bolsa y cuáles no. El esquema de esta estructura puede
encontrarse en la figura 2.1.
La principal decisión que marcaŕıa gran parte del diseño posterior consist́ıa en qué técni-
ca de inteligencia artificial utilizar para implementar los predictores. En nuestro caso, de-
cidimos utilizar redes neuronales porque, a pesar de ser suficientemente sencillas para la
profundidad de un trabajo fin de grado, esperábamos que fueran suficientemente flexibles
para resolver satisfactoriamente el problema para cada robot. Además, tienen la ventaja
de ser suficientemente eficientes en su ejecución para poder utilizarlas operando en tiempo
real.
Una red neuronal artificial es un modelo matemático no lineal, de naturaleza compu-
tacional, con una arquitectura inspirada en la organización neuronal biológica ([3]). Es
decir, puede verse como una estructura en red consistente en un número de neuronas
(nodos) conectadas por enlaces direccionales ([4]).
En ella, cada nodo es una unidad de procesamiento independiente, que calcula un valor
de salida a partir de una serie de valores de entrada. La forma en la que estos valores
de entrada se utilizan para dar lugar a la salida depende de una serie de parámetros
espećıficos de cada nodo. Para que la red pueda resolver un determinado problema, se
modifican estos parámetros de acuerdo a ciertos algoritmos, denominados algoritmos de
entrenamiento. De esta forma, la red puede “aprender” para adaptarse a resolver un
17
18 CAPÍTULO 2. DESARROLLO DE LA SOLUCIÓN
Figura 2.1: Estructura básica general del sistema.
determinado problema. La figura 2.2 muestra un diagrama básico de la composición de
una red neuronal.
Aśı, el objetivo de nuestro software será conseguir obtener redes neuronales capaces de
predecir el comportamiento de cada robot, y utilizar éstas para obtener información sobre
su desempeño esperado, que proporcionaremos a un agente externo para que las controle.
2.1.2. Redes Neuronales como Predictores
Introducción y Conceptos Básicos
Las redes neuronales artificiales son especialmente útiles en problemas complejos o difi-
ciles de definir con precisión. En estos casos, el diseño de una función o método espećıfico
para resolver el problema resulta impracticable. También es una técnica muy común en
casos en los que la función es desconocida, pero contamos con bastantes casos en los que
conocemos de resolución correcta del problema.
Por ejemplo, las redes neuronales son muy comunes en problemas de reconocimiento de
patrones: Escritura a mano, reconocimiento facial, etc. En ellos, pese a que no podemos
diseñar o programar un conjunto de reglas o un software concreto para resolver cada
caso, en el caso de tener suficientes ejemplos del patron que queremos detectar, las redes
neuronales proporcionan muy buenos resultados en la detección de casos nuevos. Antes
de que una red neuronal pueda resolver un problema concreto, debemos someterla a un
proceso previo, conocido usualmente como aprendizaje o entrenamiento.
2.1. SOLUCIÓN PROPUESTA 19
Figura 2.2: Diagrama básico de red neuronal y neuronas.
El problema que estamos tratando de resolver es un problema de regresión. Es decir,
tenemos una función desconocida, que en nuestro caso recibe como entrada la información
del estado del mercado en un momento dado, y proporciona como salida la ganancia futura
del robot cuando se activa en ese estado del mercado. Lo que realiza la red neuronal es, a
partir de una serie de casos de ejemplo, crear un modelo de esa función desconocida. El
proceso de aprendizaje consiste en ajustar esta función que implementa la red neuronal
para reducir el error entre la salida obtenida y la deseada para el conjunto de ejemplos
en los que conocemos la resolución del problema. Si los datos que utilizamos para este
aprendizaje son representativos de todas las posibles entradas, y el modelo que implementa
la red se ajusta bien a esos datos conocidos, esperamos que lo haga también para los
desconocidos.
Hay distintos tipos de redes neuronales dependiendo del número y distribución de sus
neuronas y de los enlaces entre ellas, y a su estructura se le denomina usualmente to-
poloǵıa de dicha red. Podemos distinguir en ella tres tipos de nodos o neuronas: De
entrada, que reciben la información del exterior, de salida,que proporcionan sus resulta-
dos al exterior, y ocultas, que reciben y env́ıan sus variables a otros nodos de la propia
red.
Por otra parte, denominamos variables de entrada a aquellas que reciben las neuronas
de entrada del exterior de la red, y variables de salida a las que proporcionan al exterior
de la red las neuronas de salida. La forma de calcular la salida de cada neurona en función
de sus entradas queda determinada por variables denominadas pesos, relativos a cada uno
de sus enlaces.
Podemos ver gráficamente los distintos tipos de neuronas y variables, aśı como su los
tipos de capas, en la figura 2.3.
Todas estas neuronas, a su vez, se distribuyen en capas. Decimos que un nodo está en
la capa n cuando el mı́nimo número de neuronas entre ésta y una neurona de entrada es
n. Dicho de otro modo, las neuronas de entrada se encuentran en la capa 0, las nneuronas
20 CAPÍTULO 2. DESARROLLO DE LA SOLUCIÓN
Figura 2.3: Tipos de neuronas y capas de una red neuronal.
a las que se conectan éstas estan en la capa 1, las que se conectan a estas otras estan en
la capa 2, etc. Si bien las redes neuronales pueden tener topoloǵıas muy diversas, las más
comunes tienen tres capas: una de entrada, una capa oculta y una de salida, y no tienen
ciclos.
Entrenamiento de una Red Neuronal
El proceso completo que se realiza para obtener una red neuronal para resolver un
problema en concreto, se divide en dos fases. En la primera, se deciden las caracteŕısticas de
la red que emplearemos: Variables de entrada, número de capas y de neuronas, distribución
de las mismas... etc., es decir, su topoloǵıa. En una segunda fase, se entrena una red con
la topoloǵıa elegida, que será la que obtendremos como resultado final del proceso.
El procedimiento de la primera fase consiste en partir de un conjunto de posibles topo-
loǵıas, elegidas a priori, y tras un proceso de experimentación, elegir aquella que propor-
cione mejores resultados. Es decir, en primer lugar elegimos un conjunto de topoloǵıas,
definiendo las entradas que recibirá nuestra red, cubriendo un espectro que consideremos
suficiente.
A continuación realizamos una cierta cantidad de experimentos para cada posible to-
poloǵıa que nos planteemos utilizar para nuestro problema. Estos experimentos consisten
en entrenar una red con esas caracteŕısticas y evaluarlas1. Aśı, veremos los resultados que
obtenemos para una serie de redes entrenadas con una determinada configuración, calcu-
laremos su media, y ésta será la medida que emplearemos para comparar esta topoloǵıa
con las demás.
Sin embargo, es importante tener en cuenta que es usual que distintas topoloǵıas
1En este caṕıtulo pretendemos únicamente de dar una idea general de la solución propuesta en nuestro
trabajo, sin entrar en excesiva profundidad. Por ello, los detalles técnicos relativos al entrenamiento,
validación y test de las redes podemos encontrarlos en la sección 3.2
2.1. SOLUCIÓN PROPUESTA 21
den resultados similares, y corremos el riesgo de que la elección de una u otra se deba
únicamente a los resultados de ese conjunto concreto de experimentos realizados, y ésa
no sea la tendencia general. Para evitarlo, debemos no tener en cuenta únicamente que
la media de unos resultados sea mayor que otra, sino que debemos establecer que esta
diferencia sea estad́ısticamente significativa.
Que un resultado sea estad́ısticamente significativo significa que podemos asegurar
con una cierta probabilidad, normalmente el 95 % ó 99 %, que el resultado obtenido no es
producto del azar. Es decir, que realmente una topoloǵıa es mejor que la otra, y aunque
realizáramos más experimentos es de esperar que se mantenga ese resultado. En el caso
de que la diferencia entre el uso de dos topoloǵıas no sea estad́ısticamente significativa,
elegiremos aquella que sea más sencilla (menor número de neuronas, menor número de
variables de entrada...).
Para determinar si efectivamente existe significancia estad́ıstica en la diferencia en-
tre las medias de las dos series de experimentos debemos realizar un test estad́ıstico
adecuado. El procedimiento y la base teórica de los mismos se detallan en la sección 3.4.
Para terminar, una vez elegida la topoloǵıa que utilizaremos, se procede al entrena-
miento de una red con dicha configuración, que será nuestra red final.
Los detalles técnicos del procedimiento de ambas fases puede encontrarse más detalla-
damente en la sección 3.2, en la que también se recoge el proceso completo de experimen-
tación con las distintas topoloǵıas y entrenamiento de la red final, aśı como el proceso de
test de las redes resultantes, cuyo objetivo es tener una estimación del comportamiento
que tendrá la red cuando opere con casos nuevos.
2.1.3. El Procedimiento Completo
Como hemos visto, para obtener una red neuronal que pueda actuar de predictor hace
falta tener una serie de casos conocidos con los que poder entrenarla. En nuestro caso,
puesto que nustro objetivo es utilizar la red para predecir cómo será el desempeño del robot
conociendo la situación del mercado actual, debemos tener una serie de casos pasados en
los que conozcamos el desempeño que tuvo y la situación del mercado en dicho momento.
Esta serie de casos la obtendremos a partir del histórico de operaciones del robot. Es
decir, cada vez que en el pasado el robot realizó una operación en el mercado, sabemos
qué resultado tuvo y conocemos la situación del mercado en ese momento, por lo que a
partir de este histórico podemos obtener casos para entrenar nuestra red.
No obstante, hay que tener en cuenta que modelizar la situación del mercado puede
ser bastante complejo. Existen gran cantidad de factores que podemos tener en cuenta:
Cotizaciones de la divisa en la que opera el robot, cotizaciones de otras divisas, otros
factores como el d́ıa de la semana o la hora en las que se realizó la operación, etc., y nos
interesaŕıa utilizar la mayor cantidad de ellos posible, siempre y cuando sean relevantes.
Para que el uso posterior de estos datos sea efectivo, se hace necesario establecer un
tratamiento previo de los datos que nos permita eliminar redundancias e información
no relevante, y reducir la dimensión de la información en la medida de lo posible, es
decir, reducir el número de variables de entrada. Esto, además, permitirá mejorar los
resultados de las redes, que sólo recibirán la información relevante, y por tanto podrán
22 CAPÍTULO 2. DESARROLLO DE LA SOLUCIÓN
dar mejores resultados con una estructura menos compleja. Para esta etapa previa de
reducción de la dimensión de la entrada utilizaremos el algoritmo del análisis principal
de componentes (PCA, por sus siglas en inglés), que se detalla en la sección 3.3.
Por otra parte, una vez tenemos nuestra red entrenada, podemos ponerla a operar
en el mercado real y monitorizar su rendimiento. Además, estableceremos medidas para
controlar la precisión esperada de la red en cada momento, permitiendo a quien utilice
sus predicciones controlar el riesgo. Este sistema de control de la fiabilidad de la red se
expone en la sección 3.5.
Por último, y como resumen de todo lo anteriormente expuesto, tenemos que podemos
dividir nuestro proceso en las siguientes etapas principales: Obtención y tratamiento
de los datos, elección de la topoloǵıa de la red y entrenamiento, puesta en
marcha en el mercado real y monitorización y fiabilidad.
Un diagrama de estas etapas, con los productos obtenidos en cada una de ellas y las
técnicas utilizadas en cada fase, puede encontrarse en la figura 2.4.
Figura 2.4: Diagrama general del sistema completo.
2.2. Etapas del Proceso
2.2.1. Obtención y Tratamiento de los Datos
En esta etapa partimos del histórico de operaciones del robot, y nuestro objetivo será ob-
tener una serie de casos de prueba para poder realizar el entrenamiento de la red neuronal
que proporcionará predicciones sobre él. Recordemos que un caso de prueba consiste en
una entradapara el problema cuya salida es conocida. En nuestro caso, la entrada consiste
en la situación del mercado en el momento de producirse la operación, y la salida consiste
en el resultado que tuvo ésta.
Aśı, debemos definir en un primer lugar cómo modelizaremos la situación del mercado
en momento concreto. Dado que cada robot puede operar en una divisa distinta, siguiendo
diferentes estrategias y utilizando distintos datos, debemos poder modelizar la situación
del mercado de manera diferente para cada uno de ellos. Por tanto, nuestro software nos
permitirá definir qué información de entrada queremos utilizar en cada caso para reflejar
2.2. ETAPAS DEL PROCESO 23
el estado del mercado, y realizar de esta forma una modelización del mercado diferente
para cada robot.
La información más básica que podemos utilizar para reflejar la situación del mercado,
que esperamos que sea relevante para nuestra predicción, son los datos relativos a la
divisa sobre la que opera el robot. Utilizaremos por tanto los datos sobre la cotización de
esta divisa en un intervalo de tiempo determinado anterior a la solicitud de apertura de
la operación. Éstos vienen agrupados según periodos de tiempo de distintas longitudes,
denominados velas. Es decir, una vela es la información agrupada de un determinado
periodo de tiempo de una divisa concreta, y tiene 4 atributos principales: El precio que
teńıa la divisa al inicio del periodo, el que teńıa al final del mismo, y el máximo y mı́nimo
precio alcanzado en éste.
Las velas pueden tener distintas longitudes, y en nuestro software utilizaremos princi-
palmente velas de 4 tipos: De 5 minutos, de 15 minutos, de 1 hora y de 1 d́ıa.
Además de la información básica de las velas de la divisa en la que opera nuestro robot,
nuestro software permite añadir otra información adicional, como velas de otras divisas,
el d́ıa de la semana o la hora a la que se realizó la operación, e incluso otros indicadores
macroeconómicos, como son el precio del petróleo o del oro.
Con estos últimos indicadores logramos que, pese a que el robot tiene una visión muy
local del mercado (opera con una divisa y utiliza únicamente las cotizaciones de ésta para
determinar su comportamiento), nuestro sistema lo controla utilizando información mucho
más global. De esta forma, podemos identificar tendencias a nivel mundial, modificando
el comportamiento final del robot en base a si ciertos indicadores del mercado global
presentan tendencias alcistas o bajistas, por ejemplo.
Por último, es importante resaltar que únicamente podremos utilizar información an-
terior al momento de apertura de la operación. Esto es aśı debido a que las redes
se utilizarán finalmente para predecir el resultado de la operación antes de que se inicie,
por lo que evidentemente debemos utilizar únicamente información que vayamos a tener
disponible en ese momento.
A continuación, una vez elegida la información que queremos utilizar como entrada de
nuestro problema, podemos formar los casos de prueba a partir del histórico de operaciones
del robot, que nos servirán para entrenar la red.
Obtenemos aśı un fichero con ejemplos de entrada y salida de nuestro problema, siendo
la entrada la modelización del mercado en el momento de apertura de una operación, y
la salida el resultado que tuvo ésta.
Aunque podŕıamos utilizar directamente este fichero para entrenar nuestras redes, en-
contramos que la entrada es demasiado compleja: Por una parte, hay una gran cantidad de
información, mucha de ella redundante o muy parecida, y por otra, como cada robot opera
en distintas situaciones, puede haber información que sea útil en unos robots y redundan-
te en otros, y no tenemos forma de saberlo a priori. Esta excesiva complejidad provoca
que la red tenga muchas más dificultades para aprender y generalizar correctamente el
problema, por lo que trataremos de reducirla.
24 CAPÍTULO 2. DESARROLLO DE LA SOLUCIÓN
Para ello, como comentamos en la sección anterior, emplearemos el algoritmo del Análi-
sis Principal de Componentes. Este algoritmo permite combinar las distintas variables
de entrada para mantener la información más importante, y descartar aquella que sea re-
dundante o poco significativa. Aplicando este proceso a nuestro conjunto de casos de
prueba anterior, logramos reducir en la mayoŕıa de los casos de unas 150 ó 200 entradas, a
tan sólo 20 ó 25, lo que constituye una reducción de alrededor del 80 u 85 % en el número
de entradas.
Esto además permite que aunque añadamos información nueva que finalmente resulte
ser redundante, esto no repercutirá demasiado negativamente en los resultados finales,
puesto que será eliminada por este último procedimiento. Aśı, podemos añadir gran can-
tidad de información en un principio, y dejar que este paso la reduzca, eliminando la que
sea redundante o poco significativa.
Para finalizar el proceso aplicamos un proceso de normalización a los datos. Si bien en
la teoŕıa esto no es necesario, debido a que las redes pueden reescalar cualquier transfor-
mación lineal realizada a los datos, en la práctica lo usual es realizar la normalización.
El motivo principal es que para la inicialización de las redes (los valores iniciales que se
dan a los pesos antes de comenzar el proceso de entrenamiento) deben estar escalados
de acuerdo a los rangos de valores de entrada, para facilitar la convergencia y reducir la
probabilidad de caer en mı́nimos locales. Por tanto, como en general se utilizan valores
aleatorios pequeños para los pesos, es conveniente normalizar la entrada a valores también
cercanos a 0. En nuestro caso, como se recomienda en general, utilizaremos como rango
de normalización el intervalo [−1, 1].[12]
El proceso de normalización consiste simplemente en un cambio de variable lineal, que
transforma una variable de entrada cuyos valores se encuentran en el intervalo [xmin, xmax]
en otra que se encuentra entre los valores [−1, 1], según y = 2(x−xmin)
xmax−xmin − 1.
Con todo esto, obtenemos finalmente unos casos de prueba preprocesados adecuados
para el entrenamiento de las redes en la siguiente fase.
2.2.2. Entrenamiento de Redes Neuronales
Con los casos de prueba procesados en la fase anterior, nuestro objetivo en esta fase
será obtener una red entrenada capaz de predecir el desempeño de nuestro robot. Como
hemos comentado, esta fase se puede dividir a su vez en dos etapas: En una primera
elegimos la topoloǵıa de nuestra red, y en una segunda fase entrenamos la red final que
utilizaremos para controlar el robot.
El proceso básico empleado es el usual cuando se trabaja con redes neuronales, que
hemos expuesto anteriormente: En primer lugar se plantean diversas topoloǵıas posibles,
con distinto número y tipo de entradas, distinto número de neuronas y distribución, etc.
A continuación se realiza un determinado número de entrenamientos y experimentos para
cada posible configuración, y finalmente se elige aquella que arroja mejores resultados,
asegurándose de que la diferencia sea estad́ısticamente significativa. Por último, se entrena
una red final con dicha topoloǵıa2.
2De nuevo, recordamos que los detalles del proceso pueden encontrarse en la seccion 3.2
2.2. ETAPAS DEL PROCESO 25
No obstante, debido a las caracteŕısticas de nuestro problema y situación, hay varios
factores que no son comunes al proceso usual de entrenamiento descrito.
El primero es debido a que Talentum optimiza los robots utilizando su histórico de
operaciones, es decir, utilizan para modificar el robot precisamente los mismos datos que
utilizaremos nosotros. Es decir, ajusta sus parámetros y comportamiento de forma que sus
resultados si hubiera operado en el pasado sean buenos, esperando que de esta forma sean
buenos también en el futuro. Esto implica que la situación que encontramos en el histórico
de operaciones es probable que no sea la misma que encontrará posteriormente el robot
cuando sea puesto en funcionamiento.Presumiblemente, los resultados que obtendrá el
robot en tiempo real serán peores que los que se reflejan en su histórico, puesto que éste
ha sido programado de forma que los resultados de su histórico sean buenos.
De hecho, si observamos el histórico de resultados de algún robot, solemos encontrar
que sus ganancias totales son muy altas, y hay muchas más operaciones que producen be-
neficios que que producen pérdidas. En el mercado real, por el contrario, esperamos que el
balance del robot sea mucho peor, y que encontremos aproximadamente el mismo número
de operaciones con ganancias que con pérdidas. Si utilizáramos como entrenamiento los
casos extraidos directamente del histórico de operaciones corremos el riesgo de que nues-
tra red sea demasiado permisiva, es decir, que se adapte para ajustar correctamente los
casos positivos (que son la mayoŕıa), aunque se equivoque en bastantes casos negativos.
Para evitar esto, debemos modificar el conjunto de entrenamiento para que se ajuste
en lo posible a la situación que esperamos encontrar en realidad. Es decir, debemos modi-
ficarlo de manera que las ganancias se equiparen aproximadamente con las pérdidas, para
que nuestra red “aprenda” correctamente la misma situación para la que posteriormente
la utilizaremos. Para ello, nuestra solución ha sido replicar las operaciones que produjeron
pérdidas hasta que el balance total de pérdidas equipare al de ganancias. De esta forma,
tenemos una situación resultante en la que el balance total es aproximadamente 0, y la
importancia de las operaciones negativas está mucho más cerca de la importancia de las
operaciones positivas. Aśı, esperamos que nuestra red se adapte bien a ajustar ambos
casos.
La segunda modificación se refiere al criterio que utilizamos para elegir una u otra to-
poloǵıa en la primera fase. Es común elegir criterios basados únicamente en la precisión
de la predicción, como la diferencia entre los valores predichos y los valores correctos, o
el error cuadrático medio (MSE). Sin embargo, debido al uso que se dará posteriormente
a las predicciones, ninguna de estas medidas resultaba adecuada. En concreto, estos mo-
delos de error penalizan de la misma forma un error entre haber predicho 15$ cuando en
realidad eran 20$, y haber predicho 3$ cuando en realidad eran -2$. Es de suponer que al
agente que vaya a realizar la decisión entre elegir una u otra red, la segunda diferencia le
resultará mucho más relevante.
Por ello, decidimos estudiar una medida de evaluación de la red neuronal alternativa
para esta fase, diseñando otra más parecida al uso que daremos posteriormente a las
predicciones. En ella, supondremos que el agente externo elegirá para que operen todos los
robots para los que nuestra predicción sea positiva, es decir, todos aquellos que predigamos
26 CAPÍTULO 2. DESARROLLO DE LA SOLUCIÓN
que van a obtener ganancias. Aśı, simularemos qué hubiera ocurrido si un determinado
conjunto de operaciones se hubieran realizado bajo la supervisión de nuestro sistema, y
cuál habŕıa sido el balance total del robot en ese periodo, comparándolo con aquel que
habŕıa obtenido sin nuestra intervención. Es decir, tomamos la suma del balance obtenido
en todas las operaciones para los que la predicción de nuestra red es positiva, y la diferencia
de ésta con la suma del balance total de las operaciones elegidas será nuestra medida de
error para esa red.
Tras realizar diversos experimentos con las redes obtenidas utilizando este método y los
anteriores, comparamos sus resultados. De esta forma obtuvimos que las redes entrenadas
con las topoloǵıas elegidas utilizando esta última medida de error daban resultados más
precisos cuando las utilizábamos con datos que no hubieran sido utilizados ni para el
entrenamiento ni para la optimización de los robots. Por ello, decidimos utilizar esta
última medida de error descrita para nuestro sistema.
Tras todo lo anterior, y una vez elegida la topoloǵıa de la red, procedemos a la segunda
fase. En ella, entrenamos una única red final con esta configuración elegida, que será la
red final que utilizaremos como predictor para ese robot en nuestro sistema.
2.2.3. Puesta en Marcha a Mercado Real
En esta sección describiremos el proceso de ejecución de las redes neuronales entrenadas,
y la comunicación con el agente externo para proporcionarle sus predicciones. Este agente
externo será un sistema de Talentum ya existente denominado Zeus.
Zeus es un software desarrollado para controlar la gestión del riesgo de los sistemas de
Talentum. Es capaz de controlar las operaciones realizadas por cualquier conjunto de ro-
bots, y de denegar o autorizar cualquiera de sus operaciones en el momento en que el robot
solicite realizarla. Nuestro software, por tanto, se comunicará con Zeus proporcionándole
información de las predicciones sobre cada robot. Además, cada vez que un robot quiera
realizar una operación, debe consultar a Zeus, que autoriza o deniega su entrada teniendo
en cuenta nuestras predicciones.
Las estrategias que implemente Zeus para controlar a los robots en base a nuestras
predicciones pueden ser muy diversas, dependiendo de las directrices de los expertos de
Talentum, e incluso de las preferencias de inversores concretos en cuanto a beneficio
deseado y niveles de riesgo admitidos. No obstante, para realizar las pruebas de nuestro
sistema y evaluar su rendimiento, hemos implementado dos estrategias básicas.
La primera, utilizada antes de la implementación de los sistemas de estimación de
errores, consiste simplemente en dejar operar aquellos robots para los cuales nuestra pre-
dicción sea positiva. Es decir, permitir todas aquellas operaciones que predigamos que van
a resultar en beneficios.
La segunda estrategia, también bastante sencilla, pero realizada una vez incorporamos
el sistema de control del error, consiste en dejar pasar aquellas operaciones que, aún
contando con el error que estimemos en la predicción, sigan superando un cierto umbral.
Este umbral, en nuestro caso, lo ajustamos utilizando los resultados que tuvimos durante
el periodo en que la utilizábamos sólo la primera estrategia recién descrite. Aśı, elegimos
el umbral que maximizaba las ganancias en el caso de que el sistema de fiabilidad y esta
2.2. ETAPAS DEL PROCESO 27
segunda estrategia hubieran estado implementados en ese periodo. El umbral resultante
obtenido por este procedimiento fue en nuestro caso de 2$. Por tanta, nuestra estrategia
en este caso consistirá en permitir las operaciones cuya aproximación una vez tenida en
cuenta la corrección del error sea superior a este umbral.
Por otra parte, para realizar nuestras predicciones debemos obtener los datos del mer-
cado en tiempo real: Cotizaciones de todas las divisas en forma de velas, otros indicadores
como el precio del petróleo o el oro... etc. Nuestro software ha sido implementado para
obtener todos estos indicadores de bases de datos habilitadas por Talentum, en las que en
periodos de tiempo de 5 minutos se almacena información actualizada del mercado global.
La información se combina de forma que coincida con la modelización de la situación
del mercado que realizamos para cada robot en la fase de obtención de los casos de
entrenamiento. Además, le aplicamos los mismos pasos que realizamos para la obtención
de dichos casos, es decir, es análisis principal de componentes y la normalización.
Tras este preprocesamiento, podemos utilizar los datos resultantes como entrada de la
red asociada, que nos devolverá la predicción. Por último, obtenemos la fiabilidad asociada
en ese momento a esta red, y suministramos toda esta información a Zeus.
2.2.4. Monitorización y Fiabilidad
Una vez iniciada su ejecución, nuestro software obtiene información sobre la ejecución
de los robots en el mercado, es decir, sobre las operaciones que realicen en cada momento
y su resultado. Esta información la utilizaremos para actualizar la fiabilidadde las redes
en función de si sus prediciones fueron correctas o no.
Para que obtener esta información sea posible, los robots almacenan en una base de
datos durante su ejecución información sobre la apertura y cierre de cada operación que
realizan, aśı como los resultados de las mismas. Además, nuestro sistema almacena tam-
bién las predicciones que cada red realizó en cada momento, por lo que podemos utilizar
ambas informaciones para actualizar la fiabilidad de la red que predijo cada resultado.
Sin embargo, si únicamente tuviéramos los robots operando en mercado real controlados
por nuestro sistema, sólo conoceŕıamos los resultados de las operaciones que Zeus permi-
tiera realizar. No obstante, para actualizar las estimaciones de error de las redes debemos
conocer también los resultados finales que tendŕıan las operaciones cuya realización no se
permite.
Para ello, tendremos operando no sólo los robots con dinero real controlados por
nuestro sistema, sino también otra copia de cada uno de ellos operando en una cuenta
de simulación. Es decir, realizarán todas las operaciones que realizaŕıan los robots reales,
pero sin invertir dinero real en ellas. Estos robots simulados también almacenarán los
resultados de sus operaciones en la misma base de datos que sus copias reales, pero con
otro identificador. De esta forma, nuestro sistema obtiene los resultados de todas las
operaciones que los robots podŕıan realizar, independientemente de si finalmente se llevan
a cabo o no.
Con todo ello, tenemos finalmente operando todos nuestros robots en tiempo real,
controlados por sus respectivas redes. Para ello, recibimos información en tanto de la
28 CAPÍTULO 2. DESARROLLO DE LA SOLUCIÓN
evolución del mercado como de las operaciones que los propios robots realizan, y utilizamos
un sistema adicional para detectar lo antes posible los periodos en los que las redes no
están funcionando bien y recortar las pérdidas.
Caṕıtulo 3
Aspectos Técnicos
3.1. Software Desarrollado
Para la realización de este trabajo ha sido necesario el desarrollo de un nuevo software
espećıfico que realizara los procesos descritos anteriormente. Éste, desarrollado también
como parte de este trabajo, ha sido realizado en lenguaje Java con el soporte de determi-
nadas libreŕıas especializadas.
En las siguientes subsecciones se detallan las libreŕıas externas utilizadas, los módulos
desarrollados, la estructura del software y finalmente se muestra la interfaz de usuario y
funcionamiento.
3.1.1. Librerias Utilizadas
Para el desarrollo del software se han empleado una serie de libreŕıas externas para
realizar las funcionalidades técnicas cuya implementación quedaba fuera de los objetivos
de este trabajo. Aśı, las implementaciones relacionados directamente con, por ejemplo,
las redes neuronales o el algoritmo del análisis principal de componentes, se han delegado
en libreŕıas conocidas de aprendizaje computacional u otros ámbitos, que se detallan a
continuación.
Encog ([8]): Encog es una libreŕıa especializada de aprendizaje computacional, que
implementa en el lenguaje Java la lógica y algoritmos de gran cantidad de técni-
cas de inteligencia artificial, como redes bayesianas o support vector machines. En
particular, nosotros utilizaremos su implementación de redes neuronales para nues-
tro software. Para éstas, incluye gran cantidad de algoritmos de entrenamiento, y
otras funcionalidades adicionales como el almacenamiento y recuperación de redes
ya entrenadas.
WEKA ([9]): WEKA es una aplicación muy conocida de aprendizaje computacio-
nal, principalmente utilizada para mineŕıa de datos, también escrita en Java. Fue
desarrollada por la Universidad de Waikaito (Nueva Zelanda) y se distribuye bajo
licencia GNU General Public. Aunque el software en śı constituye una aplicación
completa con interfaz de usuario, nosotros utilizaremos directamente sus libreŕıas,
que contienen los algoritmos del análisis principal de componentes, y delegaremos
también en ella algunas tareas menores como la normalización.
29
30 CAPÍTULO 3. ASPECTOS TÉCNICOS
Apache Commons Math ([10]): Es una libreŕıa escrita en Java de matemáticas y
estad́ıstica que incluye muchas funciones no disponibles directamente en el lenguaje
Java. En nuestro caso, utilizaremos de ella la implementación del ajuste por mı́nimos
cuadrados ponderado.
Jmathplot ([11]): Es una conocida libreŕıa open source de uso de gráficos en Java.
Proporciona funcionalidad para mostrar gráficos de diversos tipos en 2D y 3D de
forma sencilla. En nuestro caso la utilizaremos para la visualización de gráficas y
resultados, especialmente para la funcionalidad de nuestro software relacionado que
la monitorización y obtención de estad́ısticas.
3.1.2. Módulos Desarrollados
Además, introducimos aqúı los módulos que han sido desarrollados y pueden ser en-
tendidos de forma independiente, para facilitar la comprensión de la estructura global
presentada en la sección siguiente. Estos son:
Comunicación con bases de datos
Las bases de datos de Talentum se encuentran en un varios servidores propios, a los que
nos conectaremos utilizando JDBC (Java Database Connectivity, [14]), pudiendo escribir
nuestras consultas en SQL. Por tanto, necesitábamos conectarnos a diversas bases de
datos en distintos host para obtener gran cantidad de datos diferentes (históricos del
robot, datos del mercado y operaciones en tiempo real, etc.). Por ello, implementamos
una primera clase con la funcionalidad básica de comunicación con la base de datos, de
la que heredan otras clases espećıficas que refinan su comportamiento para los datos que
utilizará.
Además, para algunas funcionalidades, en general aquellas que tienen que ver con la
persistencia de los datos de la propia aplicación se decidió no utilizar estas bases de datos.
En su lugar, se implementó una clase que utilizaba como medio para guardar datos un
fichero de texto de la que heredaron otras clases para datos espećıficos: Información de los
ficheros y casos de pruebas introducidos, información de las redes entrenadas, estad́ısticas
de ejecución, almacenación y recuperación de las propias redes neuronales, etc. De esta
forma evitábamos sobrecargas las bases de datos de Talentum con más información, y a
la vez haćıamos el programa mucho más portable, lo que nos resultaba útil por ser un
desarrollo experimental. También se han almacenado en ficheros (.csv) la información de
los históricos del mercado, de los que necesitamos gran cantidad de información, de forma
que su acceso fuera mucho más rápido.
Módulo de tratamiento de históricos y casos de prueba
Como la lógica de procesamiento del histórico de operaciones para obtener finalmente
los casos de prueba era demasiado compleja, decidimos extraerlo en un módulo aparte.
Aśı, en clases separadas se encuentra recogida la lógica de lectura de los históricos y
su combinación con la información del histórico del mercado, la aplicación del análisis
principal de componentes, y la normalización final.
3.1. SOFTWARE DESARROLLADO 31
Hay que tener en cuenta que este módulo no sólo debe permitir realizar el procesamiento
antes de entrenar la red, sino que además debe guardar la información que necesite para
aplicar el mismo procedimiento con los datos que queramos introducir en tiempo real
en esta misma red. Es decir, debe aplicarles a los datos nuevos el análisis principal y la
normalización con los mismos parámetros que utilizó para obtener los casos de prueba
con los que entrenamos la red.
Módulo de redes neuronales
Toda la lógica relacionada con las redes neuronales también fue encapsulada. En par-
ticular la lógica de creación de las mismas, su entrenamiento, ejecución y persistencia, se
encuentran en este módulo. Además, proporciona una fachada que encapsula las peculia-
ridades propias de la libreŕıa que estamos utilizando para estas funciones, Encog.
Módulo de fiabilidady control de errores
Para implementar la funcionalidad de fiabilidad y control de errores teńıamos varias
estrategias disponibles, y es posible que unas funcionen mejor que otras en algunos casos,
por lo que era interesante tener disponibles varias. Por ello, toda la lógica relacionada
se encapsuló en otro módulo, que implementa principalmente el patrón Strategy. Este
proporciona una interfaz con las operaciones únicamente de inicialización, añadir un nuevo
resultado para actualizar el error y obtener el error esperado en base a una predicción.
3.1.3. Estructura General
El software se puede dividir en 4 partes, diferenciadas tanto a nivel de estructura de
clases como a nivel de interfaz y utilización. Las dos primeras coinciden en funcionalidad
con las dos primeras fases expuestas en la sección 2.2, la tercera corresponde a la tercera
y cuarta fase, y la cuarta parte corresponde a la obtención y visualización de estad́ısticas
de ejecución de las redes. Es decir, las cuatro partes son:
Procesamiento de los datos.
Entrenamiento de las Redes Neuronales.
Ejecución de las Redes y Monitorización.
Visualización de estad́ısticas.
Además, todo el software ha sido desarrollado siguiendo la arquitectura de Modelo-
Vista-Controlador (MVC), por lo que los elementos del modelo seguirán la ruta model.*,
los de la vista la ruta view.* y los del controlador la ruta controller.*. Aunque existe cierta
discusión al respecto, en nuestro caso consideraremos las clases relacionadas con las bases
de datos como parte del modelo.
La estructura del software de cada una de las secciones se detalla a continuación.
32 CAPÍTULO 3. ASPECTOS TÉCNICOS
Procesamiento de Datos
Contiene toda la lógica y funciones relacionadas con el proceso seguido desde que el
usuario quiere introducir un nuevo robot en el sistema hasta que obtenemos un conjunto
de casos de prueba que nos permitan entrenar una red para el mismo. Aśı, implementa la
lectura de históricos de operaciones, la obtención de datos del histórico del mercado, la
aplicación del análisis principal de componentes, la normalización de los datos... etc.
Además, permite almacenar tanto los ficheros en cada una de las etapas como los casos
de prueba procesados, junto con toda su información relacionada (́ındice al que se refieren,
datos que se han utilizado para modelizar la situación del mercado, etc.) para su uso en
otras etapas, en la sesión actual o en otra posterior.
Recordemos que esta parte del software también debe permitir el procesamiento de
nuevos datos en tiempo real, para poder introducirlos en la red una vez puesta a funcionar.
En la figura 3.1 podemos encontrar un diagrama de clases de esta parte. El controlador
principal es DataController, y la clase principal de la vista es DataControllerViewer. La
clase DataFilesTable hereda de AbstractTable ([13]) para mostrar la información de todos
los ficheros de datos del sistema. De esta clase heredan también las clases de las tablas de
los otros apartados.
La clase BacktestFactory nos proporciona los históricos de operaciones de cualquier
robot, y la clase InputFileFactory encapsula la lógica de procesamiento de datos, dele-
ga la lógica de preparación de los casos de prueba sin preprocesar en FilePreparer, la
aplicación del análisis principal de componentes en FileReducer y la de normalización en
FileNormalizer.
El resultado de esta fase es un fichero de casos de prueba, cuyo estado de procesamiento
y otros atributos se modelan en DataFile. DataFilesDatabase es, por tanto, la clase que
implementa la lógica de persistencia de estos datos.
Entrenamiento de las Redes
Contiene toda la lógica y funciones relacionadas puramente con las redes neuronales. Es
decir, realiza el proceso principal desde el procesamiento de los casos de prueba hasta la
obtención de la nueva red neuronal. Además, contiene la lógica púramente de ejecución de
las redes en tiempo real (recibe la entrada y devolver la salida, no la controla ni interpreta).
Por tanto, esta parte engloba toda la lógica de creación de redes, entrenamiento,
ejecución, test y validación, y permite almacenarlas y recuperarlas en el mismo estado en
una sesión posterior.
Podemos encontrar un diagrama de clases de todo ello en la figura 3.2. En él, Network-
Controller es el controlador principal, y TrainNetworkControllerViewer es la clase princi-
pal de la vista. De nuevo, NetworkFilesTable es una tabla que muestra la información de
las redes en nuestro sistema, NetworkFile representa esta información, y NetworksData-
base almacena tanto la información como las propias redes.
Además, DividedSupervisedSets permite dividir los casos de prueba convenientemente
en entrenamiento, validación y test, y unas clases auxiliares, NetworkTrainingResult y
NetworkTestResult agrupan los datos de resultados de los procesos de entrenamiento y
test de las redes, respectivamente.
3.1. SOFTWARE DESARROLLADO 33
Figura 3.1: Diagrama de clases de Procesamiento de Datos.
34 CAPÍTULO 3. ASPECTOS TÉCNICOS
Figura 3.2: Diagrama de clases de Entrenamiento de las Redes.
Ejecución de las Redes y Monitorización
Contiene las clases y lógica que permiten la ejecución del robot en tiempo real, y el
control de los mismos. Es decir, desde la obtención de la nueva red neuronal hasta el final
del proceso, con esta red funcionando y facilitando sus datos a Zeus. Para ello, contiene
la modelización de la red en ejecución, el acceso a las bases de datos para obtención de
información del mercado en tiempo real, la consulta de las operaciones realizadas por cada
robot en cada momento... etc. También contiene las clases relacionadas con la fiabilidad,
y la comunicación con Zeus. Esta comunicación se realiza a través de una base de datos
en la que nuestro sistema almacena sus predicciones sobre los robots en cada momento,
que el sistema Zeus leerá cuando necesite hacer uso de ella.
El diagrama de clases de esta sección se encuentra en la figura 3.3. De nuevo, Runnin-
gNetworkController es el controlador principal, y RunNetworksControllerViewer la clase
principal de la vista, con RunningNetworksTabla la tabla que muestra la información prin-
cipal. La modelización de la red en ejecución se realiza mediante la clase RunningNetwork,
que tiene asociada una red neuronal que es la que realmente realiza las operaciones y pro-
porciona los resultados, y una clase que contiene el control de la fiabilidad para esa red.
Por otra parte, SetsControlDatabase es la clase que almacena la información de nues-
tras predicciones y fiabilidad en la base de datos para ser usada por Zeus, y SignalsDa-
tabase recibe las operaciones realizadas por nuestros robots en tiempo real. Por último,
recordemos que necesitamos datos en tiempo real del mercado, para lo que delegamos en
DataController y su clase RealTimeMarketFacade.
Visualización de Estad́ısticas
Por último, esta parte implementa algunas funcionalidades de visualización de datos y
seguimiento en tiempo real de la ejecución de nuestro software. Permite obtener gráficas
con las predicciones de nuestras redes en un momento determinado, aśı como ver, para
cada operación que hubieran realizado los robots sin nuestro sistema, si la hemos realizado
3.1. SOFTWARE DESARROLLADO 35
Figura 3.3: Diagrama de clases de Ejecución de las Redes.
o no, cuál era nuestra predicción y fiabilidad en ese momento, y el resultado final que ha
tenido.
Además, mantiene registro de todos estos datos para su posterior consulta en ficheros
de texto. Podemos encontrar este último diagrama de clases en la figura 3.4. Una vez
más, StatsController es el controlador principal y StatsViewer la clase principal de la
vista, mientras que OperationsTable es la tabla en la que se muestra toda la información
de las operaciones de los robots, que es obtenida de SignalsDatabase y de sus registros
internos de las predicciones realizadas. Por último, NetworkPlot permite mostrar la gráfica
de prediccionesde una red concreta en un intervalo de tiempo determinado, información
que es guardada en StatFileResults. PlotUtils es una clase auxiliar que maneja la creación
de gráficas.
3.1.4. Interfaz de Usuario
La interfaz de usuario del software consta de un menú principal inicial, y 4 paneles de
control, cada uno de ellos correspondiente a una parte principal del software descrita en
la sección anterior.
Aśı, el menú inicial, que se muestra en la figura 3.5, permite abrir dichos paneles de
control. En ellos es en los que se realiza la lógica real de uso de la aplicación.
Manage Data
Si elegimos la opción “Manage Data”, se desplegará el panel de la figura 3.6 que permite
añadir nuevos robots con su histórico de operaciones y procesarlos hasta obtener los casos
de prueba. Aśı, este panel provee funciones para: añadir nuevos robots al sistema, elegir
las variables que utilizaremos para modelar la situación del mercado (que será la entrada
36 CAPÍTULO 3. ASPECTOS TÉCNICOS
Figura 3.4: Diagrama de clases de Visualización de Estad́ısticas.
Figura 3.5: Menu Principal de la aplicación.
de nuestra red), procesar el histórico de acuerdo a estos datos, reducir su dimensionalidad
utilizando el análisis de componentes principales, y normalizarlos. Finalmente, tendremos
como resultado los casos de entrenamiento que utilizaremos para generar la red neuronal
asociada al robot.
Figura 3.6: Panel de Procesamiento de Datos.
Administrate Networks
Por otra parte, si en el menú principal elegimos “Administrate Networks” se desple-
gará el panel de entrenamiento de redes, que se encuentra en la figura 3.7. Éste utiliza
los ficheros de casos generados en la etapa anterior para obtener nuevas redes. Para ello,
permite las operaciones de crear una nueva red elegir su topoloǵıa manualmente o dar una
lista de posibles topoloǵıas, entrenarlas con distintos parámetros y evaluar el resultado.
Aśı, la tabla de este panel muestra toda la información elegida para la red, aśı como un
resumen de sus resultados de entrenamiento y test.
3.2. DETALLES TÉCNICOS DEL ENTRENAMIENTO DE REDES 37
Figura 3.7: Panel de Entrenamiento de Redes.
Run Networks
El tercer panel, desplegado al elegir “Run Networks” permite poner las redes entrenadas
anteriormente en ejecución. Tras esto, automáticamente harán predicciones sobre su robot
asociado que estará ejecutándose en mercado real, y las almacenarán en una base de datos
para que puedan ser consultadas por un agente externo. Podemos encontrar una imagen
de este panel en la figura 3.8.
Como podemos ver, incluye una tabla en la que se muestran los robots en ejecución,
cons us últimas predicciones y su fiabilidad, e información sobre si su robot asociado
está operando. Además, permite activar y desactivar las redes en cualquier momento.
Figura 3.8: Panel de Ejecución de Redes.
View Stats
Por último, al pulsar “View Stats” se despliega el cuarto panel, que contiene varias
opciones de visualización de estad́ısticas. Por ejemplo, podemos consultar las operaciones
realizadas por los robots en un intervalo dado, o una gráfica con las predicciones de una
red concreta en un cierto periodo de tiempo. Un ejemplo de visualización de este panel
se encuentra en la figura 3.9
Aśı, incluye una tabla que muestra las últimas operaciones realizadas con información
como si nuestro sistema la realizó o no, y cuál era la predicción y fiabilidad en ese momento,
y opciones para el filtrado de éstas y la visualización de gráficas sobre las predicciones de
una red concreta.
3.2. Detalles Técnicos del Entrenamiento de Redes
3.2.1. El Problema del Overfitting
Como se expone en la sección 2.1.2, el proceso de entrenamiento consiste en ajustar
los parámetros de la red para que resuelva los casos de prueba conocidos, esperando que
aśı sea capaz de generalizar aquellos que no lo son.
El problema que se plantea consiste en que la red puede dar las salidas correctas para
todos los casos de prueba, y dar salidas muy alejadas de las correctas para aquellos casos
38 CAPÍTULO 3. ASPECTOS TÉCNICOS
Figura 3.9: Panel de Visualización de Estad́ısticas.
para los que no ha sido entrenada. Uno de los posibles motivos de que ocurra esto es que
la red ha quedado entrenada demasiado espećıficamente para resolver los casos concretos
de entrenamiento, y por ello no es capaz de general los demás casos. A este problema se
le conoce como overfitting o sobreentrenamiento.
Los algoritmos de entrenamiento de redes ajustan en sucesivas etapas los parámetros
de las neuronas para reducir el error producido en la predicción de los casos. Cada una de
las iteraciones que se realizan utilizando una vez cada caso de entrenamiento se denomina
epoch.
Aśı, si ejecutamos el algoritmo de entrenamiento durante demasiados epochs, tendre-
mos que la red se ajustará bien a los casos que utilizamos para su entrenamiento, pero
fallará al generalizar el problema con casos nuevos. Sin embargo, si lo ejecutamos durante
demasiados pocos, la red no aprenderá el problema correctamente.
Para resolver este problema, y poder conocer cuándo debemos finalizar el entrenamien-
to, debemos saber cuándo la red empieza a dar peores resultados para los casos para
los que no la estamos entrenando. Para ello, inicialmente se divide el conjunto de casos
que tenemos destinados al entrenamiento en dos subconjuntos: El conjunto de casos de
training y el de validation. Aśı, el algoritmo que ajusta los pesos de las neuronas en ba-
se a ciertos casos utilizará únicamente los casos de training, y utilizaremos los casos de
validación para detectar cuándo debemos detectar el proceso. Normalmente la división
en los subconjuntos de training y validation se realiza utilizando un 10 ó 20 % de casos
aleatoriamente elegidos para validación, y los restantes para entrenamiento.
Al estar entrenando la red para esos casos, el error que cometemos ajustando los
casos de training decrecerá con el tiempo. Sin embargo, al no estar utilizando para el
entrenamiento los casos de validation, tenemos que la red se comportará con éstos de la
misma forma que lo hará para los casos cuya salida correcta no conocemos, que son los que
queremos resolver. Por tanto, esperamos que el error que cometa en estos últimos decrezca
inicialmente con cada epoch, mientras la red se ajusta correctamente al problema, y se
incremente conforme la red se ajusta demasiado espećıficamente para los casos de training,
fallando al generalizar el problema. Puede verse un ejemplo de la evolución esperada de
3.2. DETALLES TÉCNICOS DEL ENTRENAMIENTO DE REDES 39
los errores de training1 y validation en la figura 3.10. Idealmente, detendremos el proceso
cuando la red ya haya aprendido el problema y comience a sobreajustarse a los casos de
entrenamiento, por lo que normalmente nuestro criterio de detención será el incremento
en el error de validación.
Figura 3.10: Ejemplo de Overfitting. En azul el error de training y en rojo el error de
validation.
3.2.2. El Proceso Completo de Entrenamiento
Aunque en otras secciones del trabajo se da una visión general bastante completa del
proceso de entrenamiento, en esta sección expondremos los detalles técnicos que no quedan
recogidos en dicha visión general. Recordemos que el proceso general se divide en dos fases:
En una primera hacemos experimentos con diversas redes entrenadas siguiendo diferentes
topoloǵıas, y elegimos aquella que consideramos mejor, y en una segunda fase entrenamos
una nueva red con estas caracteŕısticas.
Sin embargo, como hemos visto en la sección anterior, para evitar el problema del over-
fitting debemos tener un criterio de detención del entrenamiento efectivo. En la primera
fase utilizaremos el procedimiento descrito, consistente en dividir los casos disponibles
para el entrenamiento en dos subconjuntos, de training y de validation, y utilizar el pri-
mero para ajustar los parámetros y el segundo para detectar cuándo empieza a producirse
1Para evitar

Continuar navegando