《程序化交易实战》连载8:策略编写陷阱—信号闪烁_第1页
《程序化交易实战》连载8:策略编写陷阱—信号闪烁_第2页
《程序化交易实战》连载8:策略编写陷阱—信号闪烁_第3页
《程序化交易实战》连载8:策略编写陷阱—信号闪烁_第4页
《程序化交易实战》连载8:策略编写陷阱—信号闪烁_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程序化交易实战连载8:策略编写陷阱信号闪烁1. 信号闪烁概念介绍信号闪烁是指程序发出了不稳定的交易信号。一旦出现这种情况,程序会在极短的时间之内,反复多次进行开平仓操作。换句话说,在策略研发者预期程序不该发出开平仓交易信号的时候,程序“自己”反复发出交易信号。对于交易员来说,这是非常危险的,如果不立即进行应急处理,程序很可能一直进行这种不合理的操作,产生大量的交易手续费成本和滑点成本,造成交易事故。原因解析信号闪烁主要由以下两个原因造成:第一,所使用的判断条件不稳定,即判断条件时而成立时而不成立。第二,虽然判断条件固定,但是开仓和平仓条件出现交集,即某些情况既满足开仓条件也满足平仓条件。这会导

2、致程序先判断开仓条件成立,于是开仓交易;同一个Tick内,又判断平仓条件成立,所以立即把刚开的仓位平掉。接下来推送过来一个新Tick,再次判断开仓条件成立,程序会再次开仓然后平仓。如此反复,直到价格变动到开平仓条件的交集之外时,才会停下来。我们将对这两种情况分别举例说明。案例一大部分程序化交易模型的信号,都是由引用的价格满足开平仓条件后发出的,常用的引用价格有:开盘价,收盘价,最高价,最低价,均价等。我们用一个简单的例子来展示判断条件不稳定所导致的信号闪烁:根据5日均线和10日均线进行判断,金叉做多,死叉做空。即当5日均线突破10日均线时,做多;当10日均线突破5日均线时,做空。上面是Q语言关

3、于金叉做多、死叉做空的代码,这里引用的是当前Bar的五日均线ma50和十日均线ma100。但是在当前Bar还没走完的情况下,其最高价High0会不停变化,所对应的ma50和ma100也都会变化。这样一来,可能一会出现ma50>ma100,一会又出现ma50<ma100的情况。因此,程序可能一会发出做多的交易信号,一会发出做空的交易信号。也就是说,所触发的交易信号不稳定,出现信号闪烁。这种情况在程序后验的时候,是不会察觉到的,因为大部分的软件进行后验的时候,不是以Tick驱动,而是以Bar驱动。所以在涉及到信号触发那根Bar的时候,High0 会被默认为这根Bar的最高价,是一个常数

4、,所以ma50也是一个常数。这样做的好处是减少了后验的运算量,大大节省了后验的时间成本,但这样也会带来后验过程中无法发现信号闪烁问题的弊端。下面这幅图是这个信号闪烁的例子在价格以Tick驱动时产生的结果,我们可以清楚地看到,在同一根Bar中程序反复开平仓。下面我们来看一下这段代码的修正方法:引用上一根Bar的五日均线ma51和十日均线ma101,以及前一根Bar的最高价High1。因为它们是已经成为历史的数据,是常数。在这种情况下,一旦出现ma51>ma101或者ma51<ma101,信号就会固定下来,不会反复发生改变。案例二下面我们以Hans123为例,展示一个常见的错误:策略的

5、开仓条件和平仓条件有交集,导致程序连续不断地反复开平仓。Hans123在开盘后一段时间(HansTime)后,确定高低点。随后价格突破高点做多,跌破低点做空。为了避免隔夜持仓,我们在程序中加入一个新的参数,离场时间ExTime。由于之前对这个策略进行过详细解释,我们在这里省略了中间部分代码,仅列出关键代码。为了避免上面的信号闪烁问题,我们可以加入一个新的参数,停止开仓时间ExitOnCloseMins,并令它的值比离场时间ExTime稍微早一些。对于开仓条件,我们也设定一个新的限制:只有在Bar.Time < ExitOnCloseMins时,即当前K线时间小于停止开仓时间时,程序才开仓

6、。加入了这个条件后,当K线时间超过离场时间ExTime之后程序平仓离场,同时由于此时已经超过了停止开仓时间ExitOnCloseMins,即使现在的价格仍然在UpperBand以上或LowerBand以下,程序也不会再次开仓。这里仅将调整的代码部分展示出来:运行修改之后的程序,从K线图中可以看出,我们已经将信号闪烁的问题解决了。案例三在案例二的修正版本中我们在开仓条件中使用了Bar.Count > Pos.LastExitBar这一语句,这一段代码也是为了避免信号闪烁的问题。为了让大家了解这行代码的重要性,我们再举一个信号闪烁的例子,并讨论如何利用Pos.LastEntryBar和Pos

