【发布时间】:2018-02-21 09:42:08
【问题描述】:
我正在创建一个带有交易数据(日期时间、时间、数量、价格)的 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