文档章节

遗传算法及其在交易中的应用

暗之幻影
 暗之幻影
发布于 2015/01/10 08:58
字数 3372
阅读 137
收藏 1

简介

遗传算法似乎是一个专属于有经验的程序员或者量化研究员的花哨术语。虽然,咋一眼看起来,遗传算法对于一般交易员来说过于复杂,但是当你真正了解它的时候会发现其实并没有那么复杂。本文将带你一步一步认识遗传算法以及它在构建交易系统中的应用。

为了理解遗传算法的原理及其在交易中的应用,有必要了解一些基本的生物学理论。遗传算法的概念源于达尔文的“适者生存”理论。该理论指出,拥有具有适应自然环境变化的良好特质的物种将能够生存下来。每个物种的个体之间是存在差异的。这些能够更好的适应变化的物种,也会更有可能生存和发展。

从达尔文的理论来看,豹子能够跑得快,并不仅仅是他们的本能,也是因为只有跑得快才能捕获到更多的食物,那些动作不够快的豹子就不能为自己获得足够的食物。因此,尽管可能以前会有比你我跑得慢的豹子,但是今天只有速度足够快的豹子留在了这个世界。这个自然选择的过程解释了在我们这个不断变化的世界里,所有生物的进化过程。

世界在不断的变化,市场也一样。如果你正在读这篇文章,我相信你知道市场的变化有多么地快。没有策略能够不断的战胜其他人并保持盈利能力而本身并没有任何进化机制。也没有一个机构能够永远使用它们的“神奇”组合并保持账户的不断增长。有的策略能在外汇市场1分钟的时间周期下获利,但是在迷你标普500期货市场上失效。所有的市场参与者都需要不断的跟着市场的变化而变化。只有好的交易员和对冲基金以及他们的策略可以生存。我们需要一个随着时间的推移而不断动态调整的交易系统或策略。有时候我们需要调整策略的参数,而有的时候我们可能需要完全使用不同的规则来生成我们的交易信号。这时候,遗传算法可以派上用场了。

遗传算法本质上是一种优化方法,可以帮忙寻找合适的参数组合、策略规则、组合分配权重等等。相比标准的优化方法,它属于比较另类的一种。遗传算法模拟自然选择的过程——适者生存。当需要测试的不同组合的数量太大时,其他测试方法在实际交易中可能都不太实用。

在了解更多细节之前,让我们先对遗传算法的步骤有个大概的了解。
第一步,算法将从我们感兴趣的种群中随机生成第一代个体。每个个体都会被随机赋予一定的属性,比如身高、体重和年龄。
第二步,算法将把这些个体放到指定的环境,并让它们各自为生存而竞争。有些人能生活的更好而有些则难以为继。
第三步,得分排名靠前的个体(比如前20%)将会被算法选定,其他的都将被无情的淘汰。
第四步,算法将利用这保留下来的20%个体进行杂交,从而得到其他80%的种群,即得到第二代物种。
第五步,当新一代物种产生后,算法将重复第二到第四步以让物种一代一代的进化。最后,只有优良的个体存活下来。算法将把这些个体的信息反馈给我们,例如组合的最优参数、交易规则或是组合分配权重。

问题开始

首先,让我们来看一个常见的现实问题。假设我想找一个策略来交易美国的股票。为了简化说明起见,假设有4只股票(AAPL,GOOG,IBM,AMZN),都是我们比较熟悉且想要交易的,但我们尚无法确定哪只股票或哪个股票组合,适合我们的策略进行交易。我们可以把它设为我们交易系统中的一个非确定性变量,比如说基因1(Gene_1)。

这个变量被看作是遗传算法中的一个基因(Gene)。它包含哪个股票将进入我们的策略这样的信息。基因1(Gene_1)在最开始的时候将由算法随机赋值。

但是,我们应该注意到,为了让遗传算法正常工作,我们应该把每一个变量或参数编码成字符串,看起来就像0100100010110101101110101...也就是信息存储在基因和我们电脑中的格式。

然后,我们可以选择一种方法来分配值。例如,我们可以使用下表来表示Gene_1的值:

+



“0”表示策略将不会对这只股票进行交易,“1”表示策略将对这只股票进行交易。例如,如果Gene_1=0101,表示我们将对GOOG和AMZN进行交易,而非AAPL或IBM。该表将涵盖所有可能的股票组合。

其次,为了确定我们的交易频率,我们创建另一个基因(Gene)。变量Gene_2用于储存我们的交易频率信息。同样的,我们使用如下规则进行编码:

+



例如,如果Gene_2=0100,表示我们的策略将在1小时级别周期进行交易。我们应该注意到,如何选择规则来分配基因的值并不重要。只要我们能用字符串表示并知道它到底代表什么意思,我们就可以自由选择我们偏好的任何规则。

接下来,假设我们正在使用移动平均线交叉开发一种多头趋势跟踪策略(同样,我们用最简单的例子来做说明),在这种情况下,当短期均线上穿长期均线,我们买进股票。

在这里,我们应该确定两件事情:简单移动平均还是指数移动平均,以及长短移动平均线的周期。我们指定短期移动平均线参数为5,10,15,或20;长期移动平均线周期为30,40,50,或60。因此,我们创建第三个基因,在算法中Gene_3的编码规则如下:

+



例如,如果Gene_3=10110,这意味着我们的策略是当10周期指数移动平均线上穿50周期指数移动平均线时买进股票。

最后,对离场策略,我们使用固定百分比跟踪离场并对Gene_4编码如下:

+



如果Gene_4=011,意味着策略使用的是3%跟踪离场。

现在,我们已经创建了4个基因,因此,这4个基因可以形成一个染色体(Chromosome),它包含了我们交易策略的所有选择,所选择的股票、交易频繁、均线类型、计算周期、跟踪止损百分比等。


因此,我们上述策略的染色体= 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 1

这种染色体,或策略,是第1步中所描述的“个体”。每一个基因是“个体”的一个“属性”或“特征”。每个基因的值给出了关于“属性”的信息,就像“身高”、“体重”、“年龄”这样的信息。

对于我们的交易策略的设计,算法首先将对染色体中的每个位置随机分配“0”和“1”,然后重复上述步骤,创建第一代的染色体(“个体”),在这种特殊的情况下,每一个染色体都是一个策略。每个策略的所有信息都存储在染色体的字符串里。我们生成45个“个体”作为我们的第一代策略。因此,我们就完成了第一步,并得到我们的第一代策略。

自然选择

这是前面所述的第二步。自然选择就是,我们把所有的“个体”放在野外,看看谁可以获得“更长”和“更好”。在我们的案例中,我们通过历史回溯测试来实现。

在测试中,我们将每个策略的染色体(字符串)输入回溯测试算法。回溯测试算法将读取字符串,并把它翻译为相应的策略并进行测试。经过测试,该算法将给出每个策略的业绩。在这里,你可以就如何评估策略使用任何你喜欢的指标或指标组合。在这里,我们使用最常见的夏普比率来举例说明。经过测试和评估,只有表现最好的才会被留下来,其他的都将被淘汰。

+


上图左边的45个染色体是由算法随机生成的,然后对历史数据进行测试得到夏普比率。染色体(策略)根据夏普比率进行排序。只有夏普比率排名前10位的染色体将被留到下一步。现在,我们完成了第3步。

配对

配对(Mating)又被称为杂交(Hybridization)。接下来,用从前面步骤中选出的优胜者进行杂交,并创建它们的后代。我们对优胜者从1到10进行重新编号,对它们进行配对以产生第二代策略。我们得到了45个新的个体。

+


在我们的例子中,父代是第一代中的优胜者。子代这些新策略是从父代繁衍下来的。但究竟两种策略是如何生成一个新策略的呢?了解杂交过程的细节对于在任何交易系统中实现遗传算法是至关重要的。这个过程包括两个部分:交叉和变异。

交叉

使用我们当前的例子,策略表示如下:

+


