Descargar dividendos recientes con Python, pandas y Yahoo_fin.
Yahoo_fin es un paquete de Python 3 diseñado para hacer scraping de 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.Nota actual sobre fuentes de datos financieros
Este artículo debe leerse como flujo didáctico, no como recomendación de inversión ni como fuente de datos de mercado para producción. Librerias como yahoo_fin dependen de acceso no oficial a datos de Yahoo Finance y pueden fallar si cambian páginas, endpoints o condiciones. Antes de usar el CSV en una decisión real, valida los dividendos contra un proveedor oficial, la página de relación con inversores de la empresa o tu broker, y revisa moneda, fechas ex-dividendo y acciones corporativas.
Para un proyecto en producción, separa el ejercicio del contrato de datos: cachea respuestas, registra tickers fallidos, reintenta de forma prudente, guarda la fecha de extracción y compara el resultado con una fuente con licencia. Nasdaq Data Link, feeds de bolsa, APIs de broker o proveedores de datos de pago son referencias más adecuadas cuando importan precisión, licencia y soporte. Si prefieres una libreria abierta de Yahoo más mantenida para investigación, yfinance también es común, pero su propia documentación avisa de que no esta afiliada a Yahoo y esta orientada a investigación y uso educativo.
- 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
Cuándo resulta útil este script de dividendos
El objetivo no es consultar un único valor de forma manual, sino generar un proceso repetible. Al mantener la lista de tickers en un CSV, puedes cambiar el conjunto de empresas, volver a ejecutar el script y obtener una tabla final preparada para pandas, hojas de cálculo o un panel de análisis.
Este tutorial encaja con otros contenidos de datos financieros, como qué es el mercado de valores y el análisis de reputación y sentimiento alrededor de Bitcoin.
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 |
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 |
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: