量化测试如何避免过度拟合

发布于: 雪球转发:2回复:3喜欢:19

本文估计要做过量化测试的才看得懂,有一定专业性。不过即使没有做过量化测试也可以看一看,当是看科普文章,我尽量写得简单一些。

过度拟合是量化回测中最常见的错误,也是最容易犯的错误之一。什么是过度拟合呢?我朋友的岳父没有炒过股,他一直认为炒股很简单。他指着K线图说,股价从1元涨到10元,如果1元买进10元卖出就可以赚9倍,赚钱太简单了,我2007年刚入市时也是这么想的。回测中,如果测试程序每一次都是在最低价买进、最高价卖出,那么很可能就是过度拟合了。

导致过度拟合的原因主要有两个。一是测试时间过短,二是过度优化,条件和参数太多。

我们先来看一看测试时间过短的问题。测试时间的长短不能看绝对时间,这是什么意思呢,难道一年比一个月短?还真有可能。如果测试的是月线级别,那么一年只有12个周期,如果测试的是1分钟级别,一个月有60*4*22=5280个周期。你一定明白了,测试时间的长短指的是周期数的多少,也就是样本数过少。我曾经写过一个期货套利回测,用的是tick级别数据,这个级别的一般测试半年就算时间非常长了。那么周期数过少有什么问题呢?比如我们测试的是日线级别,一共只测试了2个月,一共大概只有45个交易日。这么少的周期数可能导致两个问题,第一、可能测试的某个参数刚好躲过了下跌赶上了上涨从而收益非常高,但是参数改变一点收益就大变样,这就叫过度拟合了。第二、可能测试的这个时间段只有一种类型的行情,比如刚好是大涨,或是大跌,或是振荡。如果是大涨,那么选择的参数可能都只适合大涨,而不适合别的行情类型。

第二个问题是参数太多。通过非常多的参数,或是过度复杂的模型,最后某个参数组合刚好躲过了所有下跌赶上了所有上涨,导致最后的测试收益非常漂亮。我早期写过的一个测试,曾经使用了9个参数。这9个参数是怎么来的呢?我刚开始也只用了1-2个参数,测试后观察发现某种情况下效果不好,如果加上一个条件,就可以效果好一点,再测试果然效果有好转。再观察又发现一个问题,如果加上某个条件这个问题就可以避免。就这样循环,条件和参数加了一个又一个,最终的测试效果非常优秀。因为不断的加条件加参数,几乎所有的下跌都逃过去了,所有的上涨都赶上了,这就是过度优化从而导致的过度拟合。

根据我的多年测试经验及出现过度拟合的原因,我认为要避免过度拟合,重点要注意这样两点。

一、测试时间足够长,或者叫测试样本足够多。我们A股的历史比较短,大部分能取到的数据只有十几年,对于日线级别的测试,并不算太长。这种情况下,至少要保证测试时间段中既有大涨行情、也有大跌行情、还要有振荡牛皮行情。我的股债轮动系列测试选择从2005-2019年,包含了多次大涨大跌和振荡行情,所以出现参数拟合的可能性极小。

二、测试条件及参数不能大于3个。不能为了避免某种不好情况就加个条件或参数,过度优化必然导致过度拟合。我的股债轮动系列测试判断条件非常简单,参数也只有2个,所以因为参数过多模型复杂导致过度拟合的可能性也极小。

大道至简!过度拟合最后产生的直接结果就是因为太复杂所以不通用。我认为只要做到测试样本足够多,并且参数不大于3个,就可以基本上避免过度拟合。

关于如何选择实盘交易使用的参数,我有一个常用的选参数方法。比如现在是2019年5月,测试时我只测到2017年底。从测试结果中选一个比较优秀的参数,然后用这个参数测试从2018年1月到现在的收益情况,如果收益排名与之前没有太大的差别,一般参数就没有问题。

关注微信公众号“你也会投资”,回复“养老定投”可以获取一份养老定投方案。如果你对股债轮动还有什么想法,我可以帮你测试验证自己的想法。

@蛋卷基金 @knife911

全部讨论

2019-06-15 17:54

大道至简。

2019-05-30 17:49

2019-05-30 17:29

Mark