capítulo 3 - universidad de sevillabibing.us.es/proyectos/abreproy/12116/fichero/capitulo3.pdf ·...

27
Capítulo 3 Búsqueda y procesamiento de los datos Describir qué herramientas utilizar para llevar a cabo este proyecto es una tarea importante. En este capítulo se analizan las razones para elegir entre unas u otras tecnologías de procesamiento y almacenamiento de los datos. Por otra parte se explica el método elegido para obtener la información histórica que se pretende analizar y se especifican las alternativas disponibles del origen de los datos históricos empleados en las predicciones y las razones para la elección del índice bursátil. Además se hará una valoración de la calidad de los datos obtenidos y se indicará un método de filtrado de los datos para que puedan ser utilizados. 3.1 Tecnología para el análisis de datos 3.1.1 La elección de trabajar con MATLAB Puesto que hoy en día los ordenadores se han vuelto una parte indispensable para los trabajos de investigación científica, ingeniería y otros campos, es importante elegir adecuadamente qué tecnología utilizar para el análisis numérico en un proyecto. Se podrían utilizar lenguajes como Fortran, C/C++, Visual Basic o incluso hojas de cálculo para resolver problemas difíciles, pero se ha decidido que la mejor opción para resolver problemas de ingeniería sea MATLAB, que es capaz de realizar 33

Upload: others

Post on 08-Oct-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

Capítulo 3

Búsqueda y procesamiento de los datos

Describir qué herramientas utilizar para llevar a cabo este proyecto es una tarea importante. En este capítulo se analizan las razones para elegir entre unas u otras tecnologías de procesamiento y almacenamiento de los datos.

Por otra parte se explica el método elegido para obtener la información histórica que se pretende analizar y se especifican las alternativas disponibles del origen de los datos históricos empleados en las predicciones y las razones para la elección del índice bursátil. Además se hará una valoración de la calidad de los datos obtenidos y se indicará un método de filtrado de los datos para que puedan ser utilizados.

3.1 Tecnología para el análisis de datos

3.1.1 La elección de trabajar con MATLAB

Puesto que hoy en día los ordenadores se han vuelto una parte indispensable para los trabajos de investigación científica, ingeniería y otros campos, es importante elegir adecuadamente qué tecnología utilizar para el análisis numérico en un proyecto.

Se podrían utilizar lenguajes como Fortran, C/C++, Visual Basic o incluso hojas de cálculo para resolver problemas difíciles, pero se ha decidido que la mejor opción para resolver problemas de ingeniería sea MATLAB, que es capaz de realizar

33

Page 2: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

3.1 Tecnología para el análisis de datos

operaciones avanzadas en matemáticas e ingeniería.

MATLAB incorpora un poderoso lenguaje de programación que incluye los conceptos básicos comunes a la mayoría de los lenguajes de programación. Puesto que se trata de un lenguaje basado en scripts, la creación de programas y su depuración en MATLAB con frecuencia es más fácil que en los lenguajes tradicionales de programación, como C++.

Reduce la longitud del código y el tiempo de desarrollo significativamente además de ser un lenguaje claro y sencillo. Todas las herramientas necesarias están dentro de la misma aplicación y la documentación está embebida en el propio programa.

Se busca efectividad, rapidez y pocos errores, por lo que MATLAB es el lenguaje de programación y la aplicación que mejor encaja en todos estos requisitos en lo referente a este proyecto fin de carrera.

3.1.2 Sistema de gestión de base de datos

Una base de datos es un “almacén” que permite guardar grandes cantidades de información de forma organizada. La base de datos estará entonces compuesta por varias tablas relacionadas entre sí, de modo que ninguna funciona independientemente de las otras.

Entre la base de datos física, es decir, los datos almacenados en soportes hardware físicos, y los usuarios del sistema, se encuentran los sistemas de gestión de base de datos o SGBD (en inglés, DataBase Management System, o DBMS)19. Los SGBD son un tipo de software muy específico, dedicado a servir de interfaz entre la base de datos, el usuario y las aplicaciones que la utilizan.

El propósito general de los sistemas de gestión de base de datos es el de manejar de manera clara, sencilla y ordenada un conjunto de datos que posteriormente se convertirán en información relevante para el usuario.

Actualmente se pueden encontrar SGBD libres, no libres y no libres pero gratuitos20. A continuación se muestran algunos ejemplos:

• Libres: MySQL, Firebird, Apache Derby, PostgreSQL, SQLite.

• No libres: Microsoft Access, Oracle, dBase, IBM DB2 Universal Database.

• No libres gratuitos: Microsoft SQL Server Compact Edition Basica, Sybase ASE Express Edition para Linux (Edición gratuita para Linux), Oracle Express Edition 10 para Windows.

19 Ver Date, C. J. 2001, Introducción a los sistemas de bases de datos, 7ª edn, Pearson Educación, México.

20 Ver es.wikipedia.org/wiki/Sistema_de_gesti%C3%B3n_de_bases_de_datos

34

Page 3: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

Proyecto Fin de Carrera Enrique Molleja

MATLAB dispone de soporte para bases de datos de uso muy extendido y soporta comandos estándar de SQL. Se puede importar cualquier dato desde una base de datos a MATLAB usando diferentes formatos como celdas, estructuras, matrices, o bien exportar nuevos datos o actualizar los ya existentes una vez se haya trabajado con ellos desde MATLAB a la base de datos con gran facilidad. Se puede trabajar con una o varias columnas de una tabla, una o varias filas, la tabla completa, entrelazar información de varias tablas y todo esto con comandos de SQL escritos en los scripts.

A pesar de la buena integración de MATLAB con las bases de datos externas se ha descartado el uso de un SGBD en el proyecto. Esto se debe a que la base de datos de este proyecto ha sido pensada para que sirva en el futuro a otros interesados en conocer información histórica de la bolsa. Estos otros usuarios no tienen por qué conocer, por ejemplo, el lenguaje SQL para acceder a los datos sino que deben disponer de unas herramientas sencillas para consultar los históricos. Otra prioridad en el diseño es la de reducir el tiempo de acceso a las tablas para que los algoritmos puedan leer una y otra vez los datos sin que afecte al rendimiento. En la mayoría de los SGBD presentados anteriormente es necesario acceder a la información utilizando un servidor ubicado en una red con los retardos que eso supone.

