如何优雅地做策略优化?

之前的文章中告诉大家在策略开发和策略实现中可能遇到的坑,当千辛万苦避坑成功后,发现回测收益曲线没有想象中那么理想,先别哭天抢地说放弃,可能只是你设置的策略参数有点儿“水土不服”。这就涉及到量化策略的参数优化问题了,有时候这个问题哲学意味挺重的,很多时候,没有做优化的策略就像是没被喂饱的千里马,即使是好策略,也发挥不出本身巨大的威力。过度优化又可能变成过度拟合,使得策略模型为了靓丽的收益指标,陷入对历史噪声的过分拟合,失去了在未来行情中的实战能力。为了让小伙伴能优雅地完成策略优化,本期主要讲讲怎么做参数优化、数据集的划分方法和如何尽可能规避过度拟合。
01
怎么做参数优化
1 遍历法最普遍最通用的参数优化方法就是参数组合遍历法,这基本也是每个量化软件和量化平台自带的方法。遍历法的原理和简单,假设策略有3个参数分别为A、B、C,其中A有3个取值[a1,a2,a3],B有4个取值[b1,b2,b3,b4],C有5个取值[c1,c2,c3,c4,c5],将它们的取值统统排列组合起来,便形成参数组合[a1,b1,c1]、[a1,b2,c1]、[a1,b3,c1]、……、[a3,b4,c5],共有3×4×5=60个这样的参数组合。将策略的参数分别设为这些参数组合,分别做回测,则可以记录下60组风险收益指标,可以根据自己对策略的判断标准(常用的有夏普率、收益回撤比、盈亏比等),从这60组中选出判断指标最好的那个参数组合,作为策略最终确定的参数。用遍历法来做策略优化的原理是那么的简洁明了,最终确定的参数也是整个参数空间中最优的,但有的时候这个方法却可能“行不通”,或者说是在实际当中难以应用。

因为遍历法是穷举了所有可能的参数组合,假设策略有5个参数,每个参数有5种可能的取值,那么共有5×5×5×5×5=3125种参数组合,每次策略回测需要5秒,则需要15625秒,完成遍历需要15625÷3600=4.34个小时,眼睛一闭一睁,一个上午就过去了,哈嗷~

在实际当中,可能策略的参数组合更多,回测耗时更长,总不能坐在那里傻等着遍历完成,优化出来的效果靓丽还好,若仍是不佳,那就更加郁闷了,我们需要的是高效敏捷的优化方法。

2 启发法此时,以遗传算法为代表的带有启发性搜索方向的参数优化方法就该隆重登场了,遗传算法的具体原理可以去度娘一下,有很多生动形象和言简意赅的介绍帖。我们只需要知道,遗传算法是模拟生物的进化过程,“适者生存,不适者淘汰”,这样我们就不需要遍历所有的参数组合,因为参数组合的搜索方向是朝着更好的回测效果而去,所以能有效缩短参数寻优的时间,做更多有意义的事情。这种带有启发性搜索方向的优化方法不止遗传算法这一种,只不过它是比较有名,各种场合乱入,想了解更多其他的方法,度娘一下“优化方法”即可。
02
数据集的划分方法
参数的优化方法有了,那在哪里做优化呢?或者说,怎么划分数据集做优化呢。常用的三个数据集划分方法有:
  • 全样本做优化
  • 划分样本内和样本外做优化
  • 样本递进做优化
1 全样本顾名思义,就是在整个样本集上做优化,选出最好回测效果对应的那组参数作为最终确定的参数,这种方法也是大部分量化平台自带的方法。这种方法过拟合的概率比较高,因为总能在成百上千组参数中找到一组能让策略效果表现不错,除非这些参数大部分能让策略表现优异,这就是所谓的“参数平原”,与之相对的就是“参数孤岛”。
2 样本内/样本外这种方法就是为了避免“全样本优化”的弊端,将全样本划分为样本内和样本外数据,根据经验分别占数据量的60%~80%和40%~20%,先在样本内数据上做优化,确认了最优参数后,将最优参数代入到样本外数据进行计算,如果样本外数据回测效果依然表现优异,那么就选择使用这组参数上模拟盘,反之,则可能存在过拟合情况,舍弃,重新调整策略。这种划分样本内/样本外的方法依然存在过拟合的可能,因为谁也不会选择一组样本内表现优异、样本外表现差的参数,一定是两者同时都好,这也是一种变相选择对全样本数据有较好拟合的参数,过拟合概率最小的的样本划分方法就是样本递进法,接下来就介绍。3 样本递进样本递进划分数据集的方法跟样本内/样本外的划分方法很类似,但它不是一次性将数据划分为样本内和样本外,而是多次递进将部分数据划分为样本内和样本外。
如何优雅地做策略优化?-CycleGen
举个例子,假设我们总共有10个月的数据(1月~10月),那先将1~5月的数据取出来,用1~4月的数据作为样本内,5月的数据作为样本外,记录下5月份在最优参数下的回测效果。接着,取2~6月的数据,2~5月数据作为样本内,6月份数据作为样本外,记录下6月份在最优参数下的回测结果,依次递进,将5~10月的样本外数据汇总,取均值作为该策略的最终回测效果。这种样本递进进行策略优化的方法,除了降低策略的过拟合可能之外,策略的参数会随着近期的行情进行调整,而不是采用固定参数。
03
避免过度拟合的方法
1 参数不宜过多参数越多,策略就越复杂,特别是对于样本数过少或交易次数过少的数据集,就越容易过拟合。建议不要设置过多参数,“简洁”的模型反而更有生命力。
2 优化步长不宜过小每个参数都有合理的取值范围,比如反转策略中向下偏离均线(中枢)的幅度就是0~100%,因为价格最多是跌为0,此时对应的是跌幅100%。如果将跌幅作为参数,一般情况下优化步长可设为5%或10%,假设为5%,跌幅则有20 个可能取值[5%,10%,15%,…,100%],若步长取得非常小,比如0.5%,则有200种可能取值[0.5%,1.5%,2.0%,…,100.0%]。此时若优化出来只有17.5%这个参数表现不错,15%和20%表现则很一般,这个参数的设置很可能是有问题的。不要将优化步长设得太小的同时也可以很好的避开下文讲到的参数孤岛的问题。
3 避免参数孤岛大家先看下面的两张图,是不是很直观,上边那幅图是参数孤岛,参数中只有孤立的几个取值回测效果好,下边那幅图就是参数平原,大部分参数取值的回测效果都不错,让你选策略去实盘,是不是参数平原对应的那个策略让人上战场的时候心里更有底。因此,在做策略优化时,参数取值分布图如果呈现出孤岛的形态,很容易就选了过拟合的策略参数。
如何优雅地做策略优化?-CycleGen
如何优雅地做策略优化?-CycleGen
4 采用样本递进法上文已经讲了样本递进法的优化原理和优点,在此不再赘述。
04
尾声
如果你是一个容易纠结的人,策略优化到最终仍然有几组策略参数待选,一组对应最高的夏普率,一组对应最高的收益回撤比,一组对应的平均创新高的天数更短,一组对应…blabla根据实盘经验,可以同策略多参数,假设你有一个螺纹钢单品种策略,可以用同一个策略,每组参数分别做1手螺纹钢,虽然最终效果不是最好的,但往往更加稳健!

本文系作者 @ 原创发布在 CycleGen。未经许可,禁止转载。

喜欢()
评论 (0)
    热门搜索
    173 文章
    1 评论
    47 喜欢
    Top