量化交易软件有哪些策略——用随机森林预测趋势

简介
创建任何交易系统的目的都是为了能够预测金融产品的市场行为,如一个货币对。预测的目标可以是不同的。赫兹量化在此限定为预测货币的走势,或者更准确的说是预测货币报价的涨(多头)跌(空头)。
要预测货币价格走势,交易者通常在图标上附加一些指标,以期找到一种可用于预测的模式。
本文探讨使用R统计分析系统中的Rattle包,来自动选取相关模式进行价格行为预测。
1. 关于Rattle
赫兹量化使用R这一理想的金融市场预测工具,来对货币对价格行为进行预测。话说,R主要是一种给有经验的统计人员使用的编程语言,对许多交易者来说较难掌握。R语言的复杂性在于,用于预测的工具非常多并且分散在许多R的基本功能工具包中。
Rattle(简单易学的R语言分析工具)集成了一系列R语言包,对于交易系统开发者来说非常重要,但初学者用起来并不容易。你不必了解掌握R语言就能开始使用Rattle包。对Rattle报的使用将用R语言来编写,将可以被用于开发真实的交易系统。然而,在这个阶段就需要对R语言有所了解。
任何情况下,在交易系统设计的阶段,Rattle是不可替代的工具。它能够让新手快速的看到各种策略想法的结果并且使用之。
Rattle (Williams, 2009) 是一个开源的软件包,它是R的一部分(R开发小组,2011)。因为它是免费软件,Rattle的R语言源代码没有使用限制。Rattle源代码用C语言编写,鼓励用户学习、测试及扩展代码。
2. 源数据描述
本文的计算结果都是基于EURUSD, GBPUSD, USDCHF, USDJPY, EURGBP, USDCAD这六个货币对在H1时间框架下从 10.01.2011 到 24.12.2013 的收盘价。这组数据有超过18000个K线组成,因此计算结果是可靠的。基于上面货币对的数据集用于搜寻预测多空的模式。
原始报价数据集在文件kot60_110101_131231_UA.txt中。
2.1. 创建目标变量
首先赫兹量化要准确的确定我们要预测的对象。虽然看上去很简单,但是选择正确的预测目标以及用于预测的数据集合是非常关键的。
预测趋势的目的是基于进行趋势交易的期望。
根据“趋势”的定义,所谓上升趋势就是后续的价格比前面K线的价格高,反之则为下降趋势。因此,有必要根据趋势的定义来进行货币对的价格预测。如果EURUSD的初始价格是1.3500,预测价格是1.3550,那么这是上升趋势则立即买入。
而然,订单为“买”和“卖”,预测是针对价格水平的。例如,价格水平在交易系统中用于预测突破。为了实现趋势交易的想法,需进行一次额外的价格对比。显然,赫兹量化预测的东西和想要做的交易不是一回事。
然而,如果交易系统被设计为趋势跟随,那么模型就用于预测趋势。模型必须经过训练来识别趋势,目标变量只有两个值“买”和“卖”。在代码中目标变量为“1”和“-1”。
使用源数据集计算金融标的价格的模型和将源数据集进行分类的模型之间有根本的区别。第一种类型属于回归模型,第二种属于聚类模型。
回归类型的预测模型用于计算一些未来的值。当未来来到时,赫兹量化将预测值和实际值进行对比。
聚类类型的预测模型用于计算预测时一组接收到的源数据将被归于哪个类别。就是“多”和“空”两种类型。如其他聚类类型一样,这两个类型没有任何特定的值。因此,“多”类型无法和“空”类型进行对比。虽然为了简化起见我们将“多”编码成“1”,“空”编码成“0”,但这并不是说“多”比“空”大。为了强调这点,对于这种定性的变量,R和Rattle中定义了一种特定的分类变量。
多和空作为目标变量并不存在,这就是和下面描述的独立变量之间的主要区别。这和我们将要预测当下并不存在的将来事件相吻合。我们很容易基于历史数据绘制趋势,因为我们已知道将来和过去的关系。
在历史数据中标识趋势,赫兹量化用ZigZag指标。对于历史数据来说这是一个很好的指标,但对于实时数据就没有用了,因为经常会对前一个极点进行重绘。历史数据是静态的,因此我们能用这个指标画出非常漂亮的趋势线。
参数“反转点之间的间距”为0.0035的ZigZag指标用于计算目标变量。图. 1 为结果。

