paras数据帧中的对数返回

Ama*_*ora 40 python pandas

Python pandas有一个pct_change函数,我用它来计算数据帧中股票价格的回报:

ndf['Return']= ndf['TypicalPrice'].pct_change()
Run Code Online (Sandbox Code Playgroud)

我使用以下代码获取对数返回,但它提供与pct.change()函数完全相同的值:

ndf['retlog']=np.log(ndf['TypicalPrice'].astype('float64')/ndf['TypicalPrice'].astype('float64').shift(1))
#np is for numpy
Run Code Online (Sandbox Code Playgroud)

Jia*_* Li 54

这是一种使用计算日志返回的方法.shift().结果与计算的总收益相似但不相同pct_change().您可以上传样本数据的副本(保管箱共享链接)以重现您看到的不一致吗?

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]
Run Code Online (Sandbox Code Playgroud)

  • @AmanArora BTW,对数回报具有期望的属性,它随着时间的推移而累加(但不是对不同资产的累加),而当您计算加权平均投资组合回报(即不同资产但不是累加的回报)时,总回报最合适时间). (3认同)
  • @AmanArora是的,这是预期的行为.当您的总收益很小时,例如低于1%,对数收益和总收益非常接近.它可以通过0左右的二阶泰勒展开在数学上证明. (2认同)
  • @poulter7 .dif() 提供两行之间的绝对变化。另请注意,`np.log(df.price) - np.log(df.price.shift(1))` 等价于 `np.log(df.price / df.price.shift(1))` (一个日志操作) (2认同)

Epi*_*Adv 36

日志返回只是1的自然对数加上算术返回.那怎么样?

df['pct_change'] = df.price.pct_change()
df['log_return'] = np.log(1 + df.pct_change)
Run Code Online (Sandbox Code Playgroud)

  • 也许你可以使用 np.log1p: df['log_return'] = np.log1p(df.pct_change) (3认同)
  • 这在数学上肯定是不正确的“对数返回值只是 1 的自然对数加上算术返回值。” (2认同)

pou*_*er7 25

单行,只计算一次日志.首先转换为对数空间,然后采用1周期差异.

np.log(df.price).diff()
Run Code Online (Sandbox Code Playgroud)


Rob*_*ert 7

@poulter7:我无法评论其他答案,所以我将其发布为新答案:小心

np.log(df.price).diff() 
Run Code Online (Sandbox Code Playgroud)

因为对于可能变为负数的指数以及负利率等风险因素,这将失败。在这些情况下

np.log(df.price/df.price.shift(1)).dropna()
Run Code Online (Sandbox Code Playgroud)

是首选,并且根据我的经验,通常是更安全的方法。它还只计算一次对数。

使用 +1 还是 -1 取决于时间序列的顺序。使用 -1 表示降序日期,使用 +1 表示升序日期 - 在这两种情况下,移位都提供前一个日期的值。

  • 这很有趣,这里有两种方法,“np.log(1+s.pct_change())”和“np.log(s/s.shift(1))”,一旦系列进入日志返回的负值区域再次开始有意义。或者“np.log(s).diff())”和“(np.log(s) - np.log(s.shift(1))”,它们显式地降低了负回报。 (2认同)

Ami*_*ory 6

结果可能看似相似,但这只是因为对数泰勒展开.由于log(1 + x)~x,结果可以类似.

然而,

我使用以下代码获取对数返回,但它提供与pct.change()函数完全相同的值.

不太正确.

import pandas as pd

df = pd.DataFrame({'p': range(10)})

df['pct_change'] = df.pct_change()
df['log_stuff'] = \
    np.log(df['p'].astype('float64')/df['p'].astype('float64').shift(1))
df[['pct_change', 'log_stuff']].plot();
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述