vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 3
声望: 0

vnpy时区信息debug

  1. 现象:
    行情比对查验的时候,发现本地数据和bitmex数据相差了6分钟
  2. 原因:
    vnpy里面关于时区信息是:DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD

    系统本地时区信息是:DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD

    生成df的时候,时区自动会转换成CST格式,导致相差6分钟

  3. LMT 是Local Mean Time,网上查一查意思是本地平均时。而且时间是+8:06,说明与UTC的时差不是8个小时整

  4. CST 是Central Standard Time

  5. 解决方案:

  6. 删除掉时区信息,bar.datetime.replace(tzinfo=None)

*生成带时区的时间时,一定要使用timezone.localize()来生成。不要在时间对象的构造函数中传入tzinfo的方式来实现

*DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD转换成浮点数时间戳,然后tz.localize()生成本地时间。

参考资料:
最全UTC时间转化为本地时间
pytz 和datetime.replace(tzinfo= ) 好像一起使用会让时间不准确会不会对vnpy的数据产生影响?
2.14版本CTP的tick推送,tick.datetime的时区是不是有问题???
导入一分钟K线csv文件到数据库时候的datetime的问题
python时区设置——pytz模块
Python中的时区处理

#bug重现
from vnpy.trader.database import database_manager
from vnpy.trader.constant import Exchange,Interval
import pandas as pd
from datetime import datetime
import pytz

symbol = 'XBTUSD'
exchange = Exchange.BITMEX
interval = Interval.MINUTE
start = datetime(2020,9,12,6)
end = datetime(2020,9,12,7)

bars = database_manager.load_bar_data(    
    symbol=symbol, 
    exchange=exchange, 
    interval=interval, 
    start=start, 
    end=end,
)

bars

观察6:11分数据,最高价10430.0,时间是datetime.datetime(2020, 9, 12, 6, 11, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)

 BarData(gateway_name='DB', symbol='XBTUSD', exchange=<Exchange.BITMEX: 'BITMEX'>, datetime=datetime.datetime(2020, 9, 12, 6, 10, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>), interval=<Interval.MINUTE: '1m'>, volume=0.0, open_interest=0.0, open_price=10362.5, high_price=10370.0, low_price=10362.5, close_price=10370.0),
 BarData(gateway_name='DB', symbol='XBTUSD', exchange=<Exchange.BITMEX: 'BITMEX'>, datetime=datetime.datetime(2020, 9, 12, 6, 11, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>), interval=<Interval.MINUTE: '1m'>, volume=0.0, open_interest=0.0, open_price=10369.5, high_price=10430.0, low_price=10369.5, close_price=10400.0),
 BarData(gateway_name='DB', symbol='XBTUSD', exchange=<Exchange.BITMEX: 'BITMEX'>, datetime=datetime.datetime(2020, 9, 12, 6, 12, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>), interval=<Interval.MINUTE: '1m'>, volume=0.0, open_interest=0.0, open_price=10399.5, high_price=10400.0, low_price=10389.0, close_price=10389.0),
#历史数据存入df
t = []
o = []
h = []
l = []
c = []

for bar in bars[11:18]:
    time = bar.datetime
    open_price = bar.open_price
    high_price = bar.high_price
    low_price = bar.low_price
    close_price = bar.close_price
    t.append(time)
    o.append(open_price)
    h.append(high_price)
    l.append(low_price)
    c.append(close_price)

    df = pd.DataFrame({'time':t,'open':o,'high':h,'low':l,'close':c})
df

description

解决办法

x = bar.datetime
x.replace(tzinfo=None)#扔掉时区信息
datetime.datetime(2020, 9, 12, 6, 17)
Administrator
avatar
加入于:
帖子: 4028
声望: 220

2.1.5已经修复掉了

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