首先说上这个策略的
目的:
1. 验证实盘的撮合成交机制。
这个策略是分钟级的,调试下来稳定在1天平均交易6次,实际跑下来也确实如此。在回测时其实是很稳定的亏钱的,有人问我,你是不是疯了,不,我没疯。因为我看中了稳,表现在曲线上就是曲线的斜率非常稳,这样如果是盈利的,那也会非常的稳,风险小,面对各种突涨突跌的冲击也很稳,其实说下来就是高频交易的特点啦。为什么亏损策略我还要坚持试呢?因为测试和simnow时成交的规则是很严格的,只能主动成交,不能被动成交。
比如:现在
askPrice1 = 3802
bidPrice1 = 3801
我现在下一个3801的买单,是不会成交的,一定要下3801的单子才能成交,当然这是在simnow和回测的情况下。
但是在实盘是有可能等到有个用3801的价格short方向砸给我的,这时
askPrice1 = 3802
bidPrice1 = 3801
只是 lastPrice = 3801
实际跑了几天,确实胜率比测试下来要高,但是由于......还是暂停了。
2. 测试实盘系统稳定性
因为该策略1天平均交易6次,能碰到各种情况,所以对系统是一个比较好的测试,实际下来也确实发现了不少的问题,这个也算成长了不少。
撤下原因
1. 盈亏比太低
0.3 我开始还抱有一点幻想,不过经过科学分析和实际测试,这么低的盈亏比确实不能实盘。这个策略是第次交易固定盈11.5元左右,也就是两个价差(与实际商品价格相关),但是我的止损最大是15个价差,也就是160元,最后也是这个15点的止损让我撤下了这个策略。
经验总结
1. 所有细节一定要想清楚
有人工干预的和没人工干预的相差非常大,自动化运行时可能会出现各种情况,单被拒,没成交,回报延迟,等等,有人在旁边很好办,人工下单即可,没有人在旁边就要考虑到各种情况。
而且还有上交所的平今和平昨,非常的坑,我有一个单过了30分钟都没成交,最终还是我人工空掉的,不然后果很严重。
最好做阻塞的操作,比如我先撤个单,再下个单,你就等撤单的回报过来后再下单,这样比较靠谱,如果直接下两个单,在一些未知情况下还不知道出现什么状况。
2. 生产部署要单独的机器
千万不可一边开发,一边还在机器上跑策略,不过我相信也没人这样干。
我的软配置:
- Ubuntu 16.04 LTS Server版,没图形界面,非常清爽,而且系统崩溃的概率要低一些。我在安装过程中碰到了不能更新apt的情况,我把我开发机上的/etc/apt/sources.list拷上去就行。
- 用的1000M网线连接的路由器,不要用wifi
- 安装sshd服务,可以console,又可以sftp,非常方便
- 自己写了个conrtab脚本,定时开启cta和关闭cta
- 相关日志输出到指定目录,我可以远程在ssh上面监控
- 务必用SSD,可以看第4点
3. vnpy可以无图形
其实vnpy的cta无图形运行脚本是可以无图形的,但是需要qt包,但是server版上是没有这个包的,去安装个qt包?不。把相关cta引用到的库的qt和matlib引用去掉就行,我已经成功无qt包跑起来了。
4. 坑:python自带的logger是阻塞的
我调试过logger的代码,是阻塞的,这和传统的log4net完全不一样,log4net可以疯狂的写log,log4net有专门的线程负责写日志,所以效率非常高。
我已经找到方法,通过共享内存的方式异步写日志了,不过考虑到时间投入就没实现,现在的策略还没到IO的瓶颈,不过SSD还是必要的哈,不然IO真可能成为瓶颈。
代码需要注意的地方
vtEngine.py -> class PositionDetail
- 这个类是管理每个合约对应的仓位的,在策略开始前会查询订单的回报,在我的试验中,上期所有点坑,因为上期所分平昨和平今,如果在订单成交回报中昨天的某条没过来,就会导致昨天的pos是负数,这是不可能的,因为vnpy里面分了long和short只可能是正数
- 里面我的SHFE平今平昨模式是我硬编码的,交易其他合约时要注意
策略文件 OnOrder
回测时是orderId,实盘又是VOrderId
历史数据
如果回测用的主连,就用主连的历史数据,不要取当前主力数据取个半年的就会出问题,因为可能1个月前的主力合约不是当前主力合约
总结
这次实盘花了大概4天的时间,每天早上8点到晚上11点,非常的辛苦,不过这是值得的,加油,干
Comments
comments powered by Disqus