Descargar el último año de dividendos en el Nasdaq con Python y Yahoo_fin.
Yahoo_fin es un paquete de Python 3 diseñado para extraer datos históricos de precios de acciones, así como para proporcionar información actual sobre límites de mercado, rendimientos de dividendos y qué acciones comprenden las principales bolsas.
Entre sus principales funcionalidades tenemos:
- Recopilación de estados de resultados, balances, flujos de efectivo
- Información de la empresa
- Datos de analistas
- Precios de acciones en tiempo real
- Capturar datos de criptomonedas
- Obtener las acciones negociadas más activamente en un día de negociación actual
- Recuperar los precios de las opciones y las fechas de vencimiento.
- Rastrear el historial del calendario de ganancias
- RSS de noticias financieras
En este artículo nos centraremos en la descarga de la información fiscal, exactamente explicaremos cómo obtener el histórico de dividindo proporcionado un ticker y almacenar el resultado en un fichero .csv para su posterior consulta.
Instalación del paquete y preparación del entorno.
Para poder llevar a cabo el proyecto, el primer paso es ejecutar el siguiente comando para descargarse el proyecto del repositorio github.
git clone https://github.com/al118345/Analisis_Financiero.git
Una vez ya hemos descargado el proyecto, el siguiente paso es configurar nuestro entorno de programación python descargando todas las librerías necesarias para el proyecto
pip install -r requirements.txt
El proyecto que vamos a gestionar, esta almacenado en el directorio
obtener_historico_dividendos y esta compuesto por dos ficheros:
historico_dividendos.py y
tickers.csv
EL fichero
tickers.csv tiene almacenado un listado de tickers (abreviaturas de las empresas) a consultar. El formato del fichero tiene que ser como se muestra a continuación:
MO
JNJ
SCU
AWK
CB
EL fichero
historico_dividendos.py contiene el código que explicaremos en el siguiente apartado.
Explicación del fichero historico_dividendos.py
Este fichero contiene el siguiente código:
from yahoo_fin import stock_info as si
from datetime import datetime, timedelta, date
import pandas as pd
def tabla_div():
df = pd.read_csv('tickers.csv', header=None, encoding='utf-8')
tickers = df[0].to_list()
df = pd.DataFrame()
cont= 0
for ticker in tickers:
try:
one_day = timedelta(days=600)
first_day_of_the_month = date.today().replace(day=1)
fecha_de_inicio = first_day_of_the_month - one_day
aux_div = si.get_dividends(ticker, start_date=fecha_de_inicio)
df2 = pd.DataFrame(index=aux_div.index.astype(str).to_list(), data=aux_div['dividend'].tolist(),
columns=[ticker])
df= pd.concat([df2,df],axis=0)
df = df.sort_index(ascending=False)
cont = cont +1
except Exception as error:
print(str(error))
print(ticker)
continue
df.to_csv('resultados_dividendos.csv', index = True)
if __name__ == '__main__':
tabla_div()
Dentro del código expuesto anteriormente, la primera parte corresponde a la carga del fichero tickers.csv con la librería panda de Python. El código es el siguiente:
df = pd.read_csv('tickers.csv', header=None, encoding='utf-8')
tickers = df[0].to_list()
El código continua creando un dataframe vacio dónde se almacenará toda la información que nos proporcione Yahoo_fin. A partir de este momento, lo único que vamos a realizar es una iteración que dependerá de la cantidad de valores almacenados en el fichero tickers.csv.
df = pd.DataFrame()
cont= 0
for ticker in tickers:
try:
one_day = timedelta(days=600)
first_day_of_the_month = date.today().replace(day=1)
fecha_de_inicio = first_day_of_the_month - one_day
aux_div = si.get_dividends(ticker, start_date=fecha_de_inicio)
df2 = pd.DataFrame(index=aux_div.index.astype(str).to_list(), data=aux_div['dividend'].tolist(),
columns=[ticker])
df= pd.concat([df2,df],axis=0)
df = df.sort_index(ascending=False)
cont = cont +1
except Exception as error:
print(str(error))
print(ticker)
continue
En este punto es importante analizar que tipo de información nos proporciona el método
get_dividends(). Para ello os dejo la siguiente tabla:
| dividend | ticker |
---|
2019-08-26 | 0.95 | JNJ |
2019-11-25 | 0.95 | JNJ |
2020-02-24 | 0.95 | JNJ |
2020-05-22 | 1.01 | JNJ |
2020-08-24 | 1.01 | JNJ |
2020-11-23 | 1.01 | JNJ |
2021-02-22 | 1.01 | JNJ |
Además, no queremos la información completa, con los últimos dividendos nos vale. Por ello crearemos la variable fecha_de_inicio que contiene el resultado de restar a la fecha de hoy 600 días. Una vez realizada la operación, simplemente realizamos la consulta de la siguiente forma:
one_day = timedelta(days=600)
first_day_of_the_month = date.today().replace(day=1)
fecha_de_inicio = first_day_of_the_month - one_day
aux_div = si.get_dividends(ticker, start_date=fecha_de_inicio)
El resultado lo añadimos al dataframe obtenido al principio. Importante ordenarlo por fecha.
df2 = pd.DataFrame(index=aux_div.index.astype(str).to_list(), data=aux_div['dividend'].tolist(),
columns=[ticker])
df= pd.concat([df2,df],axis=0)
df = df.sort_index(ascending=False)
cont = cont +1
El resultado es almacenado en un fichero
resultados_dividendos.csv' con el siguiente formato:
| CB | AWK | SCU | JNJ | MO |
---|
2021-03-24 | | | | | 0.86 |
2021-03-18 | 0.78 | | | | |
2021-02-24 | | | 2.35 | | |
2021-02-22 | | | | 1.01 | |
2021-02-05 | | 0.55 | | | |
2020-12-24 | | | | | 0.86 |
2020-12-17 | 0.78 | | | | |
2020-11-23 | | | | 1.01 | |
2020-11-09 | | 0.55 | | | |
2020-09-17 | 0.78 | | | | |
2020-09-14 | | | | | 0.86 |
2020-08-24 | | | | 1.01 | |
2020-08-11 | | 0.55 | | | |
2020-06-18 | 0.78 | | | | |
2020-06-12 | | | | | 0.84 |
2020-05-22 | | | | 1.01 | |
2020-05-11 | | 0.55 | | | |
2020-03-24 | | | | | 0.84 |
2020-03-19 | 0.75 | | | | |
2020-02-24 | | | 0.53 | | |
2020-02-24 | | | | 0.95 | |
2020-02-06 | | 0.5 | | | |
2019-12-24 | | | | | 0.84 |
2019-12-19 | 0.75 | | | | |
2019-11-25 | | | | 0.95 | |
2019-11-15 | | | 0.03 | | |
2019-11-08 | | 0.5 | | | |
2019-09-19 | 0.75 | | | | |
2019-09-13 | | | | | 0.84 |
2019-08-26 | | | | 0.95 | |
2019-08-13 | | | 0.32 | | |
El código utilizado es:
df.to_csv('resultados_dividendos.csv', index = True)
Si lo desea puede consultar el el siguiente video explicativo
https://www.youtube.com/watch?v=v3LNklgOvvc: