Python:计算时间序列的日志返回

2024-05-14 17:54:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的时间序列数据,其中第三行表示索引的结束值。

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

如何使用pandas python计算索引的日志返回?

非常感谢!

问候


Tags: 数据pandas时间序列问候dax
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

小心

np.log(df['close']).diff() 

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

np.log(df['close']/df['close'].shift(1)).dropna()

根据我的经验,通常是比较安全的方法。使用+1还是-1取决于时间序列的顺序。使用-1表示降序日期,+1表示升序日期-在这两种情况下,shift都提供前一个日期的值。

在此特定示例中,您需要首先将日期列设置为索引,否则除法操作将失败:

df['close'].set_index("date",inplace=True)
    import numpy as np
    df['log return'] = np.log(df[2]/df[2].shift(-1)) 

df是按日期降序排列的数据帧。

相关问题 更多 >

    热门问题