VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 4618
声望: 284

发布于vn.py社区公众号【vnpy-community】
 
原文作者:用Python的交易员 | 发布时间:2020-04-17
 

v2.1.2版本的vn.py已经于本周三正式发布,此次主要更新的内容包括多标的组合策略模块PortfolioStrategy的支持。

 

和之前一样,对于使用VN Studio的用户,启动VN Station后,直接点击界面右下角的【更新】按钮就能完成自动更新升级,对于没有安装的用户,请下载VNStudio-2.1.2,体验一键安装的量化交易Python发行版,下载链接:

下载地址

 

PortfolioStrategy模块

 

PortfolioStrategy模块专门针对需要同时交易多合约的量化策略设计,满足其历史数据回测和实盘自动交易的需求,一些策略例子包括:

 

  • ETF基金轮动策略
  • 期货多空组合策略
  • 量化资产配置策略
  • 期权套利类策略
  • 波动率交易策略
  • 股票Alpha类策略

 

目前模块自带的Demo策略只有个最简单的趋势跟踪策略(AtrRsiStrategy移植过来的),后面更新中争取会把上述每个策略类型都提供一个Demo。

 

相同点

 

PortfolioStrategy模块在设计上为了降低大家的学习成本,采用了尽可能接近CTA策略模块的方案。下图中展示的是一套铁矿石期权平价套利策略在Jupyter Notebook中的回测结果,同时涉及到三个合约,包括看涨期权、看跌期权、铁矿石期货:

 

description

 

除了上图中的回测功能外,PortfolioStrategy的实盘自动交易管理界面也和CtaStrategy比较相似,只是少掉了右上角停止单状态的显示区域:

 

description
 

对于已经掌握CTA策略开发的用户来说,基本可以无缝过渡到多标的组合策略开发上:

 

  1. 继承策略模板StrategyTemplate,创建一个新的策略类
  2. 在回调函数on_bars中,接收K线行情推送,并实现核心交易逻辑
  3. 调用buy/sell/short/cover/cancel_order等函数来发送交易请求

 

不同点

 

当然,毕竟是针对不同类型的量化策略,PortfolioStrategy在一些细节方面和CTA策略模块还是有所区别:

 

CtaStrategyCTA策略 PortfolioStrategy组合策略
K线推送 on_bar收到单一合约的K线 on_bars同时收到所有合约的K线
TICK推送 on_tick回测和实盘均支持 on_tick只有实盘中会调用,回测不支持
成交推送 on_trade
委托推送 on_order
查询持仓 通过访问策略的pos获取 调用get_pos获取某一合约的持仓
查询委托 调用get_order获取某一委托的状态
查询活动委托号 调用get_all_active_orderids获取当前全部活动委托号
交易委托 buy/sell/short/cover只需传入价格、数量 buy/sell/short/cover需要传入合约代码、价格、数量

 

其中最主要的区别,在于组合策略在接收K线推送时,是通过on_bars回调函数一次性接收该时间点上所有合约的K线数据,而不是通过on_bar函数一个个接收(无法判断当前时点的K线是否全部走完了 )。组合策略的回测只支持K线模式,但在实盘中用户可以在on_tick回调下自行管理所有K线的合成推送逻辑(比如用非标准的K线切分点)。

 

第二个区别点,在于组合策略中需要对多合约同时下单交易,在回测时无法判断某一段K线内部每个合约委托成交的先后时间顺序,因此无法提供on_order和on_trade获取委托成交推送,而只能在每次on_bars回调时通过get_pos和get_order来进行相关的状态查询。

 

第三点区别在于委托下单函数:组合策略在调用委托函数下单时必须传入具体要交易合约的代码,而不像CTA策略只能交易一个合约所以用不着。同时组合策略模块只支持限价单交易,不提供停止单功能(StopOrder)。

 

其他更新

 

DataManager模块发布后,有一堆用户询问了如何删除不需要的数据的问题,所以新版本中我们加上了一键删除的功能,就在查询出来后的数据统计结果每行的最右侧按钮。
 

接口方面的更新包括:
 

  1. 新增中亿汇达ComStar接口,主要用于国内银行间市场(中国外汇交易中心,简称CFETS)的债券固收产品交易,请注意ComStar只有各类大型金融机构才能用(券商自营交易部、银行金融市场部等),私募或者个人都用不了;
  2. 新增恒生集中柜台期权接口HsoptionGateway,实现提供ETF期权的API接入,主要是部分券商使用,比如中信证券;
  3. 中泰证券的XtpGateway增加期权交易功能的支持,至此XTP已经成为vn.py证券这边支持功能最完整的接口了(现货、两融、期权);
  4. 对易盛外盘接口TapGateway进行了代码重构,提供更好的代码可读性方便修改。

 

 
 

