有好多人在量化交易的回测过程中,对股票、期货之类的涨跌停比较在意,害怕涨跌停了之后交易不了,本文就尝试梳理下我对涨跌停的看法以及我在回测中的应对方式。
在开始本文对涨跌停的处理之前,需要大家对下单方式有一个基本的了解,什么是市价单,什么是限价单,可以参考我以前的一篇文章:backtrader的一些基本概念—order有哪些类型,为什么要区分限价单和市价单呢,这是因为,下限价单的时候,本身就不知道什么时候会成交,属于等待成交的,显然,不用对涨跌停过份在意。对涨跌停在意的是下市价单的,在出现信号之后,下单的时候突然涨跌停了,就可能导致交易不会立马成交,甚至会一直成交不了的情况,导致实际交易和回测不一致(如果第一个涨跌停板买不进去,然后连着涨停,实际交易收益为0;如果在回测中,认为已经买进去了,实际收益有好几个涨跌停板,就会导致回测收益失真)
如何解决回测的时候,可能出现的涨跌停呢?
涨跌停的方式有很多种,把这些各种各样的涨跌停方式分为两种:一种是一字板涨跌停,一种是非一字板涨跌停;显然,非一字板涨停,挂市价单总会成交;我们又进一步降低了我们需要考虑的范围,我们只需要考虑下市价单的情况下,如何应对一字板的涨跌停。
如何应对市价单的时候出现一字板的涨跌停
我们下市价单,一般是这个交易日收盘或者这个bar结束,计算出交易信号,决定是否下单;如果下单,就下一个市价单,相当于以涨停的价格买入,跌停的价格卖出;我们可以在最早的时间通过券商柜台等把我们的交易下进去,这样实际交易中,稍微有一些成交量,你的就可能成交;可以参考2020年华宝油气基金,大家半夜去以跌停价卖出。这种方式,就是让实际交易,尽可能符合我们回测的方式,在实际交易中所做的努力。
如果我们认为,资源限制,导致不能够比别人快一步挂单,无法在涨跌停的时候成交,那么,就需要修改回测的方式,在涨跌停的时候,不能够成交。backtrader上如何实现这一功能呢?
一种最佳的方式是修改backtrader的底层代码,让涨停的时候不能买入,跌停的时候不能卖出,这种比较完美,但是需要耗费大量的时间和精力;
一种折中的处理方式是进行多周期调用,策略运行在1秒或者1分钟上,额外加载目标周期的数据,产生交易信号;当信号产生之后,在下一秒的开盘价,涨跌停了,我们可以识别出来涨跌停(对数据进行标记,额外增加列),按照backtrader的交易机理,是会按照开盘价成交的,这个时候需要我们在这一秒结束的时候,进行平仓,把这个成交的订单给平了,这样只是导致了回测的时候多收了两次手续费,影响不大;然后就根据自己的逻辑,是等到什么时候没有涨停了,重新下单,还是直接不下单了,看自己的逻辑。
一种比较粗略的方式是使用backtrader自带的filler功能,设定交易量和bar的成交量相关,比如可以设定这个bar最多成交这个bar交易量的1%,可以参考我以前讲解filler的一篇文章,这样,在涨跌停的时候,本身成交量就可能会少一些,再按照一定的百分比,可能导致在涨跌停的时候,下单只有非常少的一部分成交,剩余的成交量可能在后面的bar成交。这种回测方法,考虑了流动性,可能和实际情况也比较接近。
import backtrader as bt cerebro = Cerebro() filler = bt.broker.fillers.FixedBarPerc(0.01) newbroker = bt.broker.BrokerBack(filler=filler) cerebro.broker = newbroker
智慧、心灵、财富,总要有一个在路上,愿我们能在人生的道路上,不断成长、不断成熟~~~
感兴趣可以关注我的专栏:
my_quant_study_note:分享一些关于量化投资、量化交易相关的思考
backtrader量化投资回测与交易:本专栏免费,分享backtrader相关的内容。
量化投资神器-backtrader源码解析-从入门到精通:本专栏目前收费99元,预计更新100篇策略+20篇backtrader讲解+80篇源代码分析。
————————————————
版权声明:本文为CSDN博主「云金杞」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:【思考14】量化交易回测中,关于涨跌停的处理方式_云金杞-CSDN博客