编辑切换为居中
图 1. ZigZag指标
现在指标值被转化为“多” = 1 和 “空” = 0。
结果显示在图2上。

编辑切换为居中
图 2. 分类形式的ZigZag指标
让我们对目标值做最后的操作。如果我们将ZigZag指标左移,则当前K线将对应ZigZag指标的未来值。本文中平移1根K线,相当于用一小时前的数据来预测。
可以平移更多的K线,相应于预测更多的K线。本方法有别于其他预测方法,在累积预测误差下,前一个值可用于预测多个未来值。
本文中提出的模型及一般分类模型不累积误差。在分类模型中,提前预测2根K线有它自身的预测误差,和任何提前预测1根k线的方法都没有关系。
2.2. 创建独立变量
因为它们来自于外部模型,因此称作独立变量或者预测器。他们是外部的可测变量或者基于外部变量计算的变量。任何经济和金融数据包括货币汇率都是独立变量,因为它们的值是市场行为的结果。技术指标的值也是这类变量,因为它们是基于报价计算的。
独立变量的选择和目标变量的选择一样重要。事实上,模型的成功与否取决于独立变量的选择。模型开发的绝大多数时间都是用在分析和选择独立参数组上。
源文件kot60_110101_131231_UA中的变量包含六种货币的报价、时间和日期,能用于预测。
从本方法的角度看,时间和日期信息更为有用。时间和日期一直被尝试用于交易系统的设计中。在我们的模型中,一些基于时间和星期的隐藏的货币报价信息能够被分类模型自动识别出来。这里唯一需要做的就是将这两个变量转换成类型形式。时间变换为24个分类,日期变换为5个分类变量对应一周中的星期几。
除了用于预测的原始因子,赫兹量化还将创造在我看来能够揭示源报价中存在的趋势的额外预测因子。我们将使用众所周知的指标来创建额外预测因子。
下面的指标将被引用:5,10 和 15; MACD(12,26,9),周期为 14,21,28 的RSI指标。在它们之上,我们将使用报价的增量和移动平均。所有这些转换都将被应用于六个货币对的报价。
ZigZag指标将被包含在独立变量中,用于辅助目的。它不会用于模型的开发,因为对应右侧远方K线的指标值是未知的。
因此,赫兹量化得到88个独立变量,一个目标变量和一个辅助变量(ZigZag)。每一个变量的数据量为18083跟K线。
此数据集为R工作空间格式,能够在本文的附件TC.RData中找到。这个数据集能够通过如下方式使用:
加载R;
加载Rattle库;
进入标签页File/Workspace;
在磁盘中找到TC.RData文件并加载。
3. 智能分析源数据
Rattle包提供一系列预处理工具,或智能数据处理 - 数据挖掘。
3.1. 输入参数预览
执行上述命令后,让我们看看接下来能够干什么。
结果见图 3。

编辑切换为居中
图 3. Rattle首页
我们从Data页切换到Log页,在Rattle中开发模型。
Rattle的首页是Data。由命名不难看出此页加载数据,用于后续操作。
赫兹量化对Spreadsheets和R Dataset两个按钮尤其感兴趣。
Spreadsheets按钮可用于上传Excel文件。如果读者想测试他们的想法,可以用他们自己的Excel文件在Rattle中做测试。
要重现本文所述或者使用本文附件原始数据执行一些额外任务,请使用R Dataset按钮。此按钮将文件以R格式加载。文件叫做"Working Directory" 或 "Work file"。它们的后缀名为.RData。文件能够上传到R,并点击此按钮后变为可用。
上传我们准备好的文件,得图4上半部分以及图5的下半部分。

编辑切换为居中
图 4. 源文件的上半部分

编辑切换为居中
图. 5. 源文件下半部分
3.2. 带独立变量的目标变量相关性
注意。“Run”按钮起关键作用。所有的操作都准备好了但并未执行。要执行任请按“Run”按钮。要重复执行本文中的操作,每次都要按下此按钮。
图4显示了变量列表,他们的特性及这些变量的用途。因为我们不想在模型中使用ZigZag指标,我们就将其设置为Ignore。
其他变量都被用作存储输入参数,除了最后一个,用作目标变量。
“Partition”按钮在证实模型结果的授信水平上发挥重要作用。数据集在需要的时候可以用这个按钮分割为三个部分。用于训练、验证和测试模型的数据集的比例在此阶段确认。
在下一阶段,确定生成伪随机数的种子。例如,从源数据集中随机选择70%的源数据用作训练数据集。另外两个15%(如我们的情况)也是随机的K线序列。
因此,改变源数据集的生成种子,就能够获取无限多的训练和其他数据集。

