Nuestro equipo redactor ha pasado horas investigando para dar espuestas a tu interrogante, te dejamos la soluciones así que deseamos resultarte de gran ayuda.
Solución:
Aquí hay una forma de calcular el retorno de registro usando .shift()
. Y el resultado es similar pero no igual a la rentabilidad bruta calculada por pct_change()
. ¿Puede cargar una copia de sus datos de muestra (enlace compartido de Dropbox) para reproducir la inconsistencia que vio?
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame(100 + np.random.randn(100).cumsum(), columns=['price'])
df['pct_change'] = df.price.pct_change()
df['log_ret'] = np.log(df.price) - np.log(df.price.shift(1))
Out[56]:
price pct_change log_ret
0 101.7641 NaN NaN
1 102.1642 0.0039 0.0039
2 103.1429 0.0096 0.0095
3 105.3838 0.0217 0.0215
4 107.2514 0.0177 0.0176
5 106.2741 -0.0091 -0.0092
6 107.2242 0.0089 0.0089
7 107.0729 -0.0014 -0.0014
.. ... ... ...
92 101.6160 0.0021 0.0021
93 102.5926 0.0096 0.0096
94 102.9490 0.0035 0.0035
95 103.6555 0.0069 0.0068
96 103.6660 0.0001 0.0001
97 105.4519 0.0172 0.0171
98 105.5788 0.0012 0.0012
99 105.9808 0.0038 0.0038
[100 rows x 3 columns]
Los rendimientos logarítmicos son simplemente el logaritmo natural de 1 más el rendimiento aritmético. Entonces, ¿qué tal esto?
df['pct_change'] = df.price.pct_change()
df['log_return'] = np.log(1 + df.pct_change)
Aún más conciso, utilizando la sugerencia de Ximix:
df['log_return'] = np.log1p(df.price.pct_change())
Una sola línea, y solo calculando registros una vez. Primero convierta a espacio logarítmico, luego tome la diferencia de 1 período.
np.diff(np.log(df.price))
En versiones anteriores de numpy:
np.log(df.price)).diff()
Puntuaciones y reseñas
Nos encantaría que puedieras recomendar esta noticia si te valió la pena.