返回目录:理财保险
第一部分
用遗传编程(genetic programming ,以下简称GP)来开发交易策略,需要一套设计决策来衡量不同的方面。本文中,我们采取仅用技术指标提供进出场信号构成的交易策略。像突破入场单(stop)和限价单(limit)等一些元素,可以与基本的进出场信号一起进化。虽然也可以使用GP基于基本面数据来选股,但我们在本文中不会探讨这个。
一个完整的交易策略包括下面几个要素:
- 入场与离场的指标
- 止损和止盈规则
- 仓位管理的规则
- 异常退出策略
GP技术并不能完全涵盖这些方面。例如,想要就停止一个持续亏损的策略,制定一套明确的规则,实际是要监控策略的表现,并且有一套适当的资金管理系统。资金管理可能是所有策略中最重要的部分,甚至比离场规则更重要,而离场策略又比入场策略更重要。而资金管理如何制定,取决于账户规模的大小,个人的喜好,交易的风格和许多GP以外的因素。GP主要是一个搜索和优化的函数。许多人认为通过GP或其他数据挖掘策略能够魔法般地自动生成一个完整的交易策略,这种想法是不现实的。
需要考虑的一点,使用GP来开发策略或许并不适合所有的市场。一些市场因为太有效所以无法来通过这种方式获得成功。可以对市场数据进行一些测试,来提前区分该市场是否可以用这种方式来交易。
将交易策略编码为决策树
在GP中,先将交易策略编码为决策树。决策树是一种树形数据结构,用来对可执行的算法进行编码。通过对树从根部到叶进行遍历,算法被执行,并将结果返回到根结点。如下图所示:
决策树实际是对这条决策规则进行编码:
(EMA(Close, 12) > EMA(Close 26)) AND (0.0 < ROC(Close, 5))
根节点root返回是true还是false。在这个例子中,EMA是指数移动平均线,ROC是变动速率,Close代表收盘价。这条件规则是:如果当前没有持仓,如果决策树返回真,进行买入开仓。
注意两点。
第一,图形中每一个节点有自己的返回类似,以与其他节点的输入类似相匹配。最终端,也就是树叶是没有输入节点的。这是为了避免反复进化无效的规则树而采取的重要措施。
第二,ERCs是临时随机常数(ephemeral random constant)的缩写,也就是指标或回溯周期的参数。ERCs是返回一个单个值(通常是数字)的树叶,譬如整数或者浮点数。正确处理ERCs,可以减小搜索空间的大小,从而改进搜索的结果。
GP的要素
1、 数据
2、 GP 参数 和运算符
3、 适应度函数 fitness function
4、 Parsimony pressure
我们先简单了解一下这些要点,相关细节会在后面的文章中讨论。
1、 数据
GP在很大程度上依赖已有的时间序列数据。我们需要有行情软件或其他数据源获取这些数据,并需要做一些处理。这通常是一项耗时繁琐的任务。常见的问题有,数据格式不合适,数据缺失,或有错误的数据。个股数据因为分红派息必须清洗整理,而股票指数会有“幸存者偏差”。另一个问题是数据长度不够。经验法则是对于交易策略测试的自由度必须要有10倍以上的数据点。GP对交易策略种群进行多代处理,从而凸显了有效数据的问题。虽然实际中数据要求永远无法满足,但可以采取措施来缓解这个问题。
2、 GP参数和运算符
每个个体代表一种可能的交易策略,GP对这些个体的种群populations进行一代又一代的进化。这个进化过程依靠一套经典的GP运算符,即,
这些运算符有多种实现技术,并且GP的每个运算符有不同的参数设定。例如,最基本的参数就是进化代数number of generations,种群大小population size,突变概率mutation probability。在进化过程中,参数的选择对结果的影响通常是非线性,不连续的,这有时会对经验不足的用户来说是违反直觉的。虽然基本的GP算法实际上很简单,而想实现更先进和强大的GP操作符可能会很困难。尤其是要使用并行性来实现更好的性能,更是如此。
另外一个常见的问题是,后几代倾向于生产相同的个体,使得交叉和精英操作变得无效。
3、 适应度函数
因为GP最终只是一个搜索或优化函数,所以它需要知道为搜索什么,优化什么。适应度函数为每个个体分配适应度值。具有更好适应度值的个人拥有更高的生存和繁殖概率。在开发交易策略的例子中,一个明显的适应度函数是是衡量每个策略在历史数据上的绩效表现。一个好的交易策略盈利多,亏损小。同样地,找一个合适的适应度函数通常难住了很多开发者。许多新手会选择最大化的将利润或者正确率来作为适应度函数。然而,由于各种原因,这两个方法是很差的选择,我们稍后具体解释。多数情况下,持续地盈利,比获得最高的收益更重要。此外,更先进的适应度函数会同时使用许多最大化或最小化的措施。
4、Parsimony pressure
足够复杂的函数可以完美地拟合任何历史时间序列, 这是一个众所周知的数学事实。然而, 这些函数的预测能力为零。如果不采取适当的反制措施, GP就会倾向于导致代码膨胀, 即产生极其庞大和复杂的交易策略, 这些策略在样本数据上表现很好, 但在样本外数据上完全失效。Parsimony pressure被用来惩罚过分的复杂性。在GP创建交易策略过程中,Parsimony pressure通常很重要,但不被理解。有两种选择来实现Parsimony pressure: 第一, 选择一个适应度函数, 对复杂的交易策略分配一个低适应度。其次, 机械地阻止GP从已经建立大量后代的交易策略中重新繁殖。由于仅有第一种选择通常不足以防止代码膨胀, 这两种方法的结合能使parsimony pressure能更有效。
(未完待续...)