vn.py核心团队的底层接口开发小班课上线

日期:2020年5月16日(周六)和5月17日(周日)

时间:两天下午1点-6点,共计10小时

内容:

  • 两天共计10小时的实战训练课程

  • 市场微观结构知识的详细剖析

  • C++代码的Python封装实操

    • pybind11
    • ctypes
    • cython
  • 底层接口业务功能的对接设计

    • 扩展订单类型:FOK、FAK、Post-Only
    • 特殊交易指令:询价RFQ、做市报价Quoting

价格:9999元

报名请发送邮件到vn.py@foxmail.com,注明想参加的课程、姓名、手机、公司、职位。

Member
avatar
加入于:
帖子: 62
声望: 3

StrategyTemplate 的 on_tick 方法接受的tickdata我理解是多个标的物的tickdata混在一起的?如果有n个标的物,我需要自己合成n个BarGenerator,因此在on_tick里面我需要判断tickdata的symbol,并update_tick到对应标的物的BarGenerator中去,这样理解是否正确?

Administrator
avatar
加入于:
帖子: 4500
声望: 320

是的,每个合约的TICK推送都会调用on_tick,然后需要创建多个BarGenerator来做合成

Member
avatar
加入于:
帖子: 8
声望: 0

希望增加一个on_timer,对于某些策略来说on_tick的速度是不够的,因为1个tick要500毫秒

Member
avatar
加入于:
帖子: 1
声望: 0

赞多标的策略!
请问下后续有没有开发PortfolioBacktester上层APP,UI的计划?
源文件看见有Backtester.py了

Administrator
avatar
加入于:
帖子: 4500
声望: 320

charonlkl wrote:

赞多标的策略!
请问下后续有没有开发PortfolioBacktester上层APP,UI的计划?
源文件看见有Backtester.py了

目前没,主要多标的策略需要的配置比较繁杂,这块界面反而不如Jupyter来的方便了

Member
avatar
加入于:
帖子: 1
声望: 0

你好!多标的策略支不支持回测时拼15分钟bar(15分钟运行一次)如何做到?

Member
avatar
加入于:
帖子: 4618
声望: 284

可以参考一下示例策略pair_trading_strategy吧

Member
avatar
加入于:
帖子: 7
声望: 0

xiaohe wrote:

请参考一下示例策略pair_trading_strategy吧

请问多标的组合策略模块是不是不扫描 用户路径下的strategies 文件夹,策略文件必须保存在根目录的strategies底下?

Administrator
avatar
加入于:
帖子: 4500
声望: 320

abbyjanus wrote:

xiaohe wrote:

请参考一下示例策略pair_trading_strategy吧

请问多标的组合策略模块是不是不扫描 用户路径下的strategies 文件夹,策略文件必须保存在根目录的strategies底下?

不是哦,也会扫描【用户路径下的strategies】,如果识别不到请检查策略类是否继承了策略模板

Member
avatar
加入于:
帖子: 337
声望: 27

两个都会扫描的
abbyjanus wrote:

xiaohe wrote:

请参考一下示例策略pair_trading_strategy吧

请问多标的组合策略模块是不是不扫描 用户路径下的strategies 文件夹,策略文件必须保存在根目录的strategies底下?

Member
avatar
加入于:
帖子: 11
声望: 0

请教 这种应该怎么写?以前合成15分钟的方法,在组合策略里面应该怎么写:
self.pbg = PortfolioBarGenerator(self.on_bars,15, self.on_Xmin_bar)

Member
avatar
加入于:
帖子: 11
声望: 0

老板 能否出一个组合策略 合成X分钟的模板?
pair_trading_strategy看了下,还是不知道应该怎么加

Member
avatar
加入于:
帖子: 26
声望: 1

我尝试在porfolio_strategy中添加止盈逻辑,大体思路如下:

  1. 在on_x_bars中记录开仓的vt_orderids,
    vt_orderids = self.buy(vt_symbol, price, target_pos)
     self.open_orderids.extend(vt_orderids)
  2. 将update_trade认为是trade的回调函数,类似于cta_strategy中的on_trade, 所以重写该方法如下

    def update_trade(self, trade: TradeData) -> None:
         """
         可认为是trade的回调函数
         """
         super().update_trade(trade)
    
         # 追踪成交的开仓单,下止盈单
         if trade.vt_orderid in self.open_orderids:
              self.sell(trade.vt_symbol, price, trade.volume) # 多单的止盈单

    简单回测发现止盈单能够正常运行,请问各位觉得有什么问题吗?

