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:

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, 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: