五一,闲着没事,把VNPY升级到了2.2,,,,
数据库从mysql换到了influx,实测715万条数据使用VNPY读取,mysql读取18分钟左右,influx大概11分钟,没有预期中的快。
倒是使用pickle数据序列化以后,仅1分钟多就加载完了,占用磁盘1G...
感觉influx相对于mysql更大的优势在写入上面,写入时达到了10W+每秒的速度,不知道是不是influx默认配置的原因没有读取的没有预期的快,不过使用数据持久化到本地以后,读取速度提高10倍,对于相同数据搞回测极其值得...
二是升级到2.2以后,需要用到合成日线数据,发现trader\utility.py下面的关于K线合成的代码发生了变化。。。
依葫芦画瓢,
将update_bar下:
if self.interval == Interval.MINUTE:
self.update_bar_minute_window(bar)
else:
self.update_bar_hour_window(bar)
更新为
if self.interval == Interval.MINUTE:
self.update_bar_minute_window(bar)
elif self.interval == Interval.HOUR:
self.update_bar_hour_window(bar)
elif self.interval == Interval.DAILY:
self.update_bar_day_window(bar)
从update_bar_hour_window复制一份改成update_bar_day_window,实现逻辑加入之前的:
day_end = datetime.time(14, 59)
if bar.exchange == Exchange.CFFEX and not bar.symbol.startswith("I"):
day_end = datetime.time(15, 14)
if bar.datetime.time() == day_end:
self.day_bar.high_price = max(self.day_bar.high_price,bar.high_price)
self.day_bar.low_price = min(self.day_bar.low_price,bar.low_price)
self.day_bar.close_price = bar.close_price
self.day_bar.volume += int(bar.volume)
self.day_bar.open_interest = bar.open_interest
finished_bar = self.day_bar
self.day_bar = None
将 on_hour_bar 复制一份改成on_day_bar:(合成多日的,基本用不到。。。)
测试居然不行!!!
分析发现需要在init里加入 self.day_bar: BarData = None
再测试,还是不行,居然连小时都生成不了。。。
然道哪里搞错了?
备份代码,还原至初始值,居然还是连小时图都没法生成。。。。
检查代码没有错,策略文件时有from trader.constant import Interval
BarGenerator里面的Interval.HOUR和Interval.DAILY均读取正常。。。
一点一点打印排查发现utility.py文件update_bar里面的self.interval == Interval.HOUR不执行?
为啥???明明self.interval的值 = Interval.HOUR,为啥 self.interval == Interval.HOUR却不执行?
难道我不是我?????
经过一顿对比,怀疑,排除。。。
终于发现问题在枚举值导入上面。。。。
trader\utility.py文件里Interval使用的是 from .constant import Exchange, Interval
而策略文件里是的Interval的使用的是 from trader.constant import Interval
最后将trader\utility.py里的from .constant import Exchange, Interval改为from trader.constant import Exchange, Interval
终于解决!!!
谁能想会在导入这块,,,卡半天。。。
不知道之前版本的trader\utility.py里的Interval里怎么导入的,如果是有变化,对于有日线合成需求的,升级以后,大概率也会卡在这里。。。