Python:计算时间序列的对数收益率

5

我有一系列时间序列数据,其中第三行代表了一个指数的收盘价。

DAX 20150728 11173.910156
DAX 20150727 11056.400391
DAX 20150724 11347.450195
DAX 20150723 11512.110352

我该如何使用pandas python计算指数的对数收益率呢?
非常感谢!
祝好!

我不知道什么是对数收益率,但根据这个网站http://www.vosesoftware.com/ModelRiskHelp/index.htm#Time_series/Log_return_of_a_Time_Series.htm,它不是log(收盘价)- log(第一次收盘价)吗? - EdChum
3个回答

10

小心处理

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 Wang
1
感谢Benjamin提供的额外解释! - Robert

3
如果我正确理解对数收益率,那么以下是您想要的内容:
In [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

日志收益率是价值比率的对数。我认为它更可能是按天而非从第一天开始计算的。 - hvedrung
EdChum,谢谢您,这正是我需要的,实际上我只想保留数据格式和名称,并仅更改第三列的值为对数收益率。 - Jorko12
所以你想覆盖那一列?就像这样 df['close'] = np.log(df['close']).diff() - EdChum
是的,这正是我需要的:只需计算第三列的对数收益率。所有其他列应保持不变。 - Jorko12

-2
    import numpy as np
    df['log return'] = np.log(df[2]/df[2].shift(-1)) 

df 是按日期递减排序的数据框。


2
应该是 np.log(df[2] / df[2].shift(1)) - BCR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接