Base de Datos auto-actualizable de cotizaciones históricas descargadas de Yahoo Finance

Escrito por Manuel el diciembre 1, 2011

Una cosa que he querido hacer es tener una base de datos (más adelante BBDD) de cotizaciones históricas de los subyacentes con los que trabajo, sigo o me interesan. He realizado un programa en JAVA al cual le indicamos mediante un fichero properties los subyacentes de los cuales queremos tener las cotizaciones históricas. El programa está hecho para que cada vez que se quiera se ejecute y actualice las cotizaciones a las últimas registradas en Yahoo Finance desde el último registro que se tenga en nuestra BBDD. Yo tengo el script en una tarea programada para que todos los días a las 01:00 de la mañana se ejecute y actualice mi BBDD. Si se quiere añadir un subyacente a nuestra BBDD lo único que tenemos que hacer es añadir su código de Yahoo Finance al properties y la próxima vez que se ejecute el programa añadirá todas sus cotizaciones. Mi recomendación es que se haga una planificación nocturna de la ejecución del programa para que no cargue la máquina cuando estamos trabajando con ella y con mucha más razón si nuestra lista de subyacentes a descargar es considerablemente grande. A continuación dejo un diagrama UML donde se ven las propiedades y métodos de cada una de las clases. No he dibujado las referencias con otras clases ni entre ellas porque entonces las líneas hacían que el gráfico fuera ilegible.

Es muy útil poseer estos datos para programas que se desarrollen y necesiten de las cotizaciones de diversos subyacentes, ya sean por ejemplo programas de análisis técnico o uno que me gustaría empezar a desarrollar que sería un programa que busca patrones repetidos a lo largo de estos últimos años, es decir, de fractales.

Una vez explicado el funcionamiento del programa voy a explicar los pasos para poder tener la BBDD y poder utilizar el programa que he desarrollado.

En primer lugar, esta primera versión del programa está realizado para la utilización de una BBDD MySQL, por lo que el primer paso es descargar e instalar el servidor de MySQL, el cual es gratuito, la página es la siguiente: http://dev.mysql.com/downloads/installer/

Después de instalar el gestor de MySQL, el siguiente paso es ejecutar el script SQL que se incluye en el ZIP que proporciono, el nombre del fichero es mysql_script.sql. Hay que tener en cuenta que este script solo debe ejecutarse la primera vez de la instalación. Se crearán dos tablas, una llamada equity en la que se encuentran cada uno de los subyacentes que tenemos en BBDD y otra llamada prices en la que están todas las cotizaciones y datos que se descargan de Yahoo Finance, siendo éstos los siguientes: apertura, máximo, mínimo, cierre, volumen y cierre ajustado (precio de cierre ajustado por dividendos y splits) además de la fecha de esas cotizaciones. Si se quiere trabajar con datos de cierre debe utilizarse el valor del cierre ajustado. En la tabla equity he añadido el campo nombre y país, pero el programa no los rellena por lo que si se quiere tener esos datos rellenos habrá que hacerlo manualmente, no afecta en nada a la ejecución del programa el tenerlos rellenos o vacíos. Aquí os dejo un diagrama E-R de la BBDD para que se vea que es muy simple y fácil de comprender.

En segunda instancia tenemos que tener instalado JAVA en nuestro PC, con la versión de JRE es suficiente ya que solo se necesita ejecutar y no compilar (esto ha sido cosa mía). Os dejo la página de Oracle donde podéis descargar la última versión: http://www.oracle.com/technetwork/java/javase/downloads/jre-7u1-download-513652.html

El tercer paso que tenemos que hacer para poner el programa a punto es la configuración del fichero properties que se llama bbddyahoo.properties, lo primero decir que este fichero debe llamarse así, si no gusta el nombre que le he dado hay que aguantarse ya que si se cambia el nombre el programa no encontrará el fichero y no funcionará, al igual que la ruta donde debe ubicarse es dentro de la carpeta donde se encuentran las librerias y el ejecutable. Los datos que deben configurarse en el properties son los siguientes:

#BBDD Fields
login_bbdd=manuel
password_bbdd=manuel01
host_bbdd=localhost
bbdd=market

#Equities
equities=POP.MC,REP.MC,^IBEX

#Log4J
levelLog4J=DEBUG

#Salida a Internet por Proxy
#Basta con dejar vacios estos campos para indicar al programa que no se utiliza el proxy
#al igual que la autenticacion, se deja en blanco si el proxy no necesita login y password
host_proxy=
port_proxy=
user_proxy=
password_proxy=

– El primer bloque de campos son los referentes a la BBDD, es decir, el usuario, contraseña, nombre o IP de máquina donde se encuentra la BBDD y el esquema (este último se llama market porque es el nombre que le he dado en el script sql, por lo que si se desea otro nombre debe cambiarse en el script sql antes de su ejecución y poner aquí el nombre elegido).

