中国期货市场量化交易(R与C++版)
上QQ阅读APP看书,第一时间看更新

3.2 因变量的选择

在机器学习领域,很多人把精力放在构建预测因子上,因为机器学习出现的很多都是分类问题,因变量是显然的。比如手写数字识别,因变量就是0~9这10个数字。还有一些图像识别,因变量就是猫头、狗头等图像,这些都是相当显然的。既然因变量如此简单,那么具有研究意义的就只有自变量了,因此就会花更多时间在构造因子上。

3.2.1 因变量的重要性

在金融领域,因变量就不那么显而易见了,需要自己定义。很多人刚开始研究的时候喜欢套用分类模型,也就是把y变量分成上涨、不变、下跌3类,这样显然是不够精确的。而且如果仅有价格变化的方向而没有幅度,也不足以触发交易。很多时候,价格只在很窄的区间里面震荡,这个时候即便预测对了涨跌的方向,但由于价格波动强度不足以覆盖交易成本,即使交易也很难赚到钱。

因变量的选择多种多样,不同因变量对应不同的策略,通过改变因变量来增加策略的数目相对于改变因子来说是有很多优势的,比如改变因变量后不需要增加新的因子,模型计算量比较固定,特别是实盘中,如果需要开发新的因子和增加新的内存和计算时间的话,改变因变量则一般好很多,计算完就没用了,不需要保存;另外,如果因变量固定,仅仅改变自变量的话,策略并没有什么变化,因为拟合的目标变量没有变化,只是预测的准确度改变了,而如果改变了因变量,则真正改变了策略,这样得出的策略相关性更低。

3.2.2 价格未来变化的对数收益率

以下是较为常见的因变量,之前的研究也是用价格未来变化的对数收益率作为因变量。从数学的角度出发,对数收益率可以累加,方便处理,而且跟实际的收益率相似,因此常常用它来作为实际收益率的近似值。现在来研究一下对数收益率的性质。

平均值接近零,标准差是0.007 136 72,但如果观察每个合约内部的均值和标准差,则有:

平均收益率如图3-2所示。

图3-2 价格平均收益率

由图3-2可见价格变化的平均是基本平稳的,在零附近波动,毕竟短期来看价格上不会有明显的趋势,否则整体的趋势会相当明显,但实际上不会有这么明显的趋势。

对于价格波动的标准差,如图3-3所示。

图3-3 价格波动的标准差

由图3-3可见,标准差呈现逐步上升的形态,这说明价格变化的时间序列整体上是不平稳的。

对于不平稳的y,使用回归模型会不会有问题呢?实际上,对一些趋势性很明显的yx来说,有伪回归的嫌疑,因此会对它们进行差分后再进行回归。但现在y本身并没有趋势性,只是变化幅度逐渐变大。其实我们这里定义的y并不服从独立同分布的假设,并且我们做最小二乘拟合也并没有用到这些假设,我们本质上就是在预测因子所在的线性空间找一个跟因变量y距离最近的向量,这并不依赖独立性、平稳性等假设,只要不用到与统计量相关的经典统计学内容,我们做的回归分析都是可行的。

然而,正是由于y的幅度会随着时间的变化而变化,而根据波动率聚类的原理,用近期数据做拟合或许会更有意义。因此,如果能更频繁的更新模型,对我们其实是有帮助的。对于y的走势,如图3-4所示。

代码为

可见,近期的价格波动确实比前面要大很多。

图3-4 因变量的图形

3.2.3 价格变化的点数

用价格变化的点数代替对数收益率也有一定的道理。首先,与对数收益率类似,价格实际点数的变化也是可加的,这跟实际收益率不大一样。其次,在不考虑资金管理的情况下,研究期货策略一般都是默认固定1手,这时本质上获取的是单利而不是复利的收益,考虑到实际的盈亏跟实际的收益其实是一样的,用实际盈亏或许更直观一些。

y的各个合约的均值,如图3-5所示。

图3-5 各合约因变量均值