Teniendo presentes estos requisitos se decidió crear una base de datos desde cero utilizando MATLAB como sistema intermedio entre el usuario y los datos.

La descripción de la base de datos así como las funciones creadas para gestionar la información se describen en el siguiente apartado.

3.1.3 Equipo utilizado

Todos los algoritmos desarrollados para este proyecto han sido ejecutados en un sistema con las siguientes características:

• Procesador: Intel Core 2 Duo 2.20GHz

• Memoria: 4GB RAM

• Sistema operativo: Ubuntu 10.04 (64bits)

• Versión de MATLAB: R2011a (64bits)

Por lo tanto, puede asegurarse que la ejecución de los algoritmos en un equipo de similares características será correcta y en un tiempo adecuado.

35

Page 4: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

3.2 Datos del modelo

3.2 Datos del modelo

3.2.1 Elección del origen de los datos

Como primera opción se pensó en obtener los datos históricos de la bolsa utilizando bases de datos como COMPUSTAT, AMADEUS o SABI, que ofrecen acceso a información de empresas y permiten consultar datos de bolsa de las mismas. Pero debido a que la Universidad de Sevilla, en el momento de comenzar el proyecto, ya no tenía licencia para acceder a ellas fue imposible acceder a esas bases de datos de manera gratuita, por lo que se buscaron otras fuentes en las que poder consultar la información.

A continuación se pensó en utilizar alguna de las múltiples plataformas de trading como Metatrader o Visual Chart, pero debido a su coste y a que no sería necesario utilizar todos los servicios de estas plataformas, sino que únicamente se deseaba obtener datos históricos, se descartaron.

No fue difícil encontrar en Internet lugares donde obtener esa información, Forexpros, Stooq o Yahoo Finanzas, entre otros. Se comparó cual ofrecía una información más completa, mayor antigüedad de los datos y cual de ellas permitía más fácilmente automatizar la descarga de datos mediante un algoritmo. Por estos motivos se eligió como origen de datos Yahoo Finanzas, para el que se programó una función que permitiría descargar cotizaciones en un rango de tiempo determinado.

3.2.2 Elección del índice bursátil a analizar

Yahoo Finanzas, como se ha mencionado antes, fue el origen de datos elegido. Este servicio ofrecido por Yahoo ofrece la posibilidad de consultar cotizaciones históricas en diversos índices internacionales, y también permite consultar valores de sus componentes.

De los posibles índices que ofrece Yahoo, se elige el IBEX35 como índice de referencia para hacer los análisis de datos históricos así como los índices de las empresas que lo forman, lo que se denomina sus componentes. El motivo de la elección del IBEX35 se debe a la facilidad para acceder a información referente a su funcionamiento, normativa y componentes que forman el índice.

Otra cuestión importante que hubo que considerar fue la composición histórica del IBEX35, que se puso en marcha el 14 de enero de 1992, aunque existen valores históricos desde la fecha base del 29 de diciembre de 1989 gracias a una estimación del índice que se hizo con posterioridad, dándose para esa misma fecha un valor de partida de 3000 puntos21.

21 Ver Nota técnica de la División de Investigación del IESE. Pablo Fernández. Octubre de 1993. Ultima edición: 5/94

36

Page 5: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

Proyecto Fin de Carrera Enrique Molleja

Puesto que en el proyecto se trabaja con información histórica había que tener en cuenta que las empresas que forman parte del IBEX35, y por lo tanto de la cartera de inversión elegida, no han sido siempre las mismas. Por ese motivo, además de obtener series de datos de Yahoo se utilizó la información sobre composición histórica proporcionada por la empresa Bolsas y Mercados Españoles que permite descargar dicha información desde cualquiera de las páginas web de las cuatro bolsas españolas que forman parte del grupo BME. Por ejemplo, utilizando la página web de la Bolsa de Madrid, dicha información está accesible a través del menú lateral izquierdo: Índices > Índices IBEX > Composición histórica.22

No obstante aparece un nuevo problema, y es que hay empresas desaparecidas para las que no es posible obtener datos históricos porque ya no cotizan dentro del grupo de empresas que utilizan el Sistema de Interconexión Bursátil (SIBE). Por ejemplo, Acciona (código: ANA) es el resultado de la fusión en 1997 de dos empresas, una de ellas cotizaba con el código CUB (Cubiertas y MZOV), y a día de hoy únicamente se pueden consultar los valores de ANA (desde 1997) pero no de CUB porque esa empresa no existe y ninguna de las fuentes de información analizadas anteriormente ofrece esos datos.

La solución elegida para almacenar las entradas y salidas en bolsa de aquellas empresas que existan o hayan existido, y para las que sean o no conocidos sus datos, consiste en hacer para cada una de ellas una estructura como la siguiente,

Código BTO.MC

Nombre Banesto

Sector Banca

Índice Entrada Salida

IBEX35 01/01/1991 02/04/1998

IBEX35 02/01/2004 01/07/2005

IBEX35 01/08/2006 03/01/2011

Tabla 2: Estructura de empresa con datos reales de Banesto

Esta estructura puede almacenarse fácilmente en una base de datos junto a los datos históricos de las empresas e índices. Además debe tenerse en cuenta que una empresa puede formar parte de varios índices simultáneamente o no, de modo que con esta estructura es posible añadir las entradas y salidas de cada empresa en otros índices diferentes al IBEX35 sin tener que crear otra estructura diferente. Los detalles del almacenamiento de esta información se ven en el siguiente apartado.

22 Ver www.bolsamadrid.es/esp/Indices/Ibex/ComposicionHistorica_Ibex.aspx

37

Page 6: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

3.2 Datos del modelo

3.2.3 Almacenamiento de los datos

Antes de descargar los datos desde el origen elegido es necesario definir la manera de organizar la información para que los algoritmos que la necesiten puedan acceder a ella de manera rápida y sencilla.

Para cumplir ese objetivo se define a continuación la estructura de las tablas (vectores y matrices) utilizadas para almacenar los datos.