– En el segundo bloque se encuentra la propiedad equities en la que pondremos separados por comas los códigos de los subyacentes de los que queremos tener sus cotizaciones.

– El tercer bloque tiene el nivel que queremos tener en el log que devuelve la ejecución del programa, recomiendo dejar DEBUG para tener un log bastante explícito.

– En el cuarto lugar están las propiedades de un proxy por si la salida a internet en vuestro ordenador se hacen a través de un proxy. En mi caso están en blanco porque en casa no tengo proxy, pero por ejemplo, en el trabajo si quisiera ejecutar el programa debería tener rellenos estos campos.

Una vez se tienen todos los pasos configurados ya podemos ejecutar la aplicación mediante el ejecutable que va dentro del ZIP y que recuerdo que debe encontrarse en la misma carpeta donde están las librerías y el fichero properties. He creado dos ejecutables, un .bat para windows y un .sh para linux para que se pueda tener la BBDD en cualquiera de estos dos sistemas operativos. Cada ejecución almacenará la salida de la ejecución en un fichero llamado importYahooFinance.log que se almacenará en el directorio temporal del sistema operativo, ya sea en C:\TEMP en Windows o en /tmp si se trata de LINUX.

Aquí os dejo una ejecución de que se vería en el log:

2011-11-29 15:10:22,609 INFO  Se va a empezar el proceso de carga de datos procedente de http://finace.yahoo.com en MySQL.
2011-11-29 15:10:23,031 INFO  Conexión a base de datos jdbc:mysql://localhost/market creada correctamente.
2011-11-29 15:10:23,875 INFO  Se inicia el procesamiento de IDR.MC.
2011-11-29 15:10:24,359 INFO  El procesamiento de IDR.MC ha finalizado.
2011-11-29 15:10:24,938 INFO  Se inicia el procesamiento de POP.MC.
2011-11-29 15:10:25,172 INFO  El procesamiento de POP.MC ha finalizado.
2011-11-29 15:10:25,750 ERROR El codigo del subyacente REP.MA no existe en YahooFinance.
2011-11-29 15:10:26,094 INFO  Se inicia el procesamiento de REP.MC.
2011-11-29 15:10:26,281 INFO  El procesamiento de REP.MC ha finalizado.
2011-11-29 15:10:26,844 INFO  Se inicia el procesamiento de ^IBEX.
2011-11-29 15:10:27,000 INFO  No se han encontrado cotizaciones mas actualizadas para ^IBEX que las que se encuentran en BBDD.
2011-11-29 15:10:27,000 INFO  El procesamiento de ^IBEX ha finalizado.
2011-11-29 15:10:27,000 INFO  La conexión a la base de datos jdbc:mysql://localhost/market ha sido cerrada.
2011-11-29 15:10:27,000 INFO  Proceso de carga de datos en MySQL finalizado.

Una vez explicada la configuración y como debe ejecutarse el programa, os pongo el enlace al .ZIP para que lo descarguéis, el zip contiene los siguientes ficheros:

– Un .zip con toda la documentación generada de la API, por si quiere alguien integrar la aplicación con otra propia.

– Fichero mysql_script.sql con el script que hay que ejecutar una vez se ha instalado MySQL.

– Una carpeta que contiene los 3 .jar que componen el programa, uno con los drivers de MySQL, otro con los de Log4J y el tercer jar que contiene mi código fuente implementado, el fichero properties que comenté anteriormente y los dos ejecutables de aplicación, uno para Windows (.bat) y otro para Linux (.sh).

BBDDYahoo_Finance

Para la correcta ejecución del programa deben estar en la misma carpeta los 3 .jar, el .properties y el ejecutable a no ser que sea editado para que vaya a buscar el .jar a la ruta que se desee por lo que es recomendable no cambiar el contenido de la carpeta que pongo dentro del .zip.

Por favor, si alguien detecta un error o una mejora que pudiera implementarse, que se ponga en contacto conmigo para realizar dicha mejora en el código y subir el nuevo programa. Lo que más me interesa es corregir los posibles errores. Yo he hecho un ciclo de pruebas completo pero como se sabe, las pruebas de cualquier programa son mejores si no las realiza la persona que ha implementado el código. Como siempre comento, para ponerse en contacto conmigo, a través de un comentario o a través del correo electrónico del pie de página de mi web personal.

Si alguien crea alguna aplicación interesante o utiliza la BBDD para cualquier uso espero que funcione correctamente y si alguien tiene una gran idea de un programa que utilice la BBDD que no dude en comentármelo por si puedo colaborar haciendo mejoras en este programa o en el programa que esté implementando.

1Dic