vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 11
声望: 0
  57   │     def calc_series_diff_like_volume(self, s):
  58   │         volume = s.copy()
  59   │ 
  60   │         volume_diff = volume.diff()
  61   │         volume_diff[0] = volume[0]
  62   │ 
  63   │         volume_in_tick = volume_diff
  64   │         negative_index = volume_diff<0
  65   │         volume_in_tick[negative_index] = volume[negative_index]
  66   │         return volume_in_tick

这是我写的函数,tick数据里面的volume是当天volume的总和,但是我想要计算出来这一个tick内的成交量,所以自然的是该用目前这个tick的volume减去last tick的volume,然后单独处理第一个tick的volume,因为pandas的diff后第一个会变成nan,还有其他的为负数的tick的volume,因为这些是每天刚开市的时候清零的数据,减去上一天的最后一个tick会变成负数,每天第一个tick的volume就不需要改,直接赋值为这天的第一个tick的volume

但是这样我用天勤的数据算出来,au2006在2月份的volume总共为1679849, 而上期所的数据显示,是1640768

请问哪里错了呢?

下面是我的算法根据天勤的数据计算的结果,其中的au2003的数据错的更离谱,上期所的数据是53,而我的是8459

pt.df.filter(like='volume_in_tick').sum()

au2003.volume_in_tick       8459.0
au2004.volume_in_tick     133375.0
au2006.volume_in_tick    1679849.0
Administrator
avatar
加入于:
帖子: 3913
声望: 208

直接用Python循环跑一遍计算看看好了,如果也是错的说明数据本身有问题。

如果对的就说明你Pandas调用有问题了,pandas的向量化计算方便,但不熟很容易写错。

Member
avatar
加入于:
帖子: 11
声望: 0

用Python的交易员 wrote:

直接用Python循环跑一遍计算看看好了,如果也是错的说明数据本身有问题。

如果对的就说明你Pandas调用有问题了,pandas的向量化计算方便,但不熟很容易写错。

谢谢指出思路,已经定位到bug并且修改了,出问题的地方在下面这样一句pandas操作中

df.loc[:, [f'{symbol}.volume_in_tick' for symbol in self.symbol_l]].fillna(0, inplace=True)

经过搜索发现了这个帖子

原来.loc在这里生成了一个copy而不是view,pandas的坑其实真的挺多的,一不小心就踩到了

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3