• fechas, es un vector de tipo cell23 de una única dimensión que contiene todas las fechas entre el inicio y final elegidos. Incluye fines de semana y festivos, es decir en este vector está todo el calendario entre inicio y final. Es importante destacar que todas las fechas utilizadas tanto en la base de datos como en las funciones están en formato 'dd/mm/aaaa'.

Ejemplo de vector:

{ '01/01/2000'; '02/01/2000; '03/01/2000'; '04/01/2000'; '05/01/2000'; '06/01/2000' }

• columnas, es un vector de tipo cell, también de una dimensión, que guarda el nombre de las columnas que forman cada tabla descargada desde la fuente de datos Yahoo. Concretamente almacena los siguientes elementos:

{'Apertura'; 'Maximo'; 'Minimo'; 'Cerrar'; 'Volumen'; 'AjCierre'}

Donde el significado de cada elemento del vector es el siguiente:

◦ Apertura: valor de la acción al comienzo del periodo

◦ Máximo: valor máximo que toma la acción en el periodo

◦ Mínimo: valor mínimo que toma la acción en el periodo

◦ Cierre: valor de la acción al finalizar el periodo

◦ Volumen: número de títulos negociados en el periodo

◦ Cierre ajustado: proporciona el precio de cierre en el periodo, ajustado para todos los fraccionamientos y distribuciones de dividendos pertinentes.

23 En MATLAB existen diferentes maneras de almacenar información. Una de ellas son los cells, que a diferencia de una matriz o vector tradicional, pueden almacenar arbitrariamente cualquier tipo de dato en cada posición del cell; mientras que una matriz necesita que todos sus elementos sean homogéneos, es decir, que sean del mismo tipo. Otra diferencia importante entre cells y matrices es que las segundas son almacenadas de manera contigua en memoria, mientras que los cells contienen punteros a los datos almacenados en cada posición. El uso de punteros tiene algunas ventajas, como por ejemplo, al modificar el tamaño de una matriz, ya que en el caso de un cell no es necesario volver a copiar toda la información sino únicamente la lista de punteros.

38

Page 7: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

Proyecto Fin de Carrera Enrique Molleja

• empresas, es otro cell unidimensional que contiene los códigos para todos los índices y empresas utilizadas aunque no existan datos disponibles para ellas. Estos códigos son los que utiliza Yahoo para identificar de forma única a una empresa en un índice. En este vector se incluyen tanto índices como las empresas que los componen.

Ejemplo:

{'^IBEX'; 'DIA.MC'; 'BME.MC'; 'TEF.MC'}

• SDM, es la matriz que contiene los datos descargados. Se trata de una matriz tridimensional cuyos ejes son día, columna, empresa.

◦ Dimensión 1 (día): El primer índice de este eje hace referencia al primer elemento del vector de fechas, el segundo al segundo y así sucesivamente.

◦ Dimensión 2 (columna): Índice asociado a los valores del vector columnas:

▪ 1 -> Apertura

▪ 2 -> Maximo,

▪ 3-> Minimo

▪ 4-> Cerrar

▪ 5 -> Volumen

▪ 6 -> AjCierrre.

◦ Dimensión 3 (empresa): Índice asociado a la empresa (Telefónica, BME, Endesa...). Para identificar qué empresa le corresponde a cada índice se recurre al vector empresas.

En la matriz SDM se pueden encontrar dos valores característicos que indican dos situaciones importantes:

◦ Al reservar espacio para crear SDM se inicializa toda la matriz al valor NOTDEF, por lo tanto si un elemento de SDM es NOTDEF significa que durante el proceso de descarga de datos no había nada que escribir en esa posición y ese dato no existe, por ejemplo, porque la empresa no existía o no formaba parte de la bolsa en esa fecha. El valor NOTDEF está definido como .

◦ en cambio si un elemento vale 0 (cero), quiere decir que el dato descargado tenía un valor nulo por el motivo que fuera. Lo que sí se puede asegurar es que los datos de los fines de semana y días no hábiles siempre tendrán valor NOTDEF.

39

Page 8: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

3.2 Datos del modelo

Ejemplo de uso de SDM en MATLAB, utilizando los vectores de ejemplo anteriores:

◦ SDM(3, 4, 1): Devuelve el valor de cierre (4) del IBEX (1) para el día 3 de enero de 2000 (3).

◦ SDM(:, 5, 1): Devuelve el valor de volumen (5) del IBEX (1) para todo el rango de fechas.

• sectores, es un vector de tipo cell que contiene los nombres de los sectores de las empresas del IBEX.

Ejemplo:

{'Banca'; 'Telecomunicaciones'; 'Energía'}

• datosempresas, es el vector de estructuras que almacena la información referente a la composición histórica del IBEX. Como se mencionó antes cada estructura tiene cuatro campos:

◦ Código. Almacena el índice del vector empresas en el que se encuentra la empresa de la estructura.

◦ Nombre. Es el nombre completo de la empresa en formato cadena de texto.

◦ Sector. Contiene el índice del vector sector en el que se encuentra la empresa.

◦ Historia. Es una tabla que contiene la información de entradas y salidas de la empresa en un índice concreto. Las fechas de entrada y salida son índices del vector de fechas.

La relación existente entre los diferentes vectores y matrices puede verse en la ilustración 1, donde se representa el esquema relacional de la base de datos. Aunque este esquema es muy similar a las tablas implementadas en MATLAB, debe tenerse en cuenta que se trata de un modelo utilizado para representar las relaciones lógicas entre las diferentes tablas, de modo que la implementación real presenta algunas diferencias.

Todas las tablas que forman la base de datos explicada están almacenadas en el fichero llamado BD.mat creado con MATLAB. La información contenida en él será cargada en memoria cuando se haga una llamada a la función correspondiente en el programa principal.

40

Page 9: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

Proyecto Fin de Carrera Enrique Molleja

3.2.4 Clase y funciones para gestión de los datos

Las funciones que gestionan la base de datos han sido programadas utilizando programación orientada a objetos, en adelante POO. En este paradigma de programación, se usan objetos como elementos fundamentales en la construcción de la solución, de modo que los diferentes objetos definidos en un programa interactúan entre sí. La POO está basada en varias técnicas, incluyendo herencia, abstracción, cohesión, polimorfismo, acoplamiento y encapsulamiento.

41

Ilustración 1: Esquema relacional de la base de datos

Page 10: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

3.2 Datos del modelo

A modo de introducción breve, se muestran a continuación algunas definiciones que es interesante conocer para comprender el funcionamiento de algunas funciones que forman parte del programa principal diseñado. Estos conceptos fundamentales relacionados con la POO, son por supuesto extrapolables a MATLAB.

• Clase: una clase es una construcción que se utiliza como un modelo (o plantilla) para crear objetos de ese tipo, a los que se les llama instancias. En una clase se definen las propiedades y comportamientos de un tipo de objeto concreto.

• Objeto: Instancia de una clase. Entidad provista de un conjunto de propiedades o atributos (datos) y de funcionalidad (métodos). Estos últimos reaccionan a los eventos resultantes del uso del programa donde se crea el objeto.

• Propiedades o atributos: contenedores de datos asociados a un objeto (o a una clase de objetos), que pueden hacerse o no visibles desde fuera del objeto. Las propiedades se definen como las características predeterminadas que tiene una clase, y su valor puede ser alterado por la ejecución de algún método.

• Método: algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se inicia tras la recepción de un "mensaje". Puede decirse que un método es una función que está asociada a un objeto, es decir, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.

• Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.

• Evento: es un suceso en el sistema (como puede ser una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento la reacción que puede desencadenar un objeto; es decir, la acción que genera.

• Herencia: (por ejemplo, herencia de la clase A a la clase B) es la facilidad mediante la cual la clase B hereda en ella cada uno de los atributos y operaciones de A, como si esos atributos y operaciones hubiesen sido definidos por la misma B. Por lo tanto, puede usar los mismos métodos y variables públicas declaradas en A.

Conocidas estas definiciones básicas así como la estructura de datos utilizada,

42

Page 11: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

Proyecto Fin de Carrera Enrique Molleja

esto es, vectores y matrices que dan forma a la base de datos, se describen las propiedades (properties) y funciones (methods) de la clase BD.m, que es la que contiene todas las funciones necesarias para gestionar los datos bursátiles históricos, desde la descarga de datos hasta la consulta de la matriz SDM. El código de dicha clase puede verse en el Anexo A.

El motivo por el que se ha decidido integrar las funciones dentro una clase no es otro que facilitar el paso y uso de las funciones, ya que estando todo en un mismo archivo se consigue un código más fácilmente intercambiable. Otra utilidad de las clases es que dentro de ellas pueden definirse variables que puedan ser de interés general, por decirlo de alguna manera sería una forma de hacer “globales” algunos parámetros.

3.2.4.1 Propiedades de la clase

Las propiedades o atributos son las características de los objetos. Son aquellas variables y parámetros que definen los datos relacionados con los objetos.

En la clase BD.m se definen las siguientes propiedades:

• SDM, empresas, fechas, columnas son las variables que almacenan los datos cargados del fichero que contiene la base de datos. Por defecto este fichero se llama BD.mat.

• datosempresas, vector de estructuras que almacena el historial de entradas y salidas de una empresa en un índice así como su nombre y sector al que pertenece.

• NOTDEF = -Inf, valor por defecto para los elementos de la matriz SDM.

• dirBD, ruta al fichero donde se almacena la base de datos.

• indices, cell que almacena una lista de los índices bursátiles utilizados. Cuando se desea crear una base de datos nueva, se utiliza esta lista para obtener las componentes de cada índice y llenar la base de datos.

• columnasdef, cell que contiene el nombre de las columnas por defecto que forman las matrices de datos.

• fuentes, cell que almacena el nombre de las fuentes de las que pueden obtenerse datos históricos. En este proyecto será siempre Yahoo.

• sectores , cell que contiene el nombre de los sectores a los que pertenecen las empresas de la base de datos.

• diassemana, meses, operador, contienen el nombre de los días de la semana, meses y otros caracteres utilizados para realizar búsquedas en la base de datos.

• existeBD, variable de tipo lógico que indica si existe el fichero que contiene la base de datos en el directorio dirBD.

43

Page 12: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

3.2 Datos del modelo

• actualmente, almacena la fecha más reciente para la que hay datos disponibles.

• actualizar, variable de tipo lógico que indica si hay nuevos datos disponibles para descargar. Esta variable se almacena en el fichero de base de datos.

3.2.4.2 Métodos de la clase

Son las funcionalidades asociadas a los objetos. La clase diseñada tiene los siguientes métodos:

• BD, es el constructor de la clase y se ejecuta al crearse un objeto BD. Se encarga de activar la herramienta para procesamiento en paralelo Matlabpool del Parallel Computing Toolbox de MATLAB, y de llamar al método cargarBD que lee los datos de la base de datos.

◦ Entrada: Si recibe un parámetro de entrada, este será la ruta al fichero que contiene la base de datos. En caso contrario, utilizará la base de datos por defecto almacenada en BD.mat.

◦ Salida: devuelve el objeto creado.

• cargarBD, si existe el fichero en dirBD carga en memoria las variables del mismo. Además comprueba si hay actualizaciones disponibles en las fuentes utilizadas.

◦ Entrada: no recibe ningún argumento de entrada.

◦ Salida: no devuelve parámetros.

• guardarBD, guarda en el fichero indicado por dirBD las variables de la base de datos cada vez que son modificadas, lo cual ocurre cuando se llama a los métodos crearBD y actualizarBD.

◦ Entrada: no recibe ningún argumento de entrada.

◦ Salida: no devuelve parámetros.

• crearBD, se utiliza cuando la base de datos no existe y se desea crear una en el fichero indicado en dirBD después de descargar los datos desde la fuente e inicializar las variables. Además crea el vector de estructuras de las empresas utilizando los valores por defecto.

◦ Entrada (caso 1): (fecha inicio, fecha fin, cell de empresas).

Descarga los datos de las empresas indicadas entre las fechas de inicio y fin para que puedan ser almacenados en la base de datos.

Ejemplo: '01/09/2012', '01/10/2012', {'^IBEX'; 'BME.MC'}

◦ Entrada (caso 2): (fecha inicio, fecha fin).

44

Page 13: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

Proyecto Fin de Carrera Enrique Molleja

Utiliza los valores del vector indices para descargar los datos de aquellas empresas que son sus componentes entre las fechas de inicio y fin.

Ejemplo: '01/09/2012', '01/10/2012'

◦ Salida: no devuelve parámetros.

• comprobarActualizacion, con este método se determina si hay nuevos datos disponibles para descargar. Comprueba si hay cambios en la composición del índice desde la última actualización indicando tal situación y determina la fecha del último dato disponible. Es utilizada en la función cargarBD para comprobar actualizaciones al inicio.

◦ Entrada: no recibe ningún argumento de entrada.

◦ Salida: (actualizar)

Devuelve una variable de tipo lógico con valor igual a true en el caso de que haya nuevos datos disponibles, y false en caso contrario.

La fecha del último dato disponible la indica modificando la propiedad de la clase llamada actualmente.

• actualizarBD, actualiza la base de datos según el parámetro pasado como argumento. Durante la actualización con datos nuevos, el algoritmo tiene en cuenta que la información de todos los vectores y matrices implicados debe ser consistente, es decir, que si hay nuevos datos disponibles debe actualizarse, además del vector de fechas y empresas y la matriz SDM, el vector con la historia de cada empresa.

◦ Entrada (caso 1): no recibe ningún argumento de entrada.

Actualiza los datos de los vectores, matrices y estructuras hasta la fecha de hoy (o el último publicado) si la variable actualizar es true y actualmente distinta a la última fecha de la base de datos.

◦ Entrada (caso 2): (cell de empresas).

Si las empresas pasadas no existen aún en la base de datos las añade y descarga sus datos históricos para las fechas del vector fechas. Después actualiza a los datos más recientes utilizando la función actualizarBD sin argumentos.

◦ Salida: no devuelve parámetros.

• crearEstructura, para cada una de las empresas que forman parte de la base de datos, se crea una estructura a partir de la información pasada como argumento. Si alguna estructura ya existía se actualiza la información, en caso contrario la une al vector datosempresas.

◦ Entrada: (cell con los datos)

45

Page 14: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

3.2 Datos del modelo

◦ Salida: no devuelve parámetros.

• historiaIndice, esta función se hace necesaria porque la realización del proyecto abarca varios meses y por lo tanto la composición del índice puede sufrir cambios. Con esta función se consigue, utilizando pocos parámetros, realizar una consulta sobre la composición histórica de un índice en un determinado momento o intervalo. Por lo tanto, la función consulta el vector datosempresas para obtener qué empresas pertenecieron a un índice determinado en un período de tiempo pasado.

◦ Entrada: (inicio, fin, índice, coincidencias)

Inicio y fin indican entre qué fechas consultar la composición del índice indicado como parámetro.

Coincidencias sirve para indicar la cantidad mínima de empresas que deben estar de manera continua entre inicio y fin en el índice indicado.

◦ Salida: (subfechas, subemp) estos parámetros contienen los índices de los vectores fechas y empresas para aquellos elementos que cumplen las restricciones de entrada.

• consultarBD, permite encontrar el índice de cada uno de los vectores de la base de datos que cumplen con las restricciones de los parámetros de entrada. Esos índices pueden utilizarse posteriormente para obtener una matriz reducida de SDM con la información útil.

◦ Entrada: (rango fechas, rango columnas, rango empresas)

Son los parámetros de consulta, e indican el conjunto de fechas, columnas y empresas cuyos índices se desea conocer.

En el caso de las fechas pueden indicarse de tres modos diferentes:

▪ Nombres de los días de la semana

▪ Nombres de los meses

▪ Fechas en el formato dd/mm/aaaa

Puede definirse el conjunto de fechas como un intervalo poniendo la cadena '-' (guión) entre el inicio y fin, o como un vector con todos los valores cuyos índices se desean consultar.

Cuando se especifican días de la semana o meses siempre deben existir al final de la cadena pasada como argumento las fechas de inicio y fin en formato dd/mm/aaaa.

◦ Salida: (idf, idc, ide, resultado)

Los tres primeros valores devueltos son vectores que contienen los índices a los que corresponden los valores de cada rango respecto a los

46

Page 15: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

Proyecto Fin de Carrera Enrique Molleja

vectores de fechas, columnas y empresas. El último valor, resultado, contiene una reducción de SDM para los índices de idf, idc, ide.

• descargarIndice, se encarga de descargar los datos desde la fuente indicada.

◦ Entrada: (fuente de los datos, empresas, vector de fechas, intervalo de datos).

Descarga las cotizaciones históricas de las empresas pasadas como argumento entre las fechas inicial y final del vector de fechas. El resto de parámetros son irrelevantes porque dependen de la fuente de los datos, en este caso Yahoo finanzas.

◦ Salida: (Matriz)

Son los datos de los archivos .csv descargados para cada una de las empresas indicadas.

• descargarComponentes, obtiene un vector con las empresas que componen un índice pasado como argumento.

◦ Entrada: (índice)

◦ Salida: cell de empresas que forman el índice de entrada.

• convertirFecha, si se le pasa como argumento un vector de números (índices del vector fechas), devuelve a qué fecha (cadena de texto) corresponde en nuestra base de datos. Si se pasa un vector de fechas (cadena) devuelve los índices.

3.2.4.3 Uso de las funciones

En este apartado se hace una pequeña introducción al uso de las diferentes funciones que forman la clase principal. Se describen algunas situaciones útiles que pueden plantearse al utilizar la clase.

Para utilizar las funciones y variables definidas en la clase es necesario crear siempre un objeto de la misma. En MATLAB, para crear un objeto de nombre 'obj' de la clase únicamente hay que hacer:

>> obj=BD;

A partir de ahora, en el script principal se usará 'obj' cada vez que se quiera hacer referencia al objeto.

Para acceder a las propiedades del objeto se utiliza el operador '.' (punto):

>> obj.empresas;

>> obj.fechas;

47

Page 16: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

3.2 Datos del modelo

>> obj.NOTDEF;

>> obj.SDM(:,2,1);

Para acceder a los métodos también se utiliza el operador '.' (punto):

>> obj.actualizarBD;

>> obj.consultarBD({'05/08/2002'}, {'Cerrar'}, {'^IBEX'});

Crear una base de datos con datos nuevos

La función crearBD solamente se debe usar si aún no existe el fichero de la base de datos. Puede definirse una ubicación para almacenar el fichero, pero si no se especifica una se tomará por defecto la indicada en la propiedad dirBD de la clase.

>> ubicacionBD = '/Datos/nuevaBD.mat';

En primer lugar hay que crear la instancia de la clase BD:

>> obj = BD(ubicacionBD);

Después se indican los parámetros necesarios a la función crearBD. Por ejemplo, para las empresas indicadas en el vector 'nuevas' mostrado a continuación se hace lo siguiente:

>> nuevas = {'TEF.MC' 'REP.MC' 'ACC.MC'};

>> obj.crearBD('01/01/2010', '01/10/2012', nuevas);

Si no se especifican empresas, se descargan las componentes del índice por defecto de la clase.

Tras la ejecución de estos comandos se genera el fichero que contiene la base de datos con el nombre y localización indicados en 'ubicacionBD' (o en el directorio por defecto de la clase). Dicho fichero almacena todos los elementos necesarios para el correcto funcionamiento de la base de datos.

Cargar datos desde un fichero de base de datos existente

En primer lugar hay que crear una instancia de la clase BD, si es que no ha sido creada aún. Indicando como parámetro el directorio donde está ubicada la base de datos si es necesario:

>> obj = BD;

48

Page 17: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

Proyecto Fin de Carrera Enrique Molleja

Ahora la constante NOTDEF de la que se habló antes está accesible. Puede accederse a ella mediante:

>> obj.NOTDEF;

Ampliar la base de datos con empresas nuevas

Por ejemplo puede utilizarse el índice EUROSTOXX (^STOXX50E) para generar una lista de empresas nuevas:

>> nuevos = obj.descargarComponentes('^STOXX50E');

Este último vector no incluye al propio índice, únicamente a sus componentes.

Ahora se une el nuevo índice a la lista de índices de la base de datos, y se actualiza con las nuevas empresas:

>> obj.indices = cat(1,obj.indices,{'^STOXX50E' 'EUROSTOXX'});

>> obj.actualizarBD(nuevos);

O puede ampliarse la base de datos con una sola empresa: Telefónica S.A.

>> obj.actualizarBD({'TEF.MC'});

Ampliar la base de datos con índices nuevos

Si se desea añadir un nuevo índice a la base de datos es necesario agregarlo primero el vector de índices:

>> indice = {'^NDX' 'NASDAQ-100'};

>> obj.indices = cat(1,obj.indices,indice);

>> obj.actualizarBD(indice);

Obviamente esto puede hacerse también con una lista de índices, así como mezclando índices y empresas en el mismo vector ya que la función de actualización es capaz de distinguir de qué tipo es cada elemento gracias que se añadió previamente el índice al vector de índices.

Consultar los datos

Para todos los ejemplos que se ponen, el separador '-' es interpretado como que las fechas son un rango (de A a B), si el separador no existe significa que las fechas son tratadas de manera individual (A, B, C).

49

Page 18: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

3.2 Datos del modelo

Por ejemplo, consultar entre el 5-sep-09 y el 5-oct-11, el valor de cierre para IBEX y EUROSTOXX:

>> consulta = {'^IBEX' '^STOXX50E'};

>> rango = {'05/09/2009' '-' '05/10/2011'};

>> [idf,idc,ide,resul] =...

>> obj.consultarBD(rango, {'Cerrar'} consulta);

Como puede verse se ha utilizado la secuencia de caracteres '…'. Esto indica a MATLAB que el comando aún no ha llegado al final y que continúa en una línea nueva. Aunque no es necesario su uso, se ha empleado aquí para hacer más legibles los comandos largos.

También puede consultarse por días de la semana. Para todos los lunes y miércoles entre el 5-sep-09 y el 5-oct-11 del vector de fechas de la base de datos, obtener el valor máximo y mínimo para Telefónica SA y Deutsche Telekom AG:

>> consulta = {'TEF.MC' 'DTE.DE'};

>> rango = {'lunes' 'miercoles' '05/09/2009' '05/10/2011'}

>> [idf,idc,ide,resul] =...

>> obj.consultarBD(rango, {'Maximo' 'Minimo'}, consulta);

O también por meses. Obtener los datos de valor máximo y volumen para IBEX, desde septiembre a octubre para los años entre 2005 y 2010:

>> rango = ...

>> {'septiembre' '-' 'octubre' '01/01/2005' '31/12/2010'};

>> [idf,idc,ide,resul] =...

>> obj.consultarBD(rango,{'Volumen'},{'^IBEX'});

Otro ejemplo, obtener las columnas 2 y 3 de los datos de la empresa con índice=4, entre las fechas con índices 25 al 100. Después buscar los elementos que no estan definidos:

>> inicio = obj.fechas(25);

>> fin = obj.fechas(100);

>> columnas = obj.columnas([2 3]);

>> rango = cat(2, inicio, {'-'}, fin);

>> [idf,idc,ide,resul] =...

>> obj.consultarBD(rango,columnas,obj.empresas(4));

50

Page 19: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

Proyecto Fin de Carrera Enrique Molleja

>> id = (resul==obj.NOTDEF);

Consultar la historia de un índice

Puede determinarse el conjunto de empresas que formaron parte de un índice entre dos fechas. Por ejemplo para el IBEX entre el 5-sep-09 y el 5-oct-11:

>> indice = {'^IBEX'};

>> inicio = '05/09/2009';

>> fin = '05/10/2011';

>> [idf,ide]= obj.historiaIndice(inicio, fin, indice, 10);

El último parámetro de la función indica que al menos deben devolverse 10 empresas que cumplan el criterio de búsqueda. Si se cumple esa condición se devuelven en el vector 'ide' los índices de las empresas encontradas, en caso contrario ese vector estará vacío. El vector 'idf' contiene los índices de las fechas entre inicio y fin.

Actualización de la base de datos

En general, para actualizar la base de datos, sólo es necesario llamar a la función actualizarBD cuando se sabe que hay actualizaciones disponibles, recordar que esta comprobación de las actualizaciones se hacía automáticamente al crear un objeto de la clase. Pero puede ocurrir, y de hecho ocurre con frecuencia, que al realizar dicha comprobación se detecte un cambio en la composición del índice utilizado. Cuando se presenta esta situación es necesario realizar una serie de tareas para mantener actualizada toda la base de datos, y especialmente las estructuras que almacenan la historia de cada empresa.

En primer lugar, hay que buscar qué empresas han entrado o salido del índice así como cuando lo hicieron. Para el IBEX, esa información puede consultarse en cualquiera de las páginas web de las bolsas españolas o en la de Bolsas y Mercados Españoles (BME).

Cuando se tiene la información hay que añadirla a la base de datos, y para ello se ha creado una función llamada datosEstructuras que lo único que contiene es una matriz con la información (código, nombre, sector, historia) de todas las empresas de la base de datos. Se trataría, por lo tanto, de modificar aquellas entradas que hayan cambiado y de agregar entradas para las empresas nuevas.

La función datosEstructuras recibe como argumento una variable que indica la última fecha disponible de la base de datos (actualmente), y devuelve la matriz con toda la información.

51

Page 20: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

3.2 Datos del modelo

Finalmente, hay que actualizar la base de datos utilizando la función actualizarBD con el parámetro de entrada igual a la salida de la función datosEstructuras.

En resumen, los pasos a seguir son:

1. Si comprobarActualizacion indica que hay cambios en la composición del índice:

1. Editar manualmente los cambios detectados en la matriz de la función datosEstructuras.

2. Ejecutar lo siguiente suponiendo que el objeto de la clase existe y se llama obj:

>> datos = obj.datosEstructuras(obj.actualmente);

>> obj.actualizarBD(datos);

2. Si comprobarActualizacion indica que hay una actualización disponible. Ejecutar lo siguiente suponiendo que el objeto de la clase existe y se llama obj:

>> obj.actualizarBD();

Búsqueda de información en el vector de estructuras

Por ejemplo puede obtenerse la estructura donde se almacena la información de BKIA.MC y conocer qué posición ocupa en el vector de estructuras haciendo lo siguiente:

>> id = find(ismember(obj.empresas,{'BKIA.MC'}));

>> struct = obj.datosempresas(id);

>> posicion = find([obj.datosempresas.codigo]==id);

O puede buscarse el índice de todas las empresas que pertenecen al mismo sector de actividad. Por ejemplo para buscar las empresas que se dedican a la banca se hace lo siguiente (suponiendo que 'Banca' es la cadena que corresponde a ese sector en el vector de sectores):

>> id = find(ismember(obj.sectores,{'Banca'}));

>> posicion = find([obj.datosempresas.sector]==id);

52

Page 21: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

Proyecto Fin de Carrera Enrique Molleja

3.2.5 Calidad de los datos descargados

Una vez definidas las funciones que se encargan de procesar la información descargada desde la fuente de información elegida, y sabiendo que la antigüedad de los datos es, en algunos casos, un problema se considera oportuno analizar la calidad de los datos históricos proporcionados por Yahoo.

Para realizar este estudio de calidad de la información se han calculado los porcentajes de datos disponibles para tres casos:

• para todas las empresas que han formado parte del IBEX desde que se publican datos para este índice.

• para el índice IBEX en sí mismo.

• finalmente, para aquellas empresas que han formado parte del IBEX de forma continua desde el año 2001 hasta el 2013.

En todos los casos se ha tenido en cuenta que un dato válido o disponible es aquel cuyo valor es distinto a NOTDEF, tal y como se explicó en el apartado 3.2.3. Los resultados pueden verse en las ilustraciones siguientes.

53

Ilustración 2: % de datos disponibles por año para todas las empresas

Page 22: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

3.2 Datos del modelo

54

Ilustración 4: % de datos disponibles para las empresas permanentes en el IBEX35 desde 2001

Ilustración 3: % de datos disponibles por año para el IBEX35

Page 23: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

Proyecto Fin de Carrera Enrique Molleja

Para calcular los porcentajes en el primer caso ha sido necesario obtener para cada año el número de empresas que componen el IBEX35, y para cada una de ellas se ha determinado el número de datos válidos para después dividirlo por el máximo teórico de datos que podría existir en un año, descontando fines de semana y festivos y suponiendo que siempre han sido 35 las empresas que han formado el IBEX35.

En el segundo caso se han contabilizado para cada año los datos válidos del IBEX y se han dividido por el total de datos contenidos en la matriz. En esta ocasión también se han descontando fines de semana y festivos.

Finalmente se han consultado las empresas que han formado parte del IBEX35 durante los años en los que el porcentaje de datos disponibles es mayor que el 50%, esto es entre el año 2001 y 2013. Después, para cada empresa se ha determinado el porcentaje de datos válidos de manera similar a los casos anteriores.

Como puede verse en la primera gráfica, la cantidad de información no disponible es mayor cuanto más antigua es la información histórica, lo cual se explica por la ausencia total de datos para aquellas empresas que han dejado de existir. Pero también puede verse en la muestra de empresas utilizada en la tercera gráfica que la cantidad de datos válidos es mucho mejor a partir del 2001.

Aunque durante las simulaciones se tendrán en cuenta estos resultados, se considera que la calidad de los datos es suficientemente buena como para llevar a cabo las mismas. Por otro lado intentar reemplazar los datos inexistentes mediante estimaciones no tendría sentido porque puede darse el caso de que un dato no esté disponible debido a que una empresa no cotizó ese día, lo cual no puede conocerse.

3.3 Filtrado de los datosComo se ha visto anteriormente muchos de los datos existentes en la base de

datos no son útiles o al menos, pueden suponer un problema durante el análisis de los mismos. Un caso particular de esa información, y cuya eliminación no es estrictamente un filtrado, es cuando por cualquier motivo no se dispone de un valor en un momento concreto de la historia. Esos datos son los que tienen valor NOTDEF en la base de datos, y deben ser borrados previamente antes de realizar cualquier estudio de los mismos. De este modo se consigue evitar saltos en las gráficas, inconsistencia en el tamaño de tablas o tener que considerar su presencia cada vez que se crea un algoritmo nuevo.

A continuación se presentan los filtros utilizados sobre la información histórica y cuya razón de ser es la de servir para mejorar los resultados de la predicción cuando son utilizados.

55

Page 24: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

3.3 Filtrado de los datos

3.3.1 Eliminación de datos fuera del límite (outliers)

Un outlier es un dato que queda fuera de la línea de tendencia principal, y su presencia puede representar un ruido que afecte a los resultados obtenidos. Estas desviaciones en los datos pueden ser debidas a la ocurrencia de eventos no previsibles o bien a mecanismos no controlables del mercado financiero.

Para mitigar los efectos de los datos outliers en el aprendizaje puede aplicarse la técnica de suavizado (smoothing). El método de suavizado más sencillo, conocido como binning y que puede verse en [8], consiste en reemplazar los outliers por la media de los valores precedente y siguiente.

Para la detección de los outliers se mide la diferencia entre dos muestras consecutivas de los datos. La presencia de un incremento o decremento abrupto justo en el punto precedente al punto donde las diferencias son grandes indica la presencia de un outlier. Una vez detectados los outliers son reemplazados por la media de los valores precedente y siguiente de la serie.

Aunque lo expuesto anteriormente tiene validez para el propósito buscado, definir cuándo un incremento es grande o pequeño tiene su dificultad. Por ese motivo se utilizará como criterio de decisión el volumen de contratación, dato del que se tiene información histórica tanto a nivel de índice general como de valores en particular.

Cuando se observan las subidas y bajadas de un índice bursátil, no siempre se presta atención a los índices generales y, en menos casos todavía, se observan valores concretos. Normalmente esto se hace si se tiene algún interés directo en alguno o algunos de ellos. No obstante a la hora de informarse sobre la bolsa tan importante es ver los índices como estar atentos al volumen de contratación.

El volumen de contratación, o volumen de negocio, es un indicador que tiene importancia en la toma de decisiones. Este índice nos informa de la cantidad de dinero en compraventas que se ha negociado en un determinado valor o en los índices generales. Normalmente, cuando el volumen es alto, puede valorarse una subida o bajada del índice como más significativa que en el caso de un volumen bajo. Además la probabilidad de que en las siguientes fechas dicho valor siga subiendo son mucho mayores ya que al hecho de que se esté vendiendo a mayor precio se une el de que existe una gran demanda del mismo valor. Este criterio opera también para las bajadas, una bajada de un valor con un índice de contratación masivo suele anunciar una caída muy pronunciada.

En cambio un volumen de contratación muy bajo puede suponer una subida muy puntual, incluso de un solo día, causada por ejemplo por una compra masiva puntual de una cantidad de valores determinados por un fondo de inversión. Pasada esta circunstancia la subida no tiene porque continuar24.

24 Ver http://econobolsa.com/la-importancia-del-volumen-de-contratacion/2011/04/11

56

Page 25: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

Proyecto Fin de Carrera Enrique Molleja

Por lo tanto, el uso del volumen como indicador reduce la influencia de factores externos que pueden originar outliers y provocar falsas señales.

El filtro se ha implementado mediante la función eliminarOutliers.

• eliminarOutliers, se encarga de comprobar que las variaciones entre días consecutivos (en valor absoluto) no superen un cierto umbral. En caso de superar el umbral se decide si esa variación debe ser tenida en cuenta, para ello se evalúa la media del volumen de contratación y si para ese día el volumen está por debajo de la media se descarta el valor antiguo y se calcula un nuevo valor, el cual viene dado por la media entre el dato de cierre de ese día y el anterior.

◦ Entrada1: (puntos, idvol, umbral)

La función recibe como entradas por una parte los puntos con la información histórica que se desea filtrar. Esos datos deben contener todas las columnas de la base de datos. Por otra parte, se pasa como argumento el umbral utilizado para decidir qué puntos son outliers o no. Este último valor viene dado entre 0 y 1.

El parámetro idvol sirve para indicar a la función cuál es el índice de la columna donde está la información del volumen.

◦ Salida: (puntos)

La función devuelve los datos de entrada pero ya filtrados.

En la ilustración 5 puede observarse el efecto del filtrado sobre unos datos históricos de ejemplo. Además se representan las variaciones diarias del cierre, junto al valor del volumen, y cómo se ha utilizado esa información para tomar la decisión.

En la primera gráfica se observa el volumen y su valor medio. Junto con la segunda gráfica, que representa la variación diaria entre dos días consecutivos, se puede obtener el conjunto de puntos que deben ser sustituidos por la media, y que vienen representados como un punto de color rojo. Estos puntos son aquellos que superan el umbral y además tienen un valor de volumen demasiado bajo (menor a la media).

En la tercera gráfica se han sustituido los puntos outliers detectados antes por las medias correspondientes. La línea de color azul representa el valor final de cierre después del filtrado, y las zonas en rojo son el valor anterior a la sustitución. Las diferencias entre el valor anterior y posterior al filtrado se pueden observar en la cuarta gráfica, que representa el porcentaje que ha variado (o que se ha suavizado) la información histórica original.

57

Page 26: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

3.3 Filtrado de los datos

58

Ilustración 5: Filtrado de outliers

Page 27: Capítulo 3 - Universidad de Sevillabibing.us.es/proyectos/abreproy/12116/fichero/Capitulo3.pdf · que se trata de un lenguaje basado en scripts, la creación de programas y su depuración

Proyecto Fin de Carrera Enrique Molleja

3.4 ConclusionesEn este capítulo se han presentado aquellas herramientas que van a permitir

continuar con el desarrollo del proyecto. La obtención de datos históricos, así como la definición de aquellas funciones que servirán de interfaz para que se pueda acceder a la base de datos, suponen una parte importante del proyecto, no solo en términos de tiempo dedicado, sino porque su correcta definición servirá para que estos recursos puedan ser utilizados en otros contextos y en otros trabajos.

A modo de resumen, dentro de las tareas descritas en este capítulo se han visto las siguientes:

• Definición del lenguaje de programación utilizado.

• Búsqueda de los datos históricos y programación de las funciones encargadas de gestionar la base de datos.

• Análisis de la calidad de los datos obtenidos.

• Filtrado de los datos para evitar que una información incorrecta pueda afectar a las predicciones.

59