在很多量化交易者最初优化参数的时候,往往容易或多或少的出现三种类型的错误:前视偏差、过度优化和曲线拟合。这三种陷阱只要在策略开发和参数优化的过程中出现一种,造成的结局是灾难性的,这些错误可以说是量化交易者前面的地雷,稍有不慎,就容易爆炸。
首先,我们要谈的是前视偏差,前视偏差是指在策略的开发中,采取了未来的一些信息,而这些信息在实盘操作中是基本上不可能实现的。前视偏差主要表现在两个方面,一是未来函数,二是信号闪烁。
举个例子来说明未来函数,如果某个均线策略的规则是:“当前价格上穿均线的时候以开盘价开仓”,为了方便起见,我们给这个策略起个名字,叫做“未来A”,“未来A”策略就是一个典型的使用了未来函数的策略,因为开盘的时刻你无法知道这条K线是不是最终能够突破均线并发出开仓信号,“未来A”使用了一个未来的价格来决定之前的买卖。实际操作中,我们永远无法在开盘的时刻知道未来是否可能突破,如果用“未来A”策略用于测试,将表现出来非常好的业绩,但是实盘中突破的那一瞬间,却无法以开盘价成交,所以“未来A”策略几乎是一个不可能再实盘中获利的策略。
还有一种情况,叫做偷价,这种情况其实也是属于未来函数的范畴。比如某个频率较高的策略,我们暂且命名为“神偷A”,“神偷A”策略的规则是,“当价格突破当日最高价的时候,以当日最高价开仓”。“神偷A”看似并没有什么问题,但请注意,突破的意思是高于,那就是说,至少要比当日最高价高一个刻度才能被称为突破,即条件要满足“当前价=当日最高价+1tick”才叫突破。当出现这种情况的时候,“神偷A”却被要求在“当日最高价+0tick”的地方开仓,显然就“偷”了一个tick的价格。
不要小看这一个tick的误差,以螺纹钢为例,假设一年250个交易日,每个交易日均执行一次买卖,那么全年下来就是500tick,500tick的滑点成本将超越你的本金。现实的情况不但不可能让你低于一个tick的价格成交,更多的情况反而是高于一个甚至多个tick的价格成交,原因很简单,大多数趋势交易者的信号都差不多,在某个关键点位的建仓信号(比如突破某天最高价),在众多趋势交易者面前会形成竞争,大家争先恐后的买入,竞争导致价格在这些关键位置形成剧烈波动,并且这种波动通常是对程序化交易不利的波动。所以在构建一个频率较高的交易系统的时候,更多的是要考虑和解决滑点问题。通常我们要在最极端的条件下去构建和测试系统,我的系统都是高于2个tick的滑点来构建的。如果日内交易不考虑滑点的话,很多策略都能做到稳赚不赔,但现实的情况却是稳定亏损。
接下来,我们来谈谈信号闪烁,如果另外一个均线策略的规则是:“当收盘价高于均线的情况下,以突破价开仓”,我们还是给它取个名字,假设该策略叫“闪烁B”。“闪烁B”就是一个存在信号闪烁的策略,“闪烁B”在测试中跟“未来A”一样,均无法直观的看到问题,但是一旦“闪烁B”用于实盘,你就会发现其中存在的问题。因为在盘中的时候,系统会默认当前价就是收盘价,当前价高于突破价就会发出买入信号,但是如果收盘的时候价格收于均线之下,那么这个交易信号就会消失,但你却已经成交了,这种称为信号闪烁。
未来函数和信号闪烁,我们统称为前视偏差,“闪烁B”和“未来A”有一个共同点,那就是用未来的价格来决定之前的买卖,这是我们要极力避免的错误。
另外谈谈过度优化和曲线拟合,过度优化是指将一个策略的几个参数反复优化到最佳,然后根据得到的最佳参数来制定策略和控制风险。显然,如果用暴力优化,即便是一个不能赚钱的策略,也能够有个别参数能够盈利,但这种结果用于今后的实盘中,却是难以盈利的。
避免过度优化的有效办法有两个,一是采取较少的参数,参数越少,可以优化的项目就越少,自然过度优化的情况就能够得到很好的避免,并且,越少参数构建的策略,往往越稳健,无论其时效性或鲁棒性均能超越众多复杂的策略。
避免过度优化的第二方法就是,用某个策略的默认参数来做历史回溯测试,或者用随机的多组参数来测试某个策略,如果该策略无论用默认参数,还是用随机参数均能实现盈利,那么这个策略才应该被进一步开发;反之,如果某个策略仅有少数的参数能够盈利的话,那么我的建议是请果断放弃该策略。另外,你应该把一个认为可行的策略用于多品种测试,如果某个策略只能用于个别品种的话,我也强烈建议不要将这种策略用于实盘。
曲线拟合和过度优化比较类似,是指加入一些不必要的规则来拟合历史数据。比如某个股票策略,我们简称为“拟合C”,该策略规定3年时间做震荡交易,3年时间做趋势交易。假设“拟合C”策略从2010年1月开始测试,一直到2012年12月都是做震荡规则,2013年1月到2015年12月做趋势规则,到2016年1月又开始震荡规则。显然这个“拟合C”策略测试结果会非常优秀,但“3年一个周期”这条规则其实是无意义的,这是一条基于历史行情的走势添加的一条规则,你并不能以此判断在今后股票市场仍然保持3年一个周期的交替,所以“拟合C”仍然是一个看似非常优秀,却不能用于实盘交易的策略。
曲线拟合的避免方法和过度优化类似,就是要采用尽可能少的规则来构建交易系统,稍有数学常识的人都知道,一个2次函数,将可以拟合一次转折行情,一个7次函数,将可以拟合6次转折行情,只要额外增加一条规则,就可以将市场中的转折拟合一次,以此拟合出来的策略,将可能达到100%的成功率,但这么做无论是对历史的概括,还是对未来的预判,都是毫无意义的。
使用前视偏差、过度优化、曲线拟合的策略,都有一个共性,那就是在回测的时候策略表现的非常优异,但根本无法投入实盘,这是一种自欺欺人的行为,但更多的情况是很多交易者在策略的开发中不自觉的犯了这些错误,用一些错误的逻辑和公式来进行回测,并将回测结果直接用于自己预期收益和风险管理的依据,千万要记住的是,你永远不可能在一个不牢固的地基上建立起一栋摩天大楼。
所以,我在没看到别人策略的代码之前,是不会轻易判定该策略的优劣的,因为很多网上购买的策略,多数是有以上问题的策略,而这些问题,在没有进入量化交易这扇大门之前,是极少有人可能发现的,就算能够买到真正赚钱的策略,前面我也向你证明过,你仍然无法长期执行这个策略,所以,请大家不要想着走捷径,策略必须由自己开发并建立信心,天上不会掉馅饼,馅饼一定是陷阱。
转载自 python 量化交易社区