7、.LastExitBar来解决这个问题。上面这段代码中同时存在未来函数和信号闪烁的问题,在后验的K线中可以清楚地看出来。其中的未来函数问题我们在未来函数案例四中讨论过,是无法判断开多仓和开空仓先后顺序的问题,这里就不再赘述。我们在这里只专门讨论信号闪烁的问题:1)后验时,这段代码在某些bar上会出现开平仓各两次的情况,因为有可能存在bar上High0 >= Open0 + 3和Low0 <= Open0 3同时被满足的情况。2)如果将这个策略用于实盘,情况会更加糟糕。在实盘中,如果价格“上蹿下跳”,多次突破Open0 + 3之上,又被打回Open0 3以下,那么在这根bar内就会多

8、次发出买卖的交易信号,产生严重的信号闪烁。为了解决这个问题,避免在同一个Bar上反复开平仓,我们可以引入两个全局变量:上一次开仓时的bar序号Pos.LastEntryBar和上一次平仓时的bar序号Pos.LastExitBar。我们准备平仓时,需要满足当前Bar的索引Bar.Count必须大于上次开仓时的bar序号Pos.LastEntryBar,即Bar.Count > Pos.LastEntryBar。同样的,我们准备开仓时,需要满足当前Bar的索引Bar.Count必须大于上一次平仓时的bar序号Pos.LastExitBar,即Bar.Count > Pos.LastE

9、xitBar。加入这两个条件之后,就可以确保不会在同一根bar上反复开平仓了。总结在编写bar策略时,如果存在逻辑不严密的漏洞,就很可能导致信号闪烁的问题。使用天语软件的Tick后验功能来进行后验是一个能够有效检测这一问题的方法。在此建议各位读者,在实盘之前需要认真检查策略的逻辑,让策略思想成为一个闭合的环路,避免因为出现信号闪烁的问题向市场支付高昂的学费。2. 程序化交易陷阱的避免方法在本节中我们主要介绍了三个类型的程序化交易陷阱,偷价格、未来函数和信号闪烁。这些陷阱会导致后验与实盘不一致,使得后验结果失去意义;如果进行实盘,会失去“虚假的利润”,或者产生大量的交易费用导致亏损。这些陷阱在初

10、学程序化交易的过程中,非常容易出现。但是,只要在编写代码时时常提醒自己并养成良好的习惯,并从多方面检查策略的逻辑,它们都是可以避免的。具体方法我们之前在进行案例分析时,介绍过一些,这里再进行一下总结。首先,写开平仓条件时,可以将索引值大于或等于1的Bar信息写进判断条件,慎用索引值为0的Bar信息,然后以最新Bar的开盘价Open0下单。因为在历史回验时,Bar的所有信息都是已知的,但在实际交易中,在当前Bar没有走完前,它的收盘价/最高价/最低价/成交量这些信息都是未知的,并在不断改变。如果以Close0,High0,Low0,Volume0作为判断条件,在实盘交易时策略信号就会闪烁不定,判

11、断条件就可能时而成立时而不成立。如果以收盘价Close0、最高价High0或者最低价Low0下单,就容易引入未来函数。因为在实时行情中,Close0,High0,Low0的值,直到Bar走完才会固定下来。值得注意的是,这里有一个例外:将High0大于等于某个固定值,或Low0小于等于某个固定值作为判断条件是可行的,并不会出现未来函数和信号闪烁的问题。因为这个条件一旦发生,便会固定下来,而不会再改变。但是,不能将High0和Low0都写入判断条件,这也是一种未来函数,因为我们不知道这两个条件的发生顺序。其次,在引入指标时,大部分时候也只能将索引值大于等于1的指标信息写进判断条件,需要慎用索引值为

12、0的值,否则也容易出现未来函数。例如布林带指标的上轨线为UpBand,移动平均线指标为MA,在实时行情中,UpBand0和MA0也是不断变化的,只有当前Bar走完,其值才会固定下来成为UpBand1和MA1。因此我们只能将Upband1或MA1以及之前的信息写进判断条件和开平仓条件,而不能将UpBand0或MA0写进判断条件和开平仓条件。再次,设定成交价格时需要周全考虑,以防止偷价格的问题出现。这点在突破类策略中尤其需要注意,要分别考虑在bar内突破和跳空突破两种情况,还要注意开平仓条件中等号的精确使用。另外,后验时画出辅助线,并结合辅助线在K线上看开平仓的点位,这也是一个能够有效解决大部分偷价格问题的方法。最后,不要在同一根bar内的不同价格上进行开平仓操作。因为在后验中我们并不知道开仓条件和平仓条件哪一个会先触发,这可能造成后验的失真。另外,在比较特殊的行情下,同一根bar内开平仓还存在造成着信号闪烁的可能。值得注意的是,这里也有一个特例:我们可以在bar内的同一个价位上进行平仓并反手开仓的操作,这也正是反手策略的一个典

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论