《程序化交易实战》连载8策略编写陷阱—信号闪烁

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《程序化交易实战》连载8:策略编写陷阱—信号闪烁1.信号闪烁⑴.概念介绍信号闪烁是指程序发出了不稳定的交易信号。一旦出现这种情况,程序会在极短的时间之内,反复多次进行开平仓操作。换句话说,在策略研发者预期程序不该发出开平仓交易信号的时候,程序“自己”反复发出交易信号。对于交易员来说,这是非常危险的,如果不立即进行应急处理,程序很可能一直进行这种不合理的操作,产生大量的交易手续费成本和滑点成本,造成交易事故。⑵.原因解析信号闪烁主要由以下两个原因造成:第一,所使用的判断条件不稳定,即判断条件时而成立时而不成立。第二,虽然判断条件固定,但是开仓和平仓条件出现交集,即某些情况既满足开仓条件也满足平仓条件。这会导致程序先判断开仓条件成立,于是开仓交易;同一个Tick内,又判断平仓条件成立,所以立即把刚开的仓位平掉。接下来推送过来一个新Tick,再次判断开仓条件成立,程序会再次开仓然后平仓。如此反复,直到价格变动到开平仓条件的交集之外时,才会停下来。我们将对这两种情况分别举例说明。①.案例一大部分程序化交易模型的信号,都是由引用的价格满足开平仓条件后发出的,常用的引用价格有:开盘价,收盘价,最高价,最低价,均价等。我们用一个简单的例子来展示判断条件不稳定所导致的信号闪烁:根据5日均线和10日均线进行判断,金叉做多,死叉做空。即当5日均线突破10日均线时,做多;当10日均线突破5日均线时,做空。上面是Q语言关于金叉做多、死叉做空的代码,这里引用的是当前Bar的五日均线ma5[0]和十日均线ma10[0]。但是在当前Bar还没走完的情况下,其最高价High[0]会不停变化,所对应的ma5[0]和ma10[0]也都会变化。这样一来,可能一会出现ma5[0]ma10[0],一会又出现ma5[0]ma10[0]的情况。因此,程序可能一会发出做多的交易信号,一会发出做空的交易信号。也就是说,所触发的交易信号不稳定,出现信号闪烁。这种情况在程序后验的时候,是不会察觉到的,因为大部分的软件进行后验的时候,不是以Tick驱动,而是以Bar驱动。所以在涉及到信号触发那根Bar的时候,High[0]会被默认为这根Bar的最高价,是一个常数,所以ma5[0]也是一个常数。这样做的好处是减少了后验的运算量,大大节省了后验的时间成本,但这样也会带来后验过程中无法发现信号闪烁问题的弊端。下面这幅图是这个信号闪烁的例子在价格以Tick驱动时产生的结果,我们可以清楚地看到,在同一根Bar中程序反复开平仓。下面我们来看一下这段代码的修正方法:引用上一根Bar的五日均线ma5[1]和十日均线ma10[1],以及前一根Bar的最高价High[1]。因为它们是已经成为历史的数据,是常数。在这种情况下,一旦出现ma5[1]ma10[1]或者ma5[1]ma10[1],信号就会固定下来,不会反复发生改变。②.案例二下面我们以Hans123为例,展示一个常见的错误:策略的开仓条件和平仓条件有交集,导致程序连续不断地反复开平仓。Hans123在开盘后一段时间(HansTime)后,确定高低点。随后价格突破高点做多,跌破低点做空。为了避免隔夜持仓,我们在程序中加入一个新的参数,离场时间ExTime。由于之前对这个策略进行过详细解释,我们在这里省略了中间部分代码,仅列出关键代码。为了避免上面的信号闪烁问题,我们可以加入一个新的参数,停止开仓时间ExitOnCloseMins,并令它的值比离场时间ExTime稍微早一些。对于开仓条件,我们也设定一个新的限制:只有在Bar.TimeExitOnCloseMins时,即当前K线时间小于停止开仓时间时,程序才开仓。加入了这个条件后,当K线时间超过离场时间ExTime之后程序平仓离场,同时由于此时已经超过了停止开仓时间ExitOnCloseMins,即使现在的价格仍然在UpperBand以上或LowerBand以下,程序也不会再次开仓。这里仅将调整的代码部分展示出来:运行修改之后的程序,从K线图中可以看出,我们已经将信号闪烁的问题解决了。③.案例三在案例二的修正版本中我们在开仓条件中使用了Bar.CountPos.LastExitBar这一语句,这一段代码也是为了避免信号闪烁的问题。为了让大家了解这行代码的重要性,我们再举一个信号闪烁的例子,并讨论如何利用Pos.LastEntryBar和Pos.LastExitBar来解决这个问题。上面这段代码中同时存在未来函数和信号闪烁的问题,在后验的K线中可以清楚地看出来。其中的未来函数问题我们在未来函数案例四中讨论过,是无法判断开多仓和开空仓先后顺序的问题,这里就不再赘述。我们在这里只专门讨论信号闪烁的问题:1)后验时,这段代码在某些bar上会出现开平仓各两次的情况,因为有可能存在bar上High[0]=Open[0]+3和Low[0]=Open[0]–3同时被满足的情况。2)如果将这个策略用于实盘,情况会更加糟糕。在实盘中,如果价格“上蹿下跳”,多次突破Open[0]+3之上,又被打回Open[0]–3以下,那么在这根bar内就会多次发出买卖的交易信号,产生严重的信号闪烁。为了解决这个问题,避免在同一个Bar上反复开平仓,我们可以引入两个全局变量:上一次开仓时的bar序号Pos.LastEntryBar和上一次平仓时的bar序号Pos.LastExitBar。我们准备平仓时,需要满足当前Bar的索引Bar.Count必须大于上次开仓时的bar序号Pos.LastEntryBar,即Bar.CountPos.LastEntryBar。同样的,我们准备开仓时,需要满足当前Bar的索引Bar.Count必须大于上一次平仓时的bar序号Pos.LastExitBar,即Bar.CountPos.LastExitBar。加入这两个条件之后,就可以确保不会在同一根bar上反复开平仓了。⑶.总结在编写bar策略时,如果存在逻辑不严密的漏洞,就很可能导致信号闪烁的问题。使用天语软件的Tick后验功能来进行后验是一个能够有效检测这一问题的方法。在此建议各位读者,在实盘之前需要认真检查策略的逻辑,让策略思想成为一个闭合的环路,避免因为出现信号闪烁的问题向市场支付高昂的学费。2.程序化交易陷阱的避免方法在本节中我们主要介绍了三个类型的程序化交易陷阱,偷价格、未来函数和信号闪烁。这些陷阱会导致后验与实盘不一致,使得后验结果失去意义;如果进行实盘,会失去“虚假的利润”,或者产生大量的交易费用导致亏损。这些陷阱在初学程序化交易的过程中,非常容易出现。但是,只要在编写代码时时常提醒自己并养成良好的习惯,并从多方面检查策略的逻辑,它们都是可以避免的。具体方法我们之前在进行案例分析时,介绍过一些,这里再进行一下总结。首先,写开平仓条件时,可以将索引值大于或等于1的Bar信息写进判断条件,慎用索引值为0的Bar信息,然后以最新Bar的开盘价Open[0]下单。因为在历史回验时,Bar的所有信息都是已知的,但在实际交易中,在当前Bar没有走完前,它的收盘价/最高价/最低价/成交量这些信息都是未知的,并在不断改变。如果以Close[0],High[0],Low[0],Volume[0]作为判断条件,在实盘交易时策略信号就会闪烁不定,判断条件就可能时而成立时而不成立。如果以收盘价Close[0]、最高价High[0]或者最低价Low[0]下单,就容易引入未来函数。因为在实时行情中,Close[0],High[0],Low[0]的值,直到Bar走完才会固定下来。值得注意的是,这里有一个例外:将High[0]大于等于某个固定值,或Low[0]小于等于某个固定值作为判断条件是可行的,并不会出现未来函数和信号闪烁的问题。因为这个条件一旦发生,便会固定下来,而不会再改变。但是,不能将High[0]和Low[0]都写入判断条件,这也是一种未来函数,因为我们不知道这两个条件的发生顺序。其次,在引入指标时,大部分时候也只能将索引值大于等于1的指标信息写进判断条件,需要慎用索引值为0的值,否则也容易出现未来函数。例如布林带指标的上轨线为UpBand,移动平均线指标为MA,在实时行情中,UpBand[0]和MA[0]也是不断变化的,只有当前Bar走完,其值才会固定下来成为UpBand[1]和MA[1]。因此我们只能将Upband[1]或MA[1]以及之前的信息写进判断条件和开平仓条件,而不能将UpBand[0]或MA[0]写进判断条件和开平仓条件。再次,设定成交价格时需要周全考虑,以防止偷价格的问题出现。这点在突破类策略中尤其需要注意,要分别考虑在bar内突破和跳空突破两种情况,还要注意开平仓条件中等号的精确使用。另外,后验时画出辅助线,并结合辅助线在K线上看开平仓的点位,这也是一个能够有效解决大部分偷价格问题的方法。最后,不要在同一根bar内的不同价格上进行开平仓操作。因为在后验中我们并不知道开仓条件和平仓条件哪一个会先触发,这可能造成后验的失真。另外,在比较特殊的行情下,同一根bar内开平仓还存在造成着信号闪烁的可能。值得注意的是,这里也有一个特例:我们可以在bar内的同一个价位上进行平仓并反手开仓的操作,这也正是反手策略的一个典型操作方法。因为这是在同一个点位上进行的操作,所以不存在先后顺序的问题更多的奥秘之处还需要有兴趣的读者慢慢揣摩体会。北京量邦信息科技股份有限公司是一家专注于金融大数据和科学云计算的新三板拟挂牌企业。公司产品线包括完备的经济金融大数据,科学云计算平台——开矿网,量化投资平台,高校创新实验室以及基金公司机构服务等。量邦科技曾获2015“金融服务行业TOP10”等荣誉,为山东青岛财富管理基金业协会会员。

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功