更灵活和丰富的撮合价格
由clearyf创建,最终由clearyf 被浏览 443 用户
导语
本文主要介绍在执行回测时,成交撮合价格如何设置以及有哪些设置方式。
撮合价格的设置
当我们新建一个模板策略时,我们默认情况是如下设置:
即买入以开盘价成交,卖出以收盘价成交。这样就决定了交易引擎在回测过程中按照哪个价格来进行撮合。 这样设置后,所有的订单都会按照这样的参数发挥作用,那如果某一笔订单想特殊处理呢?比如19年以来贸易战,策略不希望收盘卖出,而是希望开盘卖出。
我们在交易引擎里的下单API增加了order_price_field参数,参数可以设置为open或close,这样就能灵活地对每一笔交易的撮合价格进行精确控制。如果不传入参数的话,就会按照M.trade模块如上图设置的参数那样进行撮合。
order_target(sid,0,order_price_field='open')
此外,为了评估策略的资金容量,我们对M.trade模块里买入点和卖出点这两个参数进行了更丰富的扩展,支持了策略能够按更丰富的价格进行撮合。
如果资金是10万的话,那么再开盘买入基本上没有什么问题,如果资金量是300万、或者1000万呢?开盘如果只买入几只股票的话,本身的交易行为就会改变市场状态,冲击成本巨大。因此我们支持了算法交易里TWAP和VWAP。
TWAP(Time Weighted Average Price),时间加权平均价格算法,是一种最简单的传统算法交易策略。TWAP模型设计的目的是使交易对市场影响减小的同时提供一个较低的平均成交价格,从而达到减小交易成本的目的。在分时成交量无法准确估计的情况下,该模型可以较好地实现算法交易的基本目的。
VWAP是Volume Weighted Average Price 的缩写,译为成交量加权平均价。VWAP策略即是一种拆分大额委托单,在约定时间段内分批执行,以期使得最终买入或卖出成交均价尽量接近该段时间内整个市场成交均价的算法交易策略。
上述两种方式是最常用的算法交易执行方式。其实在我们实际交易的过程中也会发现,如果是一笔较大的订单,我们肯定不会直接全部下单,而是把订单进行拆分,逐渐成交。因此如果我们在回测的过程中也可以使用TWAP和VWAP的价格进行撮合,最直接的目的就是能够检验我们策略的资金容量,如果按照TWAP和VWAP进行撮合以后,收益率变动不大,那我们对策略的资金容量会有很大信心,即策略不再是只能管理几十万,管理上百万、上千万是没有问题的。
在计算TWAP和VWAP需要传入一些参数来进行计算,比如算法交易的开始时间和结束时间。为避免用户手动计算,我们已经默认计算好了一些指标,比如twap_0、twap_1、twap_2、twap_3、vwap_0、vwap_1、vwap_2、vwap_3。描述如下:
twap_0为9:31到10:30的时间加权价格;
twap_1为10:31到11:30的时间加权价格;
twap_2为13:01到14:00的时间加权价格;
twap_3为14:01到15:00的时间加权价格;
vwap_0为9:31到10:30的成交量加权价格;
vwap_1为10:31到11:30的成交量加权价格;
vwap_2为13:01到14:00的成交量加权价格;
vwap_3为14:01到15:00的成交量加权价格;
该功能已经上线,大家可以在M.trade交易模块里进行设置,举例如下:
如果买入点设置为twap_0,意味着在回测的过程中,买入的交易咱们按9:31到10:30的时间加权价格进行撮合成交,如果卖出点设置为twap_0, 意味着在回测的过程中,卖出的交易咱们按14:01到15:00的时间加权价格进行撮合成交。这样设置并回测后如果策略的收益曲线变动不大,咱们对实盘交易的资金容量就不会太过担心。
该功能支持真实价格回测和后复权价格回测。如果要手动核查下撮合价格的话,可以访问bar1d_wap_CN_STOCK_A或者bar1d_wap_CN_STOCK_A_adj来获取股票的TWAP和VWAP价格。(其中第一个表是真实的加权价格数据,后一个表是后复权的价格加权数据)
DataSource('bar1d_wap_CN_STOCK_A_adj').read(start_date='2019-06-11',end_date='2019-06-12',fields=['vwap_3'],instruments=['002198.SZA'])
我们进行了一些简单的测试,修改买入点和卖出点对策略的收益变动不会太大。大家也多试试这个新的功能吧!