Member
avatar
加入于:
帖子: 26
声望: 1

c787297017 wrote:

我尝试在porfolio_strategy中添加止盈逻辑,大体思路如下:

  1. 在on_x_bars中记录开仓的vt_orderids,
    vt_orderids = self.buy(vt_symbol, price, target_pos)
     self.open_orderids.extend(vt_orderids)
  2. 将update_trade认为是trade的回调函数,类似于cta_strategy中的on_trade, 所以重写该方法如下

    def update_trade(self, trade: TradeData) -> None:
         """
         可认为是trade的回调函数
         """
         super().update_trade(trade)
    
         # 追踪成交的开仓单,下止盈单
         if trade.vt_orderid in self.open_orderids:
              self.sell(trade.vt_symbol, price, trade.volume) # 多单的止盈单

    简单回测发现止盈单能够正常运行,请问各位觉得有什么问题吗?

或许在update_trade中还应该添加针对self.targets的管理
比如: self.targets[trade.vt_symbol] = 0

Member
avatar
加入于:
帖子: 3
声望: 0

c787297017 wrote:

c787297017 wrote:

我尝试在porfolio_strategy中添加止盈逻辑,大体思路如下:

  1. 在on_x_bars中记录开仓的vt_orderids,
    vt_orderids = self.buy(vt_symbol, price, target_pos)
     self.open_orderids.extend(vt_orderids)
  2. 将update_trade认为是trade的回调函数,类似于cta_strategy中的on_trade, 所以重写该方法如下

    def update_trade(self, trade: TradeData) -> None:
         """
         可认为是trade的回调函数
         """
         super().update_trade(trade)
    
         # 追踪成交的开仓单,下止盈单
         if trade.vt_orderid in self.open_orderids:
              self.sell(trade.vt_symbol, price, trade.volume) # 多单的止盈单

    简单回测发现止盈单能够正常运行,请问各位觉得有什么问题吗?

或许在update_trade中还应该添加针对self.targets的管理
比如: self.targets[trade.vt_symbol] = 0

我是实盘测试了,在多策略组合里面,是收到不到on_trade的成交回报的。 你确定你的update_trade函数能够收到trade:TradeData数据吗

Member
avatar
加入于:
帖子: 26
声望: 1

ce597ab4a6e94c07 wrote:

c787297017 wrote:

c787297017 wrote:

我尝试在porfolio_strategy中添加止盈逻辑,大体思路如下:

  1. 在on_x_bars中记录开仓的vt_orderids,
    vt_orderids = self.buy(vt_symbol, price, target_pos)
     self.open_orderids.extend(vt_orderids)
  2. 将update_trade认为是trade的回调函数,类似于cta_strategy中的on_trade, 所以重写该方法如下

    def update_trade(self, trade: TradeData) -> None:
         """
         可认为是trade的回调函数
         """
         super().update_trade(trade)
    
         # 追踪成交的开仓单,下止盈单
         if trade.vt_orderid in self.open_orderids:
              self.sell(trade.vt_symbol, price, trade.volume) # 多单的止盈单

    简单回测发现止盈单能够正常运行,请问各位觉得有什么问题吗?

或许在update_trade中还应该添加针对self.targets的管理
比如: self.targets[trade.vt_symbol] = 0

我是实盘测试了,在多策略组合里面,是收到不到on_trade的成交回报的。 你确定你的update_trade函数能够收到trade:TradeData数据吗

多谢回复
我在回测的时候是可以通过update_trade收到TradeData的,实盘我还没有尝试,实盘的时候收不到吗?如果收不到你是怎么追踪成交数据而进行一些操作的呢?比如基于TradeData下止盈止损单之类的操作

Member
加入于:
帖子: 13
声望: 0

请教xiaohe大佬,PortfolioStrategy中没有on_trade和on_order, 实盘中能否通过update_trade接口获取订单的交易状态(是否最终交易成功),看文章说通过调用get_pos来判断,但假如多策略多标的同时跑,两策略同时有相同合约开仓,就不知道是哪个策略的先成交的。

Member
avatar
加入于:
帖子: 2
声望: 0

请问vt_symbols 该怎么填写啊?

description

Member
avatar
加入于:
帖子: 1446
声望: 102

向阳007 wrote:

请问vt_symbols 该怎么填写啊?

description

用逗号分隔多个vt_symbol即可:

IF2312.CFFEX,IF2401.CFFEX,IF2403.CFFEX
© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】