【问题标题】:Pandas dataframe - timeseries overnight returnsPandas 数据框 - 时间序列隔夜回报
【发布时间】:2018-02-21 09:42:08
【问题描述】:

EXAMPLE of data sets

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

然后我计算每个间隔之间的回报,但我不想计算一天到另一天的回报(即第 t 天的最后一个数据点和第 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)

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

我的第二个问题是我无法找到一种方法来计算重采样中价格的加权平均平均值(使用数量)(根据文档,pandas resample 函数中只有方法 .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'])

将“日期时间”作为索引,去除交易量,计算加权平均价格后,期望的结果应该是以下数据框:

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)

最后,计算前一个数据帧的日志返回(不包括换天的返回),我应该得到:

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

与: * 日志(102/101.25)

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

***日志(103/102.62)

【问题讨论】:

  • 如果您有一些具有预期结果的示例数据,那就太好了。
  • 嗨泰德,我已经添加了一步一步计算的图片。我是这个网站的新手,所以我不知道如何以正确的方式提交。希望它足够清楚
  • @CTXR,请阅读how to make good reproducible pandas examples并相应地编辑您的帖子。
  • 谢谢。我会试试这个,但我认为图片是不言自明的。

标签: python pandas dataframe trading


【解决方案1】:

所以我想我已经弄清楚了您想要什么-您实际上是在询问两个完全不同的事情,即日志返回和几天内的返回,但我想我已经在这里回答了它们。您的电子表格屏幕截图和示例中的数据不一致,并且如 cmets 中提到的那样不容易遵循,因此请告诉我这是否是您期望的答案。

编辑加入评论:

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 分钟的周期,然后对所有列求和并取平均值以计算成交量加权价格。在计算价格并重新排列列之后,我按天分组并向前填充价格。这为每个时间段提供了前一期的价格。最后我计算收益。

【讨论】:

  • 嗨,肯,非常感谢!这正是这个想法。但是,缺少一件事(示例中没有 - 抱歉):我的原始数据帧在时间上非常异构:我在聚合中添加了“.bfill()”。当我测试您编写的代码时,我得到的 time freq 不等于 5 分钟(尤其是在一天开始时,因为没有交易)。如果没有交易,我想放最后一个价格。例如。当早上 5:05 和 5:35 之间没有交易时,我不想跳槽,我想保持 5:05 5:10 5:15 等,即使价格是最后计算的(早上 5:05 )
  • @CTXR 我用不同的解决方案进行了编辑,我认为它可以满足您的需求。如果可行,请告诉我你是如何接受的!
猜你喜欢
  • 2022-07-26
  • 2021-05-21
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2022-11-27
相关资源
最近更新 更多