策略分享

【如何检验过拟合?】学会这招减少你实盘踩坑的概率

由woshisilvio创建,最终由woshisilvio 被浏览 560 用户

如何检测过拟合or 欠拟合?

首先祝大家五一快乐。

趁着假期没事,虫哥给大家唠嗑唠嗑实盘中踩的那些坑。

4月不易,且行且珍惜,跑的最好的一个小账户只有一点安慰奖(别笑,差不多一个月工资了…………)。平均下来 每个账户只有5-7%的平均收益,可以看到最近的行情真的不是很好赚钱。

{w:100}{w:100}{w:100}

做数据分析和建模的过程中很多时候,我们最害怕和担心的就是为了优化模型,会不自觉引入一些过于复杂的条件拟合我们模型选股的样本,导致模型的选股能力在样本外的泛化能力不强。(也就是过拟合或者欠拟合)

这里简单介绍一种思路,我们可以通过对比训练集和测试集的IC_mean数据值和 IC方向来判断 模型的综合选股能力是否存在过拟合。

→ 源码可以联系小Q领取

{w:100}{w:100}{w:100}{w:100}


我这里先抛出 我对 一个 “健康的” ,“不容易过拟合的模型”的理解。

IC误差率不过大,同时训练集和测试集样本差异不能过大。通过这些数据我们可以简单评价模型是否欠拟合或者过拟合。

{w:100}{w:100}{w:100}

1.首先数据上要保持一致性。

很多小伙伴 做回测的时候,喜欢去优化曲线 ,不断去拟合测试集的数据,做出一条45°向上的曲线,但是这样的方法,

其实在一定程度上已经是违背了我们当初划分训练集和测试集的初衷。

我们做一个完整的策略 ,应该是处于一个闭环的空间中,用一个静态的视角去观察市场,训练模型。

那训练集和测试集的划分 一般来说 是一开始就应该确定下来的。(训练集可以先不确定,但是测试集最好先定下来)

我们 最理想的模型应该是,在一段区间内的股票样本中,模型学习到了规律,在未来的一段时间中,通过这样的规律,预测到了股价的波动,我们从中赚到模式内的钱。 对,要赚模式内的钱,保持一致性。

所以 这里训练集 和测试集 的样本,我们不能让它差别太大,最好保持一致性。

比如说: 我在训练集里面 没有要求 模型去学习 追涨停的规律,

但是我知道这段时间行情做涨停的龙头股票比较好,接着为了曲线好看,我就在测试集里面,疯狂拟合涨停板的股票,

得到了一个收益为正向上的曲线。 那这样的方法的出来的模型,大部分情况都是过拟合的。

2.其次,训练集和测试集检测的IC和IR方向要具有一致性。

我这边看到很多小伙伴会说 一个模型 改变了训练时间之后 ,回测的结果就变了,得到的模型预测结果不可靠,由此得出了一个模型过拟合的结论。

那这个说法就有点绝对了。因为 改变训练时间这一点,在第一点上,就已经与我们的一致性原则相违背。

原因具体可以参考 之前的meetup 探索训练时间的长短。

https://bigquant.com/wiki/doc/celve-shijian-YNns2TC2iH

训练集和测试集检测的IC和IR方向我们需要对其保持一致性,例如模板策略


详细方法可以参考 知识库另外一篇文章。

如何做过拟合检测。→ 源码可以联系小Q领取

https://bigquant.com/wiki/doc/celve-3JphBBq5kb

为了检验 我们模型预测score信号的稳定性。

我们可以通过 求 出 score 和 return_0 未来五天的相关性,看一下我们模型合成的因子score ,

针对这个score每天选出来的股票信号

是否对未来收益具有一定的预测能力,我们把这个指标 简单定义为IC值。

如果 这个 IC相关性越高,则证明模型预测能力越明显。

若是相关性IC为负数,证明模型预测的是做空方向,为正数 就是 预测做多。

方法如下:

{w:100}{w:100}{w:100}

训练集 05年-16年,验证 训练集 14年-16年,

测试集 16-18年{w:100}{w:100}{w:100} {w:100}{w:100}{w:100}

我们取离测试集最靠近的一段时间做检测,这里用我们的模板策略来进行举例说明。

我们可以简单对 我们模型的预测信号 score 看成是一个因子,对这个score的值进行 收益率检测。


训练集 的 score信号 对 未来5天收益 的ic 值 箱型图

我们可以看到 我们训练出来的模型, 5天后预测的ic 为负数,整体预测方向是偏向做空的,

{w:100}{w:100}{w:100}{w:100}

{w:100}{w:100}{w:100}{w:100}ps:这里要先插一句, 单看训练集 的状况我们是没有办法判断 模型是否是过拟合的,最多只能看出它欠拟合。

因为如果我们把回测的开始时间参入训练集的数据(由于包含自动标注的未来数据),不管怎么样,它的曲线至少是45°向上的。所以单单看收益率我们是看不出来 模型是不是过拟合的。

