Les pandas Python ont une fonction pct_change que j'utilise pour calculer les rendements des cours des actions dans un cadre de données:
ndf['Return']= ndf['TypicalPrice'].pct_change()
J'utilise le code suivant pour obtenir des retours logarithmiques, mais il donne exactement les mêmes valeurs que la fonction pct.change ():
ndf['retlog']=np.log(ndf['TypicalPrice'].astype('float64')/ndf['TypicalPrice'].astype('float64').shift(1))
#np is for numpy
Voici un moyen de calculer le retour du journal en utilisant .shift()
. Et le résultat est similaire mais pas identique au rendement brut calculé par pct_change()
. Pouvez-vous télécharger une copie de vos exemples de données (lien de partage dropbox) pour reproduire l'incohérence constatée?
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]
Les retours de journal sont simplement le log naturel de 1 plus le retour arithmétique. Alors, à propos de ça?
df['pct_change'] = df.price.pct_change()
df['log_return'] = np.log(1 + df.pct_change)
Une seule ligne, et ne calcule les journaux qu'une seule fois . Convertissez-vous d'abord en espace journal, puis prenez le diff d'une période.
np.log(df.price).diff()
@ poulter7: Je ne peux pas commenter les autres réponses, je la poste donc en tant que nouvelle réponse: soyez prudent avec
np.log(df.price).diff()
car cela échouera pour les indices pouvant devenir négatifs ainsi que pour les facteurs de risque, par exemple. taux d'intérêt négatifs. Dans ces cas
np.log(df.price/df.price.shift(1)).dropna()
est préféré et basé sur mon expérience généralement l'approche plus sûre. Il évalue également le logarithme une seule fois.
Que vous utilisiez +1 ou -1 dépend de l'ordre de votre série chronologique. Utilisez -1 pour les dates décroissantes et +1 pour les dates ascendantes. Dans les deux cas, le décalage fournit la valeur de la date précédente.