vn.py官网
开源量化社区
Member
加入于:
帖子: 138
声望: 45

今天在群里面,看到有人反映vnpy2中0点0分0秒这一秒的时间戳有问题,如下图倒序的tick数据,第三条应该是6-29 00:00:00
这个时间,但是存储时候,日报变成了2021-06-28日。

description

这个问题在Github的issue 中也有人提了, 提问者也做了分析。
我这边在重复分析下原因。

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

从下面代码节段,可以看出,时间戳timestamp是用本地的日期(self.current_date) 和传入tick data的时间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()方法计算,太占用时间了。所以就一秒更新一次,节约运算。

def update_date(self) -> None:
"""更新当前日期"""
self.current_date = datetime.now().strftime("%Y%m%d")
但是在凌晨0秒时候,这个current_date还没有更新,还是昨天的时间,造成上面错误。

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

上期所和郑商所可以直接使用,大商所需要转换
tick.date = data['ActionDay']
大商所日期转换
if tick.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可以理解为实际日期,就是还是当天。
如下图

description

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

所以该法就是分析交易所,如果是大商所用本地时间,其他用tick的ActionDay。
截图引用的链接拷贝时候没有,没有显示,实在抱歉

Administrator
avatar
加入于:
帖子: 5100
声望: 295

非常感谢这个信息反馈,我们会在下个版本里修复掉

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

沪公网安备 31011502017034号