我正在创建一个包含交易数据的熊猫数据框(日期时间,时间,数量,价格)。我使用几个相同的文件构建数据框(每个文件代表一个交易日)然后我使用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,所以我们每天没有相同数量的数据点。)
我的第二个问题是我无法找到一种方法来计算重新采样中的价格加权平均值(使用音量)(根据文档,只有方法.mean()在pandas resample函数中可用)。有没有办法做到这一点?谢谢。
示例:
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***]
使用: * log(102 / 101.25)
** 0(因为它在2天之内)
*** log(103 / 102.62)
答案 0 :(得分:0)
所以我想我已经想出了你想要的东西 - 你真的在问两个完全不同的东西,日志返回和几天的回报,但我想我已经在这里回答了他们。您的电子表格屏幕截图和示例中的数据不一致,并且不像评论中提到的那样特别简单,所以请告诉我这是否是您期望的答案。
编辑合并评论:
controller.Action
给出了结果数据框
controller
我首先重新采样以确保每个5分钟的时间段存在,并求和并取所有列的平均值来计算体积加权价格。在计算价格并重新排列列之后,我按天和向前分组填写价格。这给出了每个时间段的前期价格。最后我计算了回报。