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.

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 dividendos, exactamente explicaremos cómo obtener un histórico reciente proporcionando una lista de tickers y almacenar el resultado en un fichero .csv para su posterior consulta.

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:

dividendticker
2019-08-260.95JNJ
2019-11-250.95JNJ
2020-02-240.95JNJ
2020-05-221.01JNJ
2020-08-241.01JNJ
2020-11-231.01JNJ
2021-02-221.01JNJ

Además, para este ejercicio 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:

CBAWKSCUJNJMO
2021-03-240.86
2021-03-180.78
2021-02-242.35
2021-02-221.01
2021-02-050.55
2020-12-240.86
2020-12-170.78
2020-11-231.01
2020-11-090.55
2020-09-170.78
2020-09-140.86
2020-08-241.01
2020-08-110.55
2020-06-180.78
2020-06-120.84
2020-05-221.01
2020-05-110.55
2020-03-240.84
2020-03-190.75
2020-02-240.53
2020-02-240.95
2020-02-060.5
2019-12-240.84
2019-12-190.75
2019-11-250.95
2019-11-150.03
2019-11-080.5
2019-09-190.75
2019-09-130.84
2019-08-260.95
2019-08-130.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: