Usando Python y Pandas Datareader Para Analizar Datos Financieros

Las finanzas y la economía son cada vez más interesantes para todo tipo de personas, independientemente de su carrera o profesión. Esto se debe a que a todos nos afectan los datos económicos, o al menos nos interesa cada vez más estar al día, y tenemos mucha información a la mano.

Cada día se envían miles de millones de bytes de datos financieros a través de Internet. Ya sea el precio de una acción, una transacción de comercio electrónico o incluso información sobre el PIB de un país. Todos estos datos, cuando se organizan y gestionan adecuadamente, pueden utilizarse para construir algunas aplicaciones de software sorprendentes y perspicaces.

Utilizaremos Python para acceder a datos financieros públicos, organizarlos y combinarlos para obtener nuevos conocimientos sobre cómo el dinero hace girar el mundo. Nos centraremos principalmente en dos módulos de Python:

Utilizaremos estos módulos para importar datos de algunas de las mayores organizaciones financieras del mundo, así como datos almacenados localmente en nuestros ordenadores. Al final del post, deberías sentirte cómodo importando datos financieros, ya sea de una fuente pública o de un archivo local, en Python, organizando esos datos y combinándolos entre sí

Importación de datos a través de Datareader

Muchas instituciones financieras, mercados de valores y bancos globales proporcionan al público grandes cantidades de datos que almacenan públicamente. La mayoría de estos datos están bien organizados, se actualizan en directo y son accesibles mediante el uso de una interfaz de programación de aplicaciones (API), que ofrece a los lenguajes de programación como Python una forma de descargarlos e importarlos.

El módulo pandas-datareader está específicamente diseñado para interactuar con algunas de las APIs de datos financieros más populares del mundo, e importar sus datos en un DataFrame de pandas fácilmente digerible. Se accede a cada API financiera mediante una función diferente expuesta por pandas-datareader. Generalmente, el acceso a cada API requiere un conjunto diferente de argumentos e información que debe proporcionar el programador.

Vamos a importar datos de varias de estas API y a jugar con ellos. Para una lista completa de todos los datos a los que puede acceder el pandas-datareader, puedes consultar la documentación oficial.

Vamos a hacer un pequeño programa que utilice pandas-datareader para obtener los datos de la API gdp del Banco Mundial. Primero instalaremos la librería de la siguiente manera (Por favor, ejecuta el comando por tu cuenta en la siguiente celda, ¡ya la tengo instalada!)

!pip3 install pandas_datareader

Aquí hemos importado los datos del Banco Mundial a través de wb. Y hemos importado la librería python datetime, para poner las fechas de inicio y fin en las que quiero hacer el análisis. Para más información sobre Python Datetimes ver este otro articulo!

El método download tiene diferentes parámetros que podemos pasar para obtener los datos del Banco Mundial. Entre ellos está el indicator_id. Puedes encontrar más información sobre los parámetros aquí.

Como podemos ver, con este comando hemos obtenido los datos del PIB per cápita de 3 países en una fecha determinada

Obtener los símbolos del NASDAQ

El mercado de valores NASDAQ identifica cada una de sus acciones con un símbolo único:

También proporciona una útil API para acceder a los símbolos que se negocian actualmente en ella. Pandas-datareader proporciona varias funciones para importar datos de la API de NASDAQ a través de su submódulo nasdaq_trader.

Para importar la lista de símbolos bursátiles, queremos utilizar la función get_nasdaq_symbols de nasdaq_trader. Se hace de esta manera

Cuando se llame, irá a la API de NASDAQ, e importará la lista de símbolos que se están negociando actualmente. La ventaja de usar pandas-datareader es que toda la lógica para interactuar con la API de NASDAQ o cualquier otra API está encapsulada en submódulos y funciones fáciles de usar como las anteriores.

Tenemos un total de 9.338 acciones diferentes que cotizan en el Nasdaq, y en cuyas columnas tenemos diferente información económica y financiera sobre esa acción. Pero, ¿qué ocurre si queremos acceder a un solo símbolo/acción?

Análisis técnico en finanzas

El análisis técnico en finanzas es el tipo de análisis que se realiza mediante estadísticas y gráficos sobre acciones (o índices en nuestro caso). Vamos a ver cómo hacer algo muy sencillo con 'Plotly' una librería de Python para hacer gráficos. En este caso accederemos a las cotizaciones diarias de Microsoft. ¡Vamos a hacerlo!

Hemos accedido a los datos de MSFT. Lo hemos hecho importando .data de datareader y dándole el alias web. Bajo el capó estamos usando Yahoo Finance para importar los datos desde una API, pero en este caso pandas.datareader nos ha permitido hacerlo de forma muy sencilla. Ahora vamos a graficar el resultado para hacer un Análisis Técnico.

¡Acabamos de hacer algo muy interesante y es graficar la acicón de MSFT con los datos actualizados! ¡Hoy es 5 de Febrero de 2021, por lo que el último dato de mi gráfico es esa fecha, tú puedes hacer lo mismo, colocar el mouse al final del gráfico y ver la última cotización de la acción! ¡Podrías en este caso acceder a tu cartera de inversiones y ejecutar el código diariamente y hacer un análisis técnico sobre esas entradas!

Filtrado de datos por fecha

Muchas de las APIs a las que se conecta el pandas-datareader nos permiten filtrar los datos que obtenemos por fecha. Las instituciones financieras suelen llevar un registro de datos que se remonta a varias décadas atrás, y cuando importamos esos datos, es útil poder especificar exactamente cuándo queremos que procedan

Una API que hace precisamente eso es la del Banco de la Reserva Federal de San Luis (FRED), a la que podemos acceder importando primero el submódulo pandas_datareader.data y llamando después a su función DataReader:

La función DataReader toma 4 argumentos:

Cambiando las fechas de inicio y fin, podemos filtrar fácilmente los datos que recibimos

Usando la operación Shift()

Una vez que hemos importado un DataFrame lleno de datos financieros, hay algunas formas muy interesantes de manipularlo. En este ejercicio veremos la operación shift(), una función de DataFrame que mueve todas las filas de una columna hacia arriba o hacia abajo

Screenshot%20from%202021-02-05%2010-07-52.png

Screenshot%20from%202021-02-05%2010-08-01.png

Shift() puede ser llamado en una sola columna (como en la imagen de arriba), o en todo el DataFrame donde todas las columnas serán desplazadas. También puede desplazarse por más de una fila, y en cualquier dirección.

# desplaza todas las filas hacia abajo en 1
dataframe.shift(1)

# desplaza todas las filas de la columna nombre hacia arriba 5
dataframe[name].shift(-5)

# desplaza todas las filas de la columna del nombre hacia abajo 3
dataframe[name].shift(3)

Shift es especialmente útil cuando se trata de datos financieros. Por ejemplo, se puede utilizar para ayudar a calcular el porcentaje de crecimiento entre una fila y la siguiente, o para encontrar la diferencia en los precios de las acciones durante una serie de días. Veamos un ejemplo

Hemos importado el GDP del FRED, ahora crearemos una nueva columna llamada Growth donde podremos hacer el cálculo de la diferencia (en valores absolutos) entre los diferentes días

Ahora podemos ver las diferencias absolutas en esta nueva columna. Una aclaración importante: la primera fila de la columna de crecimiento es ahora NaN porque no tiene nadie con quien hacer el cálculo, es la primera fila del conjunto de datos

Cálculo de estadísticas financieras básicas

Dos cálculos útiles que se pueden hacer con los datos financieros son la varianza y la covarianza. Para ilustrar estos conceptos, utilicemos el ejemplo de un DataFrame que mide los precios de las acciones y los bonos a lo largo del tiempo

Screenshot%20from%202021-02-05%2010-10-58.png

Varianza

La varianza mide la distancia entre un conjunto de números y su media. En finanzas, se utiliza para determinar la volatilidad de las inversiones.

dataframe['acciones'].var() # 106427
dataframe['bonos'].var() # 2272

En los cálculos de varianza anteriores, el valor de las acciones es mayor que el de los bonos (106427 frente a 2272). Esto se debe a que los precios de las acciones están más dispersos que los de los bonos, lo que indica que las acciones son una inversión más volátil.

Covarianza

La covarianza, en un contexto financiero, describe la relación entre los rendimientos de dos inversiones diferentes a lo largo de un periodo de tiempo, y puede utilizarse para ayudar a equilibrar una cartera. Llamar a nuestras columnas de acciones y bonos cov() produce una matriz que define los valores de covarianza entre cada par de columnas en el DataFrame. La covarianza también se conoce como correlación en finanzas. En nuestros datos de ejemplo, cuando los precios de las acciones suben, los bonos bajan. Podemos utilizar la función de covarianza para ver esto numéricamente.

dataframe.cov()

El código anterior produce la siguiente salida de DataFrame:

Screenshot%20from%202021-02-05%2010-12-13.png

Cada valor anterior representa la covarianza entre dos columnas. Cuanto más alto sea el número, más tienden las inversiones a subir y bajar al mismo tiempo. Las columnas superior derecha e inferior izquierda representan la covarianza entre acciones y bonos. Aquí tenemos un número negativo, que indica que las acciones y los bonos tienden a moverse en direcciones diferentes. Para ver esto con un ejemplo, vamos a hacer un ejercicio más complejo, ¡vamos!

Cálculo de la rentabilidad logarítmica

La rentabilidad logarítmica es uno de los tres métodos para calcular la rentabilidad y supone que los rendimientos se componen de forma continua y no a través de subperíodos. Se calcula tomando el logaritmo natural del valor final dividido por el valor inicial.

Como ejemplo, digamos que el valor final de una inversión fue de 11 dólares y el valor inicial de 10 dólares. La función diría =LN(11/10) para un resultado de 9,53%.

En matemáticas y estadística, se suele distinguir entre datos discretos y continuos. El retorno aritmético es la versión continua más teórica. En el mundo real, sin embargo, la mayoría de la gente piensa en rendimientos divididos en períodos discretos.

Así que el retorno logarítmico es la versión no discreta, continua, lo que significa que si todo el período se dividiera en un número infinito de períodos, ¿cuál sería ese retorno? Como ves, es teórico.

Salvo para periodos de tiempo muy cortos (menos de un día), y para aplicaciones teóricas que impliquen el cálculo y la medición precisa de curvas, los rendimientos logarítmicos no se suelen utilizar.

Los datos de los precios son útiles, pero en este caso, ya que queremos comparar cada conjunto de datos, sería aún mejor si en lugar de los precios diarios/anuales, tuviéramos información sobre los rendimientos de los precios diarios/anuales.

Como primer paso, vamos a definir una función llamada log_return, que debería aceptar un parámetro, los precios.

La ecuación para calcular la rentabilidad logarítmica entre dos precios es la siguiente log_natural(precio actual/precio anterior)

En nuestro caso queremos ejecutar esta ecuación para cada día/año de datos de precios en nuestra serie de DataFrame importada (la serie A es una sola columna en un DataFrame).

La función pandas shift (sifth()) se puede utilizar para dividir cada precio actual por su precio anterior en la serie.

precios / precios.shift(1)

Y podemos utilizar la función de logaritmo natural de Numpy para obtener el rendimiento logarítmico de cada entrada de la nueva Serie.

import numpy as np
np.log(Series)

Hagámoslo

Utilicemos nuestra nueva función log_return para calcular el rendimiento logarítmico del DataFrame del Nasdaq, el PIB y otro indicador que ya hemos cargado

Ahora vamos a pasar cada variable a la función log_return.

Comparación de la volatilidad de los rendimientos

Ahora estamos preparados para comparar la volatilidad de cada tipo de datos. Recordemos que la varianza, en el contexto de los datos financieros, nos indica la volatilidad de una inversión. Utilizaremos la función var() de Pandas para calcular la varianza de los rendimientos de las acciones y de los datos del Banco Mundial, e imprimiremos los resultados.

Los resultados pueden interpretarse de varias maneras, pero en general, cuanto mayor sea la varianza, más volátiles serán los datos.

¿Qué conclusiones se pueden sacar de estos datos? ¿Qué conjunto de datos fue el más volátil? ¿Algún conjunto de datos tenía varianzas similares?

serie sap: sap: 8,860342194008153e-05 que equivale a 0,00008860342194008153

El S&P 500, un conjunto de 500 grandes empresas que cotizan en las bolsas de Estados Unidos, es el que tiene la menor variación y, por tanto, el menos volátil. Como el índice S&P 500 es una medida ponderada de muchos valores de diversos sectores, se considera una inversión más segura y diversificada.

Las acciones son interesantes. El NASDAQ 100 es más volátil que el S&P 500, lo cual, si lo pensamos bien, tiene sentido ya que el S&P 500 está mucho más diversificado y sigue más de cerca al mercado.

Por último, tenemos el PIB y las exportaciones.

Las exportaciones son muy volátiles, lo que podría tener que ver con las industrias que se han trasladado al extranjero en los últimos 20 años, y la competencia mundial para la producción de bienes.

En realidad, el PIB es bastante similar al NASDAQ 100 en términos de volatilidad, lo cual es quizás una correlación interesante.

Espero que haya disfrutado y aprendido de esta lectura!