Pandas 数据框 - 隔夜时间序列 returns

Pandas dataframe - timeseries overnight returns

EXAMPLE of data sets

我正在创建一个包含交易数据(日期时间、时间、交易量、价格)的 pandas 数据框。我使用几个相同的文件(每个文件代表一个交易日)构建了数据框,然后我使用 5 分钟的间隔对我的数据框重新采样。

然后我计算每个间隔之间的 return 但我不想计算从一天到另一天的 return (即第 t 天最后一个数据点之间的 return和第 t+1 天的第一个数据点)。

    list_=[]
    big_df=pd.DataFrame()

    #read file into pandas
    for file in filelist:

        #create panda dataframe
        df=pd.read_hdf(file)
        #Retrieve time and price
        data= df.filter(['datetime','price'], axis=1)
        data = data.set_index('datetime')

        #Resample dataframe
        data = data.resample('5T').mean().bfill().between_time('04:00', '19:00')

        list_.append(data)

   #concatenate them together
   big_df = pd.concat(list_)

   # compute log returns
   ret_d = pd.DataFrame(100*np.log(big_df['price']).diff(1)*100)

上面的代码计算每个间隔的 return,包括 2 天之间的 return。如何排除这些 return? 例如,我不想计算第 1 天 19:00 和第 2 天 4:05 之间的 return (请注意,一天的第一个数据点可以是 4:05am;例如 4:35,所以我们每天的数据点数量不同。

我的第二个问题是我无法找到一种方法来计算重采样中价格的加权平均平均值(使用体积)(pandas 中只有方法 .mean() 可用根据文档重采样函数)。有什么办法吗?谢谢。

示例:

In [1]: df = pd.DataFrame([[2017-01-04 18:51:00, 100,10], [2017-01-04 18:53:00, 101.5,50], [2017-01-04 18:58:00, 102.1], [2017-01-05 04:32:00, 102.6, 50], [2017-01-05 04:34:00, 102.7, 10], [2017-01-05 04:38:00, 103, 50]], columns=['datetime', 'price', 'volume'])

将'datetime'作为指标,去除成交量,计算加权平均价格后,期望的结果应该是以下数据框:

pd.DataFrame([[2017-01-04 18:55:00, 101.25], [2017-01-04 19:00:00, 102], [2017-01-05 04:35:00, 102.62], [2017-01-05 04:40:00, 103]],['datetime', 'price'])

有:101.25 = (101,5*50+100*10)/(50+10)

最后,计算前一个数据帧的 log-return(不包括日变化的 return),我应该得到:

[0.00320514*, 0**, 0.00162932***]

与: *日志(102/101.25)

** 0(因为介于 2 天之间)

*** 日志(103/102.62)

所以我想我已经弄清楚你想要什么了——你实际上是在问 2 个完全不同的事情,几天来的日志 return 和 returns,但我想我已经回答了他们都在这里。您的电子表格屏幕截图和示例中的数据不一致,并且不像评论中提到的那样特别容易理解,所以请告诉我这是否是您期望的答案。

编辑以纳入评论:

import pandas as pd
import numpy as np

df = pd.DataFrame([
    ["2017-01-04 18:51:00", 100,10], 
    ["2017-01-04 18:53:00", 101.5,50], 
    ["2017-01-04 18:58:00", 102, 10], 
    ["2017-01-05 04:07:00", 101.9, 30], 
    ["2017-01-05 04:32:00", 102.6, 50], 
    ["2017-01-05 04:34:00", 102.7, 10], 
    ["2017-01-05 04:38:00", 103, 50]], columns=['datetime', 'price', 'volume'])

df['datetime'] = pd.to_datetime(df['datetime'])
df = df.set_index('datetime')
df['price_volume'] = df['price'] * df['volume']

df = df.resample("5T", label='right').agg(['sum', 'mean']).between_time('04:00', '19:00')

df['volume_weighted_price'] = df[('price_volume', 'sum')] / df[('volume', 'sum')]
df = df[['volume_weighted_price']]
df.columns = df.columns.droplevel(1)
df = df.groupby([pd.Grouper(level=0, freq='D', label='right')]).ffill()

df['log_return'] = np.log(df['volume_weighted_price']).diff(1)
print(df)

给出结果数据帧

                     volume_weighted_price  log_return
datetime                                              
2017-01-04 18:55:00             101.250000         NaN
2017-01-04 19:00:00             102.000000    0.007380
2017-01-05 04:00:00                    NaN         NaN
2017-01-05 04:05:00                    NaN         NaN
2017-01-05 04:10:00             101.900000         NaN
2017-01-05 04:15:00             101.900000    0.000000
2017-01-05 04:20:00             101.900000    0.000000
2017-01-05 04:25:00             101.900000    0.000000
2017-01-05 04:30:00             101.900000    0.000000
2017-01-05 04:35:00             102.616667    0.007008
2017-01-05 04:40:00             103.000000    0.003729

我首先重新采样以确保每 5 分钟的周期都存在,然后求和并取所有列的平均值以计算成交量加权价格。在计算价格并重新排列列之后,我按天分组并向前填充价格。这为每个时间段提供了前一时期的价格。最后我计算了 returns.