由图3-5可见,价格变化的平均值基本不会有什么变化。对于标准差,如图3-6所示。

图3-6 各合约因变量标准差

与之前对数收益率类似,按实际价格变化的标准差计算的话也是呈现出最近上涨的趋势,也不是平稳的。下面分析一下几个指标在这个y值的表现。

之前对数收益对应的结果是-0.265 511 2,可见改变y之后两者相差不大。我们再看一个例子:

之前对数收益的结果是0.787 369 1,可见相差也不大。因此,这两个因变量的选择区别不大。

由此可见,简单改变一下y值或许并不会发生多大的变化。使用这种绝对金额的变化而不是对数收益率还有一个好处,就是对于做套利交易的策略,每次交易一个品种时,买一个卖一个,本质上就是交易价差合约。期货的价格一定是大于零的,但价差却可能是负数,负数没有对数,不存在对数收益率,因此这时只能用价格本身的变化作为因变量。

3.2.4 小波等去噪方法

前面章节提到过,改变因变量是比改变自变量更好的选择,其中另外一个好处在于无论因变量的构造如何复杂,在实盘中我们是不需要实现的,实盘中我们只需要把自变量线性相加,得到因变量的预测值,而不需要构造因变量的实际值,况且实盘中也得不到因变量的实际值。

因此,我们可以用一些更高级的方法来处理因变量,而不需要对自变量进行处理。如果我们对自变量也这么处理,那么我们也必须在实盘中对自变量进行相应的处理,这样一来编程量会非常巨大,而得到的回报未必很多。

下面来看一下小波分析的影响。首先把原来的因变量y整理出来,如图3-7所示。

图3-7 因变量的值

其中用到的软件包是wavelets,如果大家对小波分析在时间序列的应用感兴趣,可以参考这本书《Wavelet Methods for Time Series》,作者是Donald B.Percival和Andrew T. Walden,这个软件包跟这本书是相对应的。

小波算法本质上可以理解为滤波,即对信号进行过滤,希望把噪音过滤掉。对于简单的时间序列,或许本身噪音就不多,因此使用小波基过滤之后恢复的序列可以跟原序列一样。对于金融时间序列,噪音比较多,过滤后的序列或许会跟原来不一样,我们可以详细分析一下。下面的这条命令:

是把向量转成时间序列,这样才能用小波函数进行分析。

这里我们使用了dwt()这个函数进行分析,dwt()是discrete wavelet transform的缩写,离散小波变换,这里使用的滤波是haar滤波,用了3层滤波,对边界点的处理是reflection,它还有一个选项是periodic,我们可以试试:

原来reflection是0.907,现在periodic是0.727,效果差很多,毕竟原来的时间序列不是周期函数,所以还是用reflection比较好,它相当于用近期的数据进行填充。一般收益序列有波动性聚类,用近期的数据进行填充会比较好。

我们这里先用了dwt()得到小波基的各项系数,然后用idwt()把信号还原,得到的时间序列长度跟原来是一样的,都是74565,后来的数据相当于过滤之后的收益序列,它们的相关性高达90%,我们希望的结果是把噪音过滤掉,保留信号。我们可以改变n.levels试一下:

可见多加一层滤波之后相关性下降了不少。我们现在只分析n.levels=3的情况。

可见,均值/标准差是-2.07,这是相当稳定的表现,比之前0.78的水平好很多。另外93%的数值都是负数。或许大家比较奇怪的是为什么原来是正数现在成了负数?要知道这两个目标向量的相关性高达90%,为什么会出现这么大的差异?这也正是金融数据的特点,在极端高波动的情况下,往往跟低波动情况呈现出相反的特征,而波动太高的行情往往难以持续,而且风险也大,需要避免交易,而小波分析很好地考虑到了这点。

大家可以尝试使用其他的滤波,由于只是改变了因变量,预测因子没有改变,因此实盘程序不需要做任何修改,只需要保存系数的配置文件修改就可以了,这也是改变因变量的好处。低频的因子和因变量就介绍到这,下面章节介绍高频因子。