114python之家

您现在的位置是:首页 > python > 正文

python

VNPY2中CTP数据凌晨0点时间戳的处理问题,和夜盘数据时间戳分析

admin2021-07-19python21
【114python之家】今天在群里面,看到有人反映vnpy2中CTP接口tick数据0点0分0秒这一秒的时间戳有问题,如下图倒序的tick数据,第三条应该是6-2900:00:00 这个时间,但是存


今天在群里面,看到有人反映vnpy2中0点0分0秒这一秒的时间戳有问题,如下图倒序的tick数据,第三条应该是6-2900:00:00

这个时间,但是存储时候,日报变成了2021-06-28日。

VNPY2中CTP数据凌晨0点时间戳的处理问题,和夜盘数据时间戳分析 python 第1张

这个问题在Github的issue中也有人提了,提问者也做了分析。

我这边在重复分析下原因。

tick的数据接受处理实在CtpMdApi这个类中的onRtnDepthMarketData方法,这个是一个被接口调用方法,传入的是叫做data字典格式的tick数据。。

从下面代码节段,可以看出,时间戳timestamp是用本地的日期(self.current_date)和传入tickdata的时间data['UpdateTime']和毫秒data['UpdateMillisec']组合出来的。

timestamp:str=f"{self.current_date}{data['UpdateTime']}.{int(data['UpdateMillisec']/100)}" dt:datetime=datetime.strptime(timestamp,"%Y%m%d%H:%M:%S.%f") dt=CHINA_TZ.localize(dt) ..... datetime=dt,


self.current_date这个本地日期数据并不是实时读取,而且用如下方法更新,这个方法是定时事件处理每秒出发跑一次更新。

为什么这样做,因为tick数据可能一秒有多少不同品种tick的传入,如果每次都用datetime.now()方法计算,太占用时间了。所以就一秒更新一次,节约运算。

defupdate_date(self)->None: """更新当前日期""" self.current_date=datetime.now().strftime("%Y%m%d")

但是在凌晨0秒时候,这个current_date还没有更新,还是昨天的时间,造成上面错误。



其实印象中这个错误在之前vnpyv1版本看到有人提出过,查了下在v1.9.2版本已经修复过。 v1.9.2代码如下

#上期所和郑商所可以直接使用,大商所需要转换 tick.date=data['ActionDay'] #大商所日期转换 iftick.exchange==EXCHANGE_DCE: tick.date=datetime.now().strftime('%Y%m%d')

这里可以看到,对于上期所和郑商所使用tick中带日期的actionDay,而只有大商所采用本地时间,因为大商所夜盘到11点,所以完全OK。


这里好像问题解决差不多了,好像是在vnpy2版本把之前的休息忘记了。只要按照v1.9.2版改改就差不多了。这个倒是不难。

但是为什么要用本地日期了,而不直接用tick数据自己带的日期了,一查发现还是有些弯弯道道的。


首先tick信息里面其实有两个日期,TradingDay和ActionDay,其实tradingDay可以理解为交易日,比如夜盘交易通常算第二天的,夜盘的挂单到第二天还是有效;而ActionDay可以理解为实际日期,就是还是当天。

如下图

VNPY2中CTP数据凌晨0点时间戳的处理问题,和夜盘数据时间戳分析 python 第2张 VNPY2中CTP数据凌晨0点时间戳的处理问题,和夜盘数据时间戳分析 python 第3张

但是,很奇怪的事情发现了,大商所的ActionDay竟然就是交易日TradingDay,所以没法默认统统使用ActionDay,不然大商所的数据就乱,当天夜盘日期反而是明天。

所以该法就是分析交易所,如果是大商所用本地时间,其他用tick的ActionDay.


截图引用的链接被自动吃了,没有显示,实在抱歉

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~