2 votos

Cálculo eficiente de la rentabilidad de las acciones teniendo en cuenta los dividendos

Tengo dos DataFrames como los siguientes:

Dividendos:

            Ticker1  Ticker2  Ticker3
 2018-01-01   NaN      NaN      0.39   
 2018-01-02   0.8      0.73     NaN
 2018-01-04   NaN      NaN      NaN
     ...      ...      ...      ...

Precio al contado (semanal):

            Ticker1  Ticker2  Ticker3
 2018-01-01   16.95    8.54     21.05   
 2018-01-08   16.80    9.03     20.56
 2018-01-15   16.86    9.52     19.85
     ...        ...     ...      ...

Me gustaría calcular los rendimientos semanales de estas acciones (10Y+ histórico) teniendo en cuenta los dividendos. Me habría limitado a sumar los dos dataframes y registrar los rendimientos pero mis fechas no se alinean exactamente.

Mi solución actual es hacer un bucle a través del DateTimeIndex del marco de datos del precio al contado y encontrar el más cercano a él en el marco de datos de los dividendos utilizando .loc y añadirlo si no es nulo. Aunque funciona, es muy lento incluso cuando se hace un bucle a través de las matrices numpy subyacentes en lugar de los objetos de marco de datos reales.

Por lo tanto, mi pregunta ¿existe una forma eficiente de obtener el último dividendo conocido más cercano y añadirlo a mi marco de datos de precios al contado antes de calcular los rendimientos?

Solución temporal

He encontrado un método de pandas que no conocía llamado pandas.merge_asof y aunque es muy lento, produce el resultado esperado en Python puro y mejora la legibilidad del código base.

2voto

dmuir Puntos 146

Hay dos formas de abordar esta cuestión:

Si quieres mantenerlo todo en Python, convierte todas tus fechas en ambos DataFrames a Formato ISO 8601 La extracción del número de semana y el uso de ese número de semana como índice secundario es fácil de hacer si te sientes cómodo tratando con un DataFrame multi-indexado.

Si cambiar los formatos de fecha es un enorme dolor de cabeza que causará todo tipo de errores posteriores, entonces puede exportar su DataFrame a Excel y manipularlo rápidamente y luego enviarlo de nuevo a su DataFrame. Dentro de Excel, la función =WEEKNUM() por defecto, comienza el 1 de enero de cada año como "semana 1". Terminará con "semanas 53" que puede tratar de cualquier manera. Sin embargo, tendrá la certeza de que su semana 1 comienza el 1 de enero de cada año. Hay otros argumentos aparte del predeterminado que le permite comenzar la semana 1 de cada año en cualquier día de la semana que elija. Una explicación más detallada de la función WEEKNUM de Excel es aquí si es necesario.

El uso de Excel de esta manera puede ser directamente a través de su código de Python también si desea automatizarlo para su uso futuro. El paquete xlwings para Python lo hace fácil.

Una vez que tenga el número de semana del dividendo, puede compararlo con el número de semana del precio al contado, sin necesidad de recorrer todo el DataFrame.

Espero que esto ayude.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X