转载:如何利用vn.py动态选择主力合约?

在上一篇文章中介绍了一个‘如何利用vn.py记录指数行情?’的思路,本文将介绍‘如何用vn.py动态选择某一品种的主力合约’。感谢‘图扬量化’在「维恩的派」论坛内的分享!

主力合约

所谓主力合约指的是成交量最大的合约。因为它是市场上最活跃的合约,所有投机者基本上都在参与这个合约。也有说法是主力合约是持仓量最大的合约,因为通常来讲,持仓量最大的合约也是成交量最大的合约。

交易逻辑

如果策略是根据各品种加权指数来进行多空决策,再通过跟踪指数的方式来进行实际交易,这里就存在一个按持仓量比例映射交易合约头寸的问题,大多数情况下,一个品种的主力合约及次主力合约会占据绝大部分持仓权重,所以我们一般关心主力和次主力合约就够了。

设计思路

1. 在每次软件启动时,从交易服务器一次性获取所有期货合约信息(CtpGateway类的onRspQryInstrument 处理该查询),并推送至dataEngine,在dataEngine的processContractEvent方法中,将其存储于一个字典当中(保存到文件以便每次重启软件可用,仅当合约有变化时,如最近月合约到期,最远月合约生效,该字典才会被更新); 2. 从该字典中可获取所关注品种的当前所有有效合约,全部订阅; 3. 在dataEngine中的updateTick(处理订阅合约的tick推送的方法)中,将同品种所有合约的tick推送保存于另一个字典中,并在此时实时按照持仓量从大到小排序,这样按顺序取对应的合约就是主力、次主力等等了。如需显示于GUI,将其tick信息推送至上层就ok了。

备注

  1. 以上内容有部分是框架已实现的,可直接重用或稍作改进即可。
  2. 排序代码类似如下,具体解释请自行度娘: sorted(self.fullContractDict[type].items(), key=lambda d: d[1][0], reverse=True)

效果展示

(可进入论坛查看更清晰的效果图。)

基于python的开源交易平台开发框架。截止目前,vn.py项目在Github上的Star已经达到5563,量化交易类开源项目第1,量化类项目第3(1、2依旧分别是Zipline和TuShare)。

项目官网:http://www.vnpy.org

论坛地址:www.vnpie.com

知乎专栏:https://zhuanlan.zhihu.com/vn-py

Developed by Traders,

for Traders

发表评论