1、策略参数的优化 量化交易策略参数的优化 一个交易策略有很多的参数。以往,我们一般凭着经验,设置这些参数的值。于是,这些参数不一定是最优的。我们可以利用计算机强大的处理能力,搜索到最佳的参数组合。在这里,我们将针对“基于规则的交易策略”一章中介绍的MyRSIStrategy策略,介绍如何寻找最优的参数组合。策略参数的优化 在这个策略中,有几个关键的参数,如表1所示。在代码中设定的参数的取值范围,比起表格中的取值范围要小很多,目的是尽快运行完代码。这些参数的组合有4,409,559种,也就是有4,409,559种参数的组合形式策略参数的优化 Server/Worker模式寻找最优参数 进行参数优化
2、的第一种模式是Server/Worker模式,需要设计一个Server程序和一个Worker程序。Server程序的功能是:(1)为策略的运行准备Price Bars。(2)为策略的运行准备参数组合。(3)发动一系列Worker进程以某个参数组合运行,从各个Worker进程,收集和比较策略的运行结果。根据这些运行结果,挑选最优的参数组合。Worker程序的功能是:(1)根据Server提供的Price Bars、和参数组合,运行交易策略。并且向Server汇报运行结果策略参数的优化 Server/Worker模式寻找最优参数 注意,我们首先运行Server再运行Worker,Server只能运
3、行一份,也就是一个进程,但是Worker可以运行多份,也就是多个进程,这些进程还可以运行在不同机器上策略参数的优化 server代码分析(1)导入必要的Python库 MyRSIStrategy.py文件保存了MyRSIStrategy类的定义,所以需要导入MyRSIStrategy(模块)。itertools提供参数组合和迭代功能,比如参数A的取值为1,2,参数B的取值为11,12,那么利用itertools,我们就可以很方便地构造1,11、1,12、2,11、2,12等组合。如果参数的数量更多,每个参数的可能取值更多,组合数就越多,如前文所分析notepad+打开代码,进行分析策略参数的优
4、化 server代码分析(2)定义parameters_generator函数 parameters_generator函数的功能,是产生参数组合策略参数的优化 server代码分析(3)执行Server程序的主逻辑 从CVS文件装载价格数据,然后调用server.serve方法。传递的参数,包括已经装载的价格数据,以及参数组合生成函数。另外两个参数即localhost和9090,表示Server程序绑定到本机(localhost)的9090端口,准备读取价格数据,把数据喂给各个Worker,然后收集各个Worker的运行结果策略参数的优化 Worker代码分析(1)导入必要的Python库(
5、2)运行Worker的核心逻辑 使用PyAlgoTrade.optimizer.worker模块的run方法,利用Server提供的数据和参数,并行地运行策略MyRSIStrategy,并且向Server汇报运行结果。notepad+打开代码,进行分析策略参数的优化 运行运行Server和和Worker 以管理员方式运行“Anaconda Command Prompt”,也就是在“Anaconda Command Prompt”快捷键上按鼠标右键,选择“以管理员方式运行”即可。需要打开两个“Anaconda Command Prompt”窗口,一个运行Server,一个运行Worker。策略参
6、数的优化 运行运行Server和和Worker python Optimize_server.py策略参数的优化 运行运行Server和和Worker python Optimize_worker.py策略参数的优化 运行运行Server和和Worker Server程序输出的最好的参数组合是 Best final result 1356283.9100000008 with parameters(AAPL,164,9,2,91,10)策略参数的优化 另一种办法另一种办法 Local模式寻找最优参数策略参数的优化 Local模式寻找最优参数 在Server/Worker模式中,我们可以启动多台
7、机器,运行多个Worker(只有一个Server),利用并行处理来加快优化参数的搜索。如果我们只有一台机器,也可以进行并行处理,那就是 利 用 多 核 来 实 现 并 行 处 理。我 们 可 以 使 用pyalgotrade.optimizer.local模块的run方法来实现优化参数的搜寻策略参数的优化 Local模式寻找最优参数 在这里只有一段代码,把Server/Worker模式的代码整合在一起了。定义一个parameters_generator,用于构造各个参数组合。然 后 从C S V 文件装载价格 数 据。最 后,使 用pyalgotrade.optimizer.local模块的r
8、un方法,而不是pyalgotrade.optimizer.worker模块的run方法,用价格数据、及参数组合,执行交易策略MyRSIStrategy。根据执行结果,找到最优的参数组合notepad+打开代码,进行分析策略参数的优化 Local模式寻找最优参数 以管理员方式运行“Anaconda Command Prompt”,运行如下命令 python Optimize_local.py 程序找到的最优参数组合为 Best result so far 1356283.9100000008 with parameters(AAPL,164,9,2,91,10)策略参数的优化 讨论 其它策略,
9、根据内在原理的不同,有不同的参数需要优化。比如,基于决策树分类的交易策略,可以优化的参数有self._window_length等。为了优化该参数,需要在策略的_init_方法中,定义window_length参数,并且把window_length的值,赋给交易策略类型的self._window_length属性。在此基础上,仿照上述Server和Worker的写法,开发优化程序并运行它,寻找最优的widow length策略参数的优化 讨论需要注意的是,某些交易策略使用的算法(机器学习模型),比如支持向量机分类器,也有一些参数可以优化,包括正则化参数C、gamma参数、核函数的选择等。在这里
10、,我们把算法级参数和策略级参数分开。算法级参数仅用于策略内部的具体的算法,策略级参数类似于上文提到的、不局限于某个算法的一些参数,比如窗口大小、移动平均周期等。我们可以把这两类参数,通过交易策略的_init_方法暴露出来,以便优化器(Server/Worker)可以优化它1,一个策略模型使用了某个算法2,算法有参数,比如SVM的C和gamma3,模型也有参数,比如滑动窗口大小策略参数的优化 遗传算法与参数优化 当交易策略及核心算法的参数组合数量极大的时候,一个一个进行测试是非常费时的。比如某个交易策略(包括核心算法)有9个参数,每个参数的取值有10个,那么参数组合就是10的9次方个参数组合,对
11、整个参数空间进行搜索费时费力。遗传算法是一种优化算法,可以用于较快地找到最优或者次优的算法参数。遗传算法(Genetic Algorithm),是模拟达尔文进化论的自然选择原理而构建的进化模型,它能够不断选择优良的个体。在这里,个体表示某个模型,或者具体是某个模型的若干参数的一种配置。在生物学上,自然选择包括染色体的选择、交叉、和变异等,繁衍一代又一代的个体,进而选择出最优或者较优的个体策略参数的优化 遗传算法与参数优化 染色体 染色体用于对若干个参数进行编码,比如对于上述9个参数,每个参数有10个可能取值,那么每个参数需要4个bit的编码 注意4个bit能够表示0-15,共16个取值。现在每
12、个参数的取值为0-9(根据参数的实际意义,可以把0-9映射到实际的参数值,比如参数的实际取值为10、11、12、13、14、15、16、17、18、19,那么0-9就映射到10-19)。4个bit表示的0-9表示参数取值为0-9,10-15的参数取值如何处理?可以把它们映射到9。我们可以通过给每个参数,生成随机的4个bit,把它们拼接起来,构成一个染色体。我们随机构造n个(比如300)染色体,构成一个集合,这个集合就叫初始种群策略参数的优化 遗传算法与参数优化 交叉:所谓两个染色体的交叉,是从一个染色体取得切割点的首部,从另外一个染色体取得切割点的尾部,把这两部分组合起来,形成一个新的染色体。
13、它模仿了自然界动植物的杂交策略参数的优化 遗传算法与参数优化 变异:所谓变异,是把某个染色体的一定比例的bit,由0变成1,或者由1变成0,构造一个新的染色体。策略参数的优化 遗传算法与参数优化 Fitness 我们从初始的种群中,针对每个染色体,解析出它表示的参数组合,设置到交易策略,运行交易策略,计算一个Fitness函数值(比如夏普指数),然后对这些染色体,从优到劣进行排序。自然界有优胜劣汰的规律,我们可以保存好的染色体,也就是夏普指数高的参数组合。但是要考虑到,上一代次优的染色体,在下一代可能发生变异、变好策略参数的优化策略参数的优化 遗传算法与参数优化 选择、交叉、与变异 一般来说,
14、先进行选择,再进行交叉、再变异是是遗传算法采用的普遍做法。交叉的概率比较大,比如60%,变异的概率比较小,比如0.1%。策略参数的优化 遗传算法与参数优化 总流程 整个遗传算法的流程如下。首先确定编码规则,然后初始化种群。如果已经满足终止条件,就提取最优解;否则通过选择/交叉/变异等操作,生成下一代,一代又一代地迭代,直到满足终止条件策略参数的优化 股票间的相关性 股票之间存在相关性,我们可以利用这个相关性来对某只股票的价格变化进行预测策略参数的优化 股票间的相关性代码分析(1)导入必要的Python库 首先导入必要的Python库。(2)准备数据 建立all_data数据结构,这是一个空的字
15、典。notepad+打开代码,进行分析策略参数的优化 股票间的相关性代码分析(3)计算变化率(收益率)计算每列数据的后一天针对前一天的变化率,得到returns(是一个DataFrame),结果如下。策略参数的优化 股票间的相关性代码分析(4)计算相关性和协方差 计算相关性和协方差,并且显示,结果如下。从中可以看出AAPL和INTC、MSFT、YHOO的相关性分别为0.303、0.333、0.249,相关性并不高策略参数的优化 我们要的是延迟相关性 上述代码捕抓的相关性,是原有时间对齐的相关性。我们需要捕抓错位的相关性,即迟滞相关性(Lag Correlation)。我们先来看看什么是错位相关
16、性,然后自然明白其意义所在。策略参数的优化 我们要的是延迟相关性 从图中可以看出,我们如果计算的是A(序列)和B的位移-1(序列)的相关性,那么意味着,这种相关性表达的是提早的B、和A的相关性,于是我们就可以捕抓到B先于A变化,B和A的相关性还挺高这样的情况。换句话说,就可以利用用B的前几天的价格变化,预测A的价格变化策略参数的优化 我们要的是延迟相关性 代码分析(1)导入必要的Python库 首先导入必要的Python库,即pandas库。(2)准备两个价格序列,并进行处理notepad+打开代码,进行分析策略参数的优化 我们要的是延迟相关性 代码分析(3)计算变化率(收益率)策略参数的优化 我们要的是延迟相关性 代码分析(4)计算相关性策略参数的优化 我们要的是延迟相关性 代码分析(5)提取AAPL和MSFT股票的(位移)的相关性 为了方便观察,我们截取这个二维表的AAPL列,结果如下策略参数的优化 我们要的是延迟相关性 代码分析 进行绘图策略参数的优化 练习与思考 1,运行代码,掌握代码 分布是参数优化 本地参数优化 股票相关性 股票迟滞相关性 2,修改代码