而如果训练集得出来的收益很低,或者说IC的均值 和IC值 很接近0 ,则证明 其实我们训练出来的模型,并没有太强的预测能力。

至少表面上的线性规律 ,并没有很好的拟合到。

因此在这里看IC 和mean_IC的意义,是为了看到 模型信号预测的方向。一般预测方向越明显越好。

回归到我们的数据

比如 现在 的 模型预测信号score得分 ,5天的IC‘ 和10天的IC,

{w:100}{w:100}{w:100}

我们可以看到 训练集 检测出来的信号 IC为负数,同时 测试集的信号 也是负数,两边的方向是一致的,

证明我们的模型在样本外的测试并没有过度的拟合和扭曲,泛化能力还是比较强的。很好的遵循了在训练集中学习到的模式。 这才是一个健康的模型。

{w:100}{w:100}{w:100}3.实盘效果较好

实盘绩效肯定要以赚钱效应为第一指标。

从过去大部分的样本训练和模拟实盘检验中可以看到,但凡是遵循了 SCORE-检测训练集IC 与 测试集IC方向一致性的模型,

未来实盘的效果都比较好。 较为成功的案例典型 可以参考《天蝎座0.6》 做资金流数据的动量追涨策略

就是遵循了这一种模式。

https://bigquant.com/wiki/doc/06-tianti-NO-celve-yuanma-VgHM3NV3md 源码可以联系小Q领取

https://bigquant.com/live/shared/strategy?id=27843

{w:100}{w:100}{w:100}感叹一下,画图太容易,实盘两行泪。

{w:100}{w:100}{w:100}

{w:100}{w:100}{w:100}最后总结一下,前人诚不欺我,知行合一,不忘初心,方得始终。

不要过度迷信 回测曲线, 曲线是静态的,市场是动态的,别扯什么基本面,技术面,资金面,除非你想面面俱到。

赚钱才是最硬的逻辑。不管是数据上,还是实盘上。回测再美丽,实盘亏成🐕一样也是不行的。

探索量化策略的过程并不总是一帆风顺的,但一朝悟道,或者有哪天做出好的策略 ,中间的成就感是无与伦比的。


衷心祝愿大家 在新的一年里,身体健康,工作顺利,账户长红,量化有成。


\

标签

过拟合欠拟合实盘
评论
  • 虫哥,感谢分享,虽然没看到源码,但感觉这个在模型里用训练数据和测试集数据,跑因子分析模块,效果是一样的吧。。 但是还是有些疑问,所谓一致性,是可以确定测试集和训练集风格一致,即在训练集中学习到规律可以很好的拟合测试集的市场。 但是如何能证明,测试集的回测效果可以起码短时间内应用于未来的市场?
  • 这是一个好问题,👍🏻 可以看到兄弟很有研究。😃 那么我们可以讨论一下为什么保持一致性的模型可以运用未来市场。 先说结论:理论上,只要训练集和测试集误差不过大的模型,训练集收益为正,预测集收益为这正。实盘收益不会差。 1\.大部分情况,市场的风格一般都是具有延续性的,如果在确保了模型整体没有过拟合的话,训练集表现肯定说收益为正的,测试集也为正,实盘为正的概率就大。不过模型怎么去拟合数据,未来也只是仿照过去的模式在赚模式内的钱,哪怕到了未来实盘中的样本外数据也是一样。那未来的收益没必要过于担心,除非这种模式发生了重大的改变以至于影响到了这种模式无法继续盈利。 2\.因为我们用过去的数据训练模型,为的就是在过去的历史数据中通过算法找到一种规律,能预测到未来市场,最起码在数据的验证中,我们是可以清晰看到绩效曲线的。那这个可以给我们一个评判的指标,不至于像主观交易一样纯靠感觉去验证策略的一致性。 3\.以往用单因子检测的方法,是按照因子的平均收益和某一组股票买入来计算平均收益。 而在回测模式中,我们的stockranker排序模型是不会一下子买一堆股票的。 很多时候,我们测试模型并不需要买入所有的股票,而是可以只关注头部和尾部的效应。这也是排序算法的意义。 甚至于有部分因子他的盈利点也只在头部(top1 bottom1)尾部第一和第二分位的1\~2个股票,那这样的方式是没有办法去凸显我们模型的最大性能的。(这也是天梯很多单股策略买大小全仓一个股票的思路来源。) 4\.其实划分训练集和预测集做检验模型只是一个比较常规的办法。 实际上,如果我们很确定模型能训练的很好,未来能保持一致性的话,我们根本不需要预测集,实盘就是我们的预测集。 这样实盘就会沿着过去训练的成果取得一个非常好的收益。 这也是也有一部分人喜欢做超拟合策略,直接拟合所有回测数据做训练集的,未来实盘直接做验证集的一种方式。(不过这种方式检验会更加复杂)
  • 数据集ic_5_mean具体是什么意思?能否提供下公式或详细描述一下
  • 同问
{link}