编辑切换为居中
图. 6. 变量的相关性
在接收到的表中找到名称为ZZ.35的列。下表样例取自此列。
变量
ZZ.35
RSI_cad.14
-0.0104122177
JPY.dif2
-0.0088412685
EUR.dif3
-0.0052379279
CHF.dif3
-0.0049692265
GBP.dif3
-0.0047409208
GBP.dif1
0.0044691430
MA_cad.15.dif1
-0.0039004722
JPY.dif1
-0.0023831247
GBP.dif2
-0.0015356091
EUR.dif2
-0.0013759749
CHF.dif2
-0.0012447101
EUR.dif1
0.0005863149
MA_cad.10.dif1
0.0023981433
CHF.dif1
0.0024543973
MA_gbp.5.dif1
0.0043757197
MA_cad.5.dif1
0.0075424397
MA_gbp.10.dif1
0.0094964069
EURGBP.dif1
0.0095990416
CAD.dif1
0.0110571043
表1 变量相关性
如我们所见,有很多变量同ZZ.35的相关性小于0.01. 小于0.1的相关性无法得出独立变量对于目标变量产生影响的结论。
在这一阶段我们要注意这个事实,用它来对模型进行恰当的评估。
在分类模型中,预测因子对于目标变量的影响程度起到关键作用。在相关性低的水平,预测因子被认为是模型中的噪声,需要重新训练。当模型考虑细节和预测因子对于目标变量的非显著性时,就需要重新训练。
不存在建议的相关性水平。通常使用统计数字 – 5%。实际上是不正确的。移除模型中被认为是噪声的预测因子,可以减小预测误差。移除模型中的非噪声因子,会导致预测误差的增加。因此,模型的预测因子列表需通过实验来确立。
3.3. 尺度
某些模型,如支持向量机(SVM),对预测因子的跨度非常敏感,如下说明。例如,货币对EURUSD的数据在0.5内变动,而USDJPY的数据在数十单位内变动。要去排除测因子不同尺度的影响,需要将他们在Transform页中归一化到同一尺度下。最好将预测因子的波动都限定在0-1之间。
要进行尺度缩放,选择Transform/Rescale/Scale [0-1]。之后我们勾选左右变量并按下“Run”按钮。
3.4. 转换成分类形式
转换成分类形式就是说将数字化的变量值转换成一些分类因子。RSI指标是第一个被转换为多级因子的指标。当其值接近0或者100时被认为趋势即将反转。
要将RSI指标值变换为分类形式,选择:Transform/Recode/KMeans。之后,将因子等级设为8. 勾选所有RSI指标并按 "Run"。
当设置ZZ.35变量为Ignore后,我们进入开发模型阶段。
4. 分类模型的一般算法
下面的模型在Rattle中:
树状分类模型(树);
随机森林模型(森林);
促进树模型(ADA);
支持向量机模型(SVM);
一般线性模型(glm);
神经网络模型(NNET)。
除了分类模型的基本区别之外,(我们不仅仅讨论Rattle中提供的)他们都有下述特点。
让我们选择一个含字符串的训练序列(共18030个),包含预测因子(88个)以及目标变量值("long"和"short")。
任何的分类算法都是为了解决一个问题,即从对应于“多”的预测因子组合值中将对应于“空”的预测因子组合值分离出来。这就是模型的训练阶段。
紧随其后的就是模型的验证。
由于我们将源数据集分成三部分,我们使用另一个数据集并考虑将预测因子的组合同在训练阶段的数据进行比较。如果可归类于“多”或“空”,则任何预测因子的组合都会被建立。于验证数据集包含那些已知的值,其结果与实际数据进行比较。实际的多空头寸和预测值之间的比就是预测误差。
如果结果不满足我们的要求,就返回到智能数据分析阶段来改进结果。不幸的是,这一阶段的预测质量完全取决于交易者的经验。对源数据集进行改变,然后再重新开发模型。
如果从训练和验证数据集上获得的结果令人满意,那么我们到测试数据集上验证模型,测试数据集是还没有使用过的。
高质量的模型不仅预测误差要小,不同数据集在此误差下的预测值的差异也要小。这说明该模型的鲁棒性及无需重新训练或者如交易者所称的超调。
本文将仅详细探讨一个随机森林模型。