Python 熊猫数据帧-timeseries过夜返回

Python 熊猫数据帧-timeseries过夜返回,python,pandas,dataframe,trading,Python,Pandas,Dataframe,Trading,我正在用交易数据(日期时间、时间、数量、价格)创建熊猫数据框。我使用几个相同的文件(每个文件代表一个交易日)构建数据帧,然后使用5分钟的间隔重新采样数据帧 然后,我计算每个时间间隔之间的回报,但我不想计算从一天到另一天的回报(即t天最后一个数据点和t+1天第一个数据点之间的回报) 上面的代码计算每个间隔的回报,包括2天之间的回报。我如何排除这些回报? 例如,我不想计算第1天19:00和第2天4:05之间的回报(请注意,一天的第一个数据点可以是上午4:05之后的任何数据点;例如4:35,因此我们每

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

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

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

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

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

[0.00320514*, 0**, 0.00162932***]
与: *日志(102/101.25)

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


***日志(103/102.62)

所以我想我已经知道了你想要什么-你真的在问两件完全不同的事情,日志返回和几天的返回,但我想我已经在这里回答了它们。您的电子表格截图和示例中的数据不一致,并且不像评论中提到的那样简单,所以请告诉我这是否是您期望的答案

编辑以合并注释:

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

所以我想我已经弄明白了你想要什么-你真的在问两件完全不同的事情,日志回报和几天的回报,但我想我在这里都回答了。您的电子表格截图和示例中的数据不一致,并且不像评论中提到的那样简单,所以请告诉我这是否是您期望的答案

编辑以合并注释:

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

如果你有一些样本数据和预期结果,那将是非常棒的。嗨,泰德,我添加了一张带有逐步计算的图片。我在这个网站是新的,所以我不知道如何提交一个适当的方式。希望这是清楚的enough@CTXR,请阅读并相应编辑您的帖子。谢谢。我会尝试一下,但我认为图片是不言自明的。如果你有一些样本数据和预期的结果,那将是非常棒的。嗨,泰德,我添加了一张带有逐步计算的图片。我在这个网站是新的,所以我不知道如何提交一个适当的方式。希望这是清楚的enough@CTXR,请阅读并相应编辑您的帖子。谢谢。我会试试这个,但我认为这幅画是不言自明的。嗨,肯,非常感谢!这正是我们的想法。但是,缺少了一件事(示例中没有-对不起):我的原始数据帧在时间上非常异构:我在聚合中添加了“.bfill()”。当我测试你编写的代码时,我得到的时间频率不等于5分钟(特别是在一天的开始,因为没有交易)。如果没有交易,我想报最低价。例如,当上午5:05到5:35之间没有交易时,我不想跳转,我想保留5:05 5:10 5:15等。即使价格将是最后计算的价格(5:05 am)@CTXR,我已经用另一种解决方案进行了编辑,我认为它符合您的要求。请让我知道你是如何得到一个接受,如果它的工作!嗨,肯,非常感谢!这正是我们的想法。但是,缺少了一件事(示例中没有-对不起):我的原始数据帧在时间上非常异构:我在聚合中添加了“.bfill()”。当我测试你编写的代码时,我得到的时间频率不等于5分钟(特别是在一天的开始,因为没有交易)。如果没有交易,我想报最低价。例如,当上午5:05到5:35之间没有交易时,我不想跳转,我想保留5:05 5:10 5:15等。即使价格将是最后计算的价格(5:05 am)@CTXR,我已经用另一种解决方案进行了编辑,我认为它符合您的要求。请让我知道你是如何得到一个接受,如果它的工作!