首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基于遗传编程自动进化开发交易策略6

本系列文章写到这里即将告一段落,很高兴有这么多朋友关注这一话题。 本系列主要是对进化算法有一个大概介绍,遗传编程(或者译成遗传程序更贴切,即使用进化的算法,以适应度函数为进化目标,去自动生成程序去更好地解决一个问题。)

后续,我们将继续分享相关软件的一些实际操作演示,欢迎大家关注!

第六部分 对复杂性惩罚 PUNISHING COMPLEXITY

一个最不被理解, 但同时最重要的GP概念是 简约性约束parsimony pressure。早在很久的时候就已经证明, 对于任一种统计时间序列, 如果一个函数足够复杂, 就可以在给定时间范围内与观测到的值很好地匹配。然而, 这样的函数实际上毫无价值。一旦添加了新的观察结果, 或者一旦对位于观察到的时间范围之外的值进行预测, 函数就很难提供任何有意义的结果。这就是过拟合的问题。

您认为哪种是更强大的统计工具: (多元) 线性回归分析或 (多元) "非线性" 回归分析, 例如基于多项式?许多初学者可能认为, 非线性回归应该比简单的线性回归更强大。从理论上讲是这样,但实际上至少有两个严重的问题。首先, 您很少清楚地了解独立变量和因变量之间的关系类型。其次, 相比独立变量的线性组合,非线性允许任何类型,很容易导致过拟合, 从而降低回归公式的预测能力。

因此, 在将函数与一组观测值拟合时, 目标必须是创建一个鲁棒函数(健壮性的函数robust function)。在大多数情况下, 这样的鲁棒函数并不完全适合给定的数据, 但它适合 "足够好"。当然, 做出判断是很困难的。不仅仅是使用GP,每一次试图创建稳健的交易策略都是如此。然而,GP会加剧过拟合的问题。函数包含的元素越多, 即越复杂, 就能拟合更复杂的时间序列。在GP中, 匹配适应训练数据越好的交易策略越能获得更高的适应度值。其结果是, 如果不采取控制措施, GP自然更喜欢复杂的函数。这些更复杂的函数再次有更高的机会创造后代, 其中最复杂的函数也有最高的机会来适应历史数据。其结果是代码臃肿, 换句话说, 高度复杂的函数过度拟合历史数据。

因此, 复杂性必须受到惩罚。在GP中, 为防止过拟合而采取的控制措施被称为简约性约束parsimony pressure。就我所知, 在执行时, 基本上只有两种不同的方法:

1、为更复杂的函数赋予较低的适应度值。

2、防止过于复杂的后代繁殖。

在我们研究每一个之前, 应该明白, 无论我们采用什么简约性约束技术, 最终是由设计者决定, 什么是一个稳健的交易策略。没有明确的指导方针, 也没有简单的方法来准确说明函数何时过度合了历史数据。因此, 在开始使用真钱进行交易之前,使用GP、策略从来没有见过的数据进行测试非常重要,如样本外的数据, 或新地市场实时数据。

1. 降低复杂函数的适应度值

一个相当明显的方法是通过为更复杂的函数提供较低的适应度值来惩罚复杂性。例如, 可以测量进化的GP决策树中的节点数量或最大深度, 并用这个除以盈利期望。节点数量越多或树深度越大, 自然会导致更低的健身值。正如我在上一篇文章中所表明的, 如果分子和分母彼此有很大的不同, 那么一个分子或分母的变化可能会掩盖掉另一个值的变化。这一点必须要重视。人们可能会质疑,测量树的深度或树的大小是否真的合适, 但可能很难想出更好的主意。不幸的是, 这两种措施都需要对GP决策树进行全面遍历, 这大大减缓了进化过程。

不过, 真正的缺点是, 从我的经验中, 这种简约约束技术表现得不是很好。不论我怎么尝试然而代码依然会有臃肿。相比之下, 使用下一种简约约束技术效果更好。

2、防止过于复杂的后代繁殖

另一种解决简约性约束的方法是机械地防止产生超过可允许的最大数量节点的后代。通常情况下, 如果创建子节点数 (或最大节点深度) 超过允许的最大值, 则会拒绝这个个体创建另一个子级。例如, ECJ (一种基于JAVA进化搜寻系统)允许您指定要尝试的次数。在这里, 对复杂性惩罚并不是给它分配一个更低的适应度值 (虽然这可以额外实施)。相反, 所使用的手段是 "机械的", 它根本不可能创建超越特定节点数量的后代。此方法的确切细节超出了本文的预期范围, 我真的建议您更仔细地研究像ECJ 这样的实现。这种方法对我来说效果相当好, 我相信它在结果上比第一种方法优越。

臃肿之外的过拟合

还有另一个问题。即使我们设法控制代码膨胀, 另一种形式的过度拟合往往会出现。假设我们已经控制了代码膨胀, 那么GP仍然经常能够进化出一种交易策略, 这种策略在历史样本数据上看起来相当有希望,但在样本外数据表现不好。这并不一定意味着进化的策略本身存在代码膨胀的问题, 而且非常复杂。相反, 这甚至可能是一个相当简单的问题。我们观察到的过度拟合是另一种情况。显然, 为过去的数据进化出的函数 (交易策略) 根本不适用于样本外数据。然而, 由于这不是代码膨胀的影响, 我们剩下的唯一结论是, 在样本内有效的策略显然在样本外不起作用。这是一个令人沮丧的情况, 我没有解决办法。运行可预测性测试可能会让人知道市场是否可以预测, 但这仍然不能保证。市场确实在变化, 过去行之有效的交易策略在今天已经行不通, 这是一个普遍现象。也许在未来的某个时候, 他们会重新开始有效。在这种情况下, 最好只是接受现状, 继续进入另一个有希望的市场。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190103A0R2V000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券