3.1 技术指标来源
传统的直观的建模方法是规则型或者条件型的,满足一系列条件就买(卖),不满足就不进行买(卖)。这些条件都是由人脑主观构造的,但由于市场变化莫测,各种情况千差万别,很难用一些过于精确的条件来描述价格的变化。
3.1.1 建模背景介绍
举一个类似的例子,如自动驾驶。要教会一辆汽车自动驾驶,如果依靠规则系统,比如告诉它看见红灯就减速,看见绿灯就启动等,这些还算比较简单;但如果是看见前面的车就刹车、看到旁边的车就变道、看到后面的车就加速等,则会比较复杂,整套规则体系过于庞杂也不便系统化地研究,很多规则都是一些较为特殊的情况,并且规则之间多有重叠性,如何泛化又是一个问题。因此,如果顺着这种规则型、专家型的思路,很难进行系统化的研究。
20世纪80年代最流行的模型是神经网络,也有人用神经网络的方法研究自动驾驶,可惜那时候不是很成功。神经网络的一个很大问题在于过度拟合,这主要是由模型参数过多而训练数据太少导致的。比如估计一个参数的数值,数据量每扩大100倍,精度可以提高10倍;而如果估计的参数非常多,类似于一个高维统计问题,数据点则会更多地分布在样本空间的边缘地带,从而严重影响参数估计的效果。详细的讨论可以参考《Elements of Statistical Learning second edition》第二章,这里不做展开。
如果数据量足够大,在样本空间内部各种取值都有,参数估计则更为准确。当年神经网络的模型在今天重新运用都取得了很好的成果,但因为神经网络的名声不是很好,所以现在的研究者把它命名为深度学习。
现在回到汽车驾驶的问题。我们可收集非常长的驾驶记录作为训练数据,然后把可以想象到的指标如车速、前车车速、后车车速、车距等作为因子,然后用复杂的深度学习模型,例如卷积神经网络,就可以训练出很好的自动驾驶系统。事实上,人类学习驾驶也是通过观察别人驾驶,然后有个较为模糊的印象,而不是通过一条一条精确的规则来驾驶,这跟卷积神经网络类似,如果驾驶途中一条一条规则去套,显然反应不过来,容易出车祸。
因此,知道预测模型的威力之后,我们不再使用规则型的系统,在交易中也一样。本章主要讨论预测因子,下一章再讨论预测模型。
因子的来源有很多种,其实更多依赖数据的来源。如果只有行情数据,那么可以做的工作非常有限。更进一步地说,如果是持仓3、5天的中低频策略,那么过于高频的分笔数据用处不大,还要先整理成5分钟K线,然后在5分钟K线的基础上构建预测因子,这样可以变换的方式并不多见。
如果是持仓时间更长的策略,比如2~4周,那么一般需要用日线数据建模,可以使用很多基本面的数据。国内很多信息提供商会提供商品基本面的数据,比如有上游、中游、下游三种,数据有日频、周频、月频等,可以用来建模。但很多时候数据质量是一个问题,比如数据更新不及时,数据修正缺乏历史记录等,就会导致用这些数据建立的模型没说服力。行情数据虽然简单,但最起码数据质量是有保证的。如果数据质量没有保证,机器学习就会称之为垃圾进垃圾出(garbage in,garbage out),得不到有意义的结果。因此,我们这里只研究行情数据和5分钟K线。
我们以螺纹钢(rb)为例来说明。本地数据中rb的合约有如下几个:
我们可以用rb1701作为例子:
图3-1 螺纹钢1701合约
具体的价格趋势如图3-1所示,黑线部分是所有的价格,红线部分是该合约作为主力合约时的时间段。由此可以看出,每个合约都只有其上市时的一部分时间作为主力合约存在,其他都是作为非主力合约存在。一般来说,只有主力合约的流动性足够好,才能够用来交易趋势类策略,因此,我们这里构造因子也只针对主力合约进行。
一般来说,传统的技术指标并不多,下面我们逐个进行分析。
3.1.2 R自带的TTR库
我们可以先看看R的TTR(Technical Trading Rules)包里面的函数:
函数有64个之多,用它们构造技术指标应该是足够的。
例如我们可以先看第一个ADX。考察一个因子好坏的一个简单方法是看它自身与未来收益的相关性是否稳定。正负并不重要,因为只需要加个负号就可以改变。
如果一个指标,在不同的合约上,跟未来的收益率都是正相关,或者都是负相关,那么这个指标是比较稳定的;但如果一个指标在一半合约上正相关,另一半合约上负相关,那么它就不是十分稳定。另外,考察稳定性还可以用均值/标准差的方法,类似于Z-score的概念。这里这个数值是-0.266,只从数值上我们很难分辨它是高还是低,可以结合其他因子一起来看。
由此可见,这个指标的数值是0.45,而且15个合约中有11个是正的,比之前的指标更为稳定,因此,我们认为这个指标更好。
这个指标仅仅用到买卖盘后,表现弱一些,因为买卖盘后跟未来80分钟的价格变化关系不大,但是跟未来短时间的价格变化关系比较密切。因此,同样一个指标,针对不同的预测周期,会有非常不一样的效果。
也许很多人会问,这种利用过去行情信息预测未来的方法,是否违反市场弱有效的假说?其实,这个问题可以这么考虑:首先,市场弱有效本来就是个假说,有事实支持它,也有事实反驳它。其次,每个人分析信息的能力不一样,同样的信息不可能同一时间反映到行情中,有人快有人慢,信息处理能力强的人会获得一定优势,毕竟他们也支付了更多的成本(脑力、劳力),因此理应获得更高的收益。最后,大多数投资大师都反对市场弱有效假说,甚至有很多小幽默调侃它,比如“资助商学院教市场弱有效假说方便自己赚钱”,但对市场保持敬畏之心还是有必要的。总之,我觉得正确的态度是相信市场存在无效的时候,同时也认可挖掘市场无效不是那么容易的事情。
我们接下来考察其他因子:
这个因子表现更加稳定。有人会问构造这些因子的过程是否复杂,我个人的观点是没必要在构造因子上花太多的时间,原因在于因子本质上起着向量基的作用,但是在同一个线性空间下面,目标向量(因变量)确定后,用不同的基去表示本质上是一样的;其次,现在有boosting等各种ensemble方法,复杂的因子可以通过一定的方法由简单的因子合成,所以没必要去人工构造;最后,在信息源不变的情况下,构造的因子很多是高度相关的,如果精心构造一个因子,或许会过于复杂,预测效果反而不好,还不如把精力放在这些简单的因子上。综上所述,本人不会把太多精力放在构造因子上。这些因子都是运用R语言自带的函数稍加整理即可,一般只有一行代码(one liner)。
也有些人会问,如果把这些因子都公开了,会不会对其不利。事实上,既然认为特征工程不重要,自然也就不会认为这些因子有多重要。量化建模是一个庞大的系统过程,并不存在哪块特别重要之说,本人觉得各个环节都挺重要的,而且本人也一直处于不断进步中,期货中低频也未必是本人未来主要研究的方向。
另外,从单个因子来看,即便相关性不是很一致,但很多个因子结合起来,预测效果就会好很多,这就是把几个弱指标合成一个强指标的意义。总之,没必要在单个指标上花太多时间。
好了,关于TTR的指标就阐述到这里,剩下的内容大家可以自己尝试着练习一下。
3.1.3 一些技术指标的书籍
除了R语言自带的指标以外,还有一些技术指标方面的书籍大家可以参考学习一下,这里推荐一本书:《The Encyclopedia of Technical Market Indicators》,作者为Robert W. Colby。推荐这本书并不是因为这本书里面的技术因子有多厉害,而是因为这本书包含的因子数目非常多,一共有800多页,从A排到Z,有数百个因子,因此不需要自己思考,直接把上面的因子拿来用即可。这本书网上有电子版,里面的技术指标很多也包含在R的TTR包里,如果没有包含,自己简单仿照着写也不困难,这里不再赘述。
另外一些是基于日本蜡烛图(即K线图)的预测因子,可以参考这本书《日本蜡烛图技术》(史蒂夫·尼森著,丁圣元译)。这些更像是一些技术形态,把它们翻译成技术指标还需要一些工夫。
如著名的乌云盖顶:
可以看出,这类信号的返回值只有TRUE和FALSE两种,并不是具体的数值,因此很难直接拿来使用。这些更适合传统的规则型策略,不大适合拿来用在机器学习上。
还有穿刺的形态:
另外还有启明星的形态:
有人会问这些K线形态的自动识别是不是就是我们常说的“模式识别”?其实,模式识别一词更多是针对图像分析领域,比如手写数字的识别,但运用的方法还是传统的统计模型,如logistic regression。现在也有人使用更复杂的深度学习模型,在手写数字的识别上,误差率又大为降低。但这类都是标准的机器学习模型,不是那种通过语言描述一种模式(比如先涨一段回调一点再涨起来)然后用计算机去识别的模式。很多人工炒手转量化失败就是因为尝试着去用计算机语言描述这些状态,然后回测验证,这个是失败的模式。毕竟炒手主观交易很多时候也是模糊的逻辑,类似开车,而统计学习这类复杂模型也没有太清晰的逻辑,本质上也是这种模糊的思路,反而能更好拟合。
因此,这类K线形态或许不能直接拿来使用,这也是量化研究跟技术分析的一大区别,技术分析更多是基于这些形态使用的。
美国WorldQuant公司的老板写了一本书《Finding Alphas: A Quantitative Approach to Building Trading Strategies》,里面介绍了构建预测因子及测试的基本步骤,还给出了很多具体因子的例子,读者可以参考。
3.1.4 常见的论文
除了这些书籍以外,还有一些常见的论文介绍了预测因子,如《Automated Trading With Boosting and Expert Weighting》,作者是German Creamer和Yoav Freund,其中Yoav Freund是adaboost的发明者,boosting领域的顶级研究者,而boosting是机器学习领域很常见的概念。
这篇文章使用了boosting的方法来研究交易,即把一些较弱的预测因子合成为较强的预测因子,然后再构建模型,另外还给出了风险管理、投资组合优化等方法,附录给出了全部因子的公式,这些都可以作为构建因子的素材。
另外一篇比较著名的论文是《101 Formulaic Alphas》,里面列举了101个因子的公式,大多数适用于股票,但很多时候用在期货也是可以的。一般来说,用于股票的因子涉及全市场股票之间的相关关系,因此有很多基于排序(rank)的指标,而期货的因子一般只在单一品种上根据价量构建,不需要这么复杂。