币量化

当前位置:首页> > 量化学习> 正文

什么是量化策略里的过度拟合?

发布时间:2019/8/25 18:49:45来源:币量化

本篇文章试图对量化策略中的过度拟合问题,作一个系统的梳理,给策略研究者一个清晰的思考框架。


什么是过度拟合

过度拟合最初是统计学数据挖掘领域中的概念, 现在机器学习、量化策略领域里也有重要的地位。过度拟合指的是调优一个复杂模型(变量多的模型)去完美拟合历史事件样本,结果模型缺乏预测未来事件的能力。历史样本数越少,模型越复杂, 过度拟合越容易。 


信号和噪音

具体到股票量化策略里, 过度拟合指的是回测数据很好看, 但策略不具备未来选股的能力。在概念上,历史数据包含有用的选股信号和无用的噪音, 如果策略能拟合历史数据中的信号,则策略有真正的预测能力, 如果只是拟合噪音, 则策略没有预测能力。 一个量化策略通常会同时拟合历史数据中的信号和噪音,其中的噪音成分就是量化策略过度拟合的成分。 


由于量化策略或多或少都有过度拟合的成分, 当看到一个回测优异的量化策略时,必须高度警惕其过度拟合的危险。 


回测表现好不代表全部

从理论来说, 只要策略模型足够复杂, 总可以完美拟合任何历史数据,获得优异的回测收益。 使用机器学习的方法,获得好的回测收益并不是一件难事。只要增加模型复杂度,减少样本数,就必能获得好的回测收益。只是这样做出来的模型并没有用处。 具体到果仁策略里,样本数就是换股次数, 只要换股次数足够少, 选股模型和交易模型足够复杂,再使用智能调优, 我们总能获得好的回测收益, 但调优出来的策略并没有真实的用处。


策略回测的目的不是为了拟合过去,而是为了预测未来, 我们所作的一切都是为了提高预测未来的准确度。 过度拟合只是拟合过去, 而伤害里预测未来的准确度, 所以我们需要想办法减少过度拟合。 


策略过度拟合的一些征兆

1。 使用奇怪的筛选阈值。 比如 “市盈率在 3.12到13.31之间”, “市净率在2.16到3.22之间”等。 这些阈值的设定并没有真正原因, 只是拟合历史数据的结果。


2。筛选出来的股票数很少, 但是排名条件很多。 有的策略筛选出来10只股票, 但却使用多达10个排名条件。如此复杂的排名条件使用在如此少的股票上, 过度拟合基本是必然的。 


3. 有复杂的交易模型。交易模型里, 多个自定义交易条件, 各种止盈止损, 还有大盘择时条件等。 股票策略的核心在于选股模型,而不在于交易模型。优秀的股票量化策略,很少使用复杂的交易模型。

 

4. 换股次数很少。 换股次数越少,策略的主观判断成分越高,策略的统计可信度就越低。如果策略一直持有贵州茅台、恒瑞医药, 过去几年回测收益一定很好,但这个策略只代表一种主观判断,而没有量化统计意义。



如何减少过度拟合

减少策略过度拟合放的可能性,可以从以下几个角度考虑:


1 增加样本数。 

也就是增加换股次数。这是减少过度拟合最有效的方法。 这可以通过提高策略的持股数来实现。 比如你的策略只想持有10只股票, 在调优时,可以将策略的持股数放大到20-40只, 以放大样本数, 当得到满意的调优结果后, 再将策略持股数设回到10只。 


增加换股次数,还可以通过增加策略的换手率来实现。 尝试增加一个高频交易因子(比如WorldQuant Alpha101交易因子),这样作可以提高策略的换手率, 提高策略的活性。 这种方法一般对于中小盘策略更有效。 


研究表明, 模型中的每一个自由度至少需要15个测试样本以防止过度拟合。 比如一个策略有5个筛选条件、5个排名条件、2个交易条件, 那么策略换股次数需要达到(5+5+2) × 15 = 180次以上,才能防止过度拟合。 (一些简单的排除条件可不算入自由度中,比如当日成交量大于0, 排除ST等条件, 可不算入策略自由度。)


2 简化模型

机器学习研究实践表明,有效信号的函数曲面相对比较简单, 而噪音的函数曲面相对比较复杂。所以拟合有效信号并不一定需要复杂的模型, 而复杂模型更容易拟合噪音而不是有效信号。


一个简单策略和一个复杂策略,如果回测表现类似, 我们应该优先选择简单的那个策略。


一种简化策略的方法是, 我们可以首先调优出一个表现好的但是 较为复杂的策略, 然后再试图简化模型。 比如可以逐一排除筛选条件、排名条件、交易条件, 看策略回测收益否出现大的变化, 如果收益变化不大, 我们排除这个条件。 


3 平均模型

量化策略或多或少都会有过度拟合的成分。 将多个策略平均在一起, 可以抵消其中的过度拟合成分。我们可以将资金平均分配给多个策略,以减少总体上的拟合成分。 


4 投资逻辑

策略模型最好有解释得通的投资逻辑, 这样过度拟合的可能性就低。如果只是将多个条件拼凑在一起, 而说不清楚其中的原因, 则过度拟合的可能性就高, 需要更多样本验证。 


测试集和验证集分开的办法管用吗?

在一般的机器学习里, 防止过度拟合最有效方法是将历史数据集分成测试集和验证集两个部分。使用训练集进行模型调优,使用验证集来验证模型是否过度拟合。这种方法假设测试集和验证集,和未来情况有相同的近似度, 但这种假设在量化策略研究中并不成立。 比如2017年之前情况的市场和2017年之后的市场情况有非常大的不同, 只用2017年之前的数据调优出来的策略, 在2017年之后的表现一定不佳。如果不用最新的市场数据进行调优,就等于放弃了最新最重要的信息,所以这种通用的验证集方法在量化策略研究中不能简单套用。更推荐使用的方法是使用最近几年的数据(2016年以后的数据)对策略调优, 用更早几年的市场数据验证策略的适应性, 也就是说策略必须最近两、三年表现的好, 再早的五、六年表现的也不差。