web-dev-qa-db-fra.com

Les retours logarithmiques dans le cadre de données des pandas

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
26
AmanArora

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]
43
Jianxun Li

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)
32
EpicAdv

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()
20
poulter7

@ 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.

0
Robert