我有一系列时间序列数据,其中第三行代表了一个指数的收盘价。
DAX 20150728 11173.910156
DAX 20150727 11056.400391
DAX 20150724 11347.450195
DAX 20150723 11512.110352
我该如何使用pandas python计算指数的对数收益率呢?
非常感谢!
祝好!
我有一系列时间序列数据,其中第三行代表了一个指数的收盘价。
DAX 20150728 11173.910156
DAX 20150727 11056.400391
DAX 20150724 11347.450195
DAX 20150723 11512.110352
小心处理
np.log(df['close']).diff()
因为这将无法处理可能变为负数的索引以及风险因素(例如负利率)。在这些情况下,
np.log(df['close']/df['close'].shift(1)).dropna()
基于我的经验,我更倾向于使用这种方法,通常这也是更安全的做法。您是使用 +1 还是 -1 取决于时间序列的排序方式。对于降序,请使用 -1,对于升序日期,请使用 +1 - 在这两种情况下,移位提供了前一个日期的值。
在此特定示例中,您需要先将日期列设置为索引,否则除法操作将失败:
df['close'].set_index("date",inplace=True)
++----++
)。第一种方法 np.log(df['close']).diff()
会产生很多 NaN
,但第二种方法 np.log(df['close']/df['close'].shift(1))
在出现连续负价格(例如 --
)时会给出非 NaN
的答案,只在边界处(例如 +-
或 -+
)给出 NaN
。 - Benjamin WangIn [155]:
t="""DAX 20150728 11173.910156
DAX 20150727 11056.400391
DAX 20150724 11347.450195
DAX 20150723 11512.110352"""
df = pd.read_csv(io.StringIO(t), header=None, sep='\s+',names=['exchange', 'date', 'close'], parse_dates=[1])
df
Out[155]:
exchange date close
0 DAX 2015-07-28 11173.910156
1 DAX 2015-07-27 11056.400391
2 DAX 2015-07-24 11347.450195
3 DAX 2015-07-23 11512.110352
In [157]:
df['log return'] = np.log(df['close']) - np.log(df['close'].iloc[0])
df
Out[157]:
exchange date close log return
0 DAX 2015-07-28 11173.910156 0.000000
1 DAX 2015-07-27 11056.400391 -0.010572
2 DAX 2015-07-24 11347.450195 0.015411
3 DAX 2015-07-23 11512.110352 0.029818
编辑
如果您是在内部日志文件中进行比较,您可以使用diff
命令来简洁地完成:
In [161]:
df['log return'] = np.log(df['close']).diff()
df
Out[161]:
exchange date close log return
0 DAX 2015-07-28 11173.910156 NaN
1 DAX 2015-07-27 11056.400391 -0.010572
2 DAX 2015-07-24 11347.450195 0.025984
3 DAX 2015-07-23 11512.110352 0.014406
df['close'] = np.log(df['close']).diff()
? - EdChum import numpy as np
df['log return'] = np.log(df[2]/df[2].shift(-1))
df 是按日期递减排序的数据框。
np.log(df[2] / df[2].shift(1))
。 - BCR