当这两个策略进行配对的时候,类似于在现实生活中,染色体中大约有比如说70%的部分会进行互换。也就是说,从某个随机点开始,染色体1的一些基因变换到染色体2的相同位置,而原来属于染色体2的基因则跑到染色体1,如下图所示。

+


正如我们看到的,两个策略的字符串从某个随机点开始进行互换。这样,我们就得到了两个新的策略。

变异

类似于遗传学中的变异,遗传算法中染色体的某些基因会由于一些未知的原因而突然改变。这个过程一般是进化的主要来源,因为它将引入一些新的元素进入系统。在遗传算法中,这个过程是一般是基于突变率而随机改变基因值,通常大约为0.05%-0.1%。也就是说,如果这个幸运的Bit原本是“0”,变异后将变为“1”,反之亦然。

+



交叉和变异后,我们得到了新一代的策略,并准备进行历史回溯测试,这是第4步。

请注意,我们最好将历史数据分为不同的时间段(可重叠),比如说时间段1,时间段2,…,时间段n。在每一轮测试第i代策略的时候使用第i时间段的数据,这样它可能包含时间段i-1的信息,但不会包含未来时间段的信息。这对于避免过度优化和前视偏差,从而得到一个可靠的结果非常重要。

经过上述步骤,遗传算法将一代又一代重复步骤2到步骤4,并返回一个优化的字符串。最后你要做的事情就是把这些字符串转换成关于策略设置或资金分配的有用信息。

结束语

此处描述的遗传算法只是为了让你对它如何构建一个策略有个直观的理解。算法中的每一步都有许多的变量。例如,你可以使用不同的机制来产生第一代“个体”。这个通常是合理构建模型并找到好的解决方案的最重要的一步。此外,还有许多其他的“目标函数”可以用于评估每一个策略的性能,有的人可能会认为换手率、最大回撤或CVaR,与夏普比率同样重要,因此可以给它们分别赋予一定的权重,作为一个综合指标对策略绩效进行评估。

到目前为止,你应该知道了遗传算法的基本思路,以及它是如何工作的。这是一个非常强大的计算工具,相比于传统的方法能极大地提高了优化的性能。希望你了解了足够的信息在你的交易系统中构建你的遗传算法。


本文转载自:http://www.liangtou.com/article/10000430602

暗之幻影
粉丝 20
博文 377
码字总数 71245
作品 0
南京
高级程序员
私信 提问
【优化算法系列】关于遗传算法,你需要知道的事

如何使用遗传算法 遗传算法的运行过程 完整的遗传算法运算流程 遗传算法的基本操作 基本遗传算法 基本遗传算法的数学模型 基本遗传算法的步骤 遗传算法的具体例证 改进遗传算法 改进的遗传算...

AllenMoore
2018/02/02
60
0
MATLAB遗传算法学习 Sheffield的gatbx (1)

入门matlab遗传算法的时候,如果你找来一本书,例如雷英杰的《matlab遗传算法工具箱及其应用》,先看概念,看数学原理,看懂了,看例子,再开始写程序,将是一个“漫长”的过程。个人认为最快...

YUYZ
2013/08/22
2.2K
0
遗传算法原理以及在量化投资的应用

本篇内容涉及遗传算法的概念,原理描述,实现方法以及在量化投资的应用。 陈焕生,凡普金科旗下会牛科技研发总监兼数据架构师,目前从事基于遗传算法因子自动化挖掘,量化投资研究。并于201...

中生代技术
2018/04/13
0
0
被错误理解的人工神经网络(三)

被错误理解的人工神经网络(一)! 被错误理解的人工神经网络(二)! 本文我们聊聊另外两个人工神经网络的误解:许多算法都需要自己来写?;神经网络训练需要大量的数据? 许多训练算法存在...

【方向】
2018/06/25
0
0
vn.py 2.0.3 发布,全功能交易程序开发框架

vn.py 2.0.3 正式版发布了,vn.py 是基于 Python 的开源量化交易程序开发框架,起源于国内私募的自主量化交易系统,目前已经成长为一套全功能的交易程序开发框架。 新版更新说明如下: 交易接...

段段段落
05/17
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
43
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部