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)
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)
pou*_*er7 25
单行,只计算一次日志.首先转换为对数空间,然后采用1周期差异.
np.log(df.price).diff()
Run Code Online (Sandbox Code Playgroud)
@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 表示升序日期 - 在这两种情况下,移位都提供前一个日期的值。
结果可能看似相似,但这只是因为对数的泰勒展开.由于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)
