- 基本框架
- 决策树模型
- 支持向量机
- 贝叶斯模型
- 聚类模型
机器学习通常可以分为有监督学习(supervised learning)、无监督学习(unsupervised learning)和强化学习(reinforcement learning)等。在金融领域,这些机器学习的框架都有所应用。
预测是量化投资领域的一个重要的任务,主要目标就是给定过去历史上的一些技术面或者基本面信息,预测未来的价格走势。当然,也可以用来预测波动率等其他因素的,相应地,也存在一些将所预测的波动率信息转化为投资策略并相应盈利的方法。不过这样的预测目标相对于预测价格而言不是那么直接,我们这里一般只考虑预测价格或者价格变化。给定一段较长时间内的价格数据,预测任务的目标是十分容易计算出来的,因此预测类的任务主要都是使用有监督学习的框架来做的。有监督学习算法的输入是带有标注的训练数据集,有监督学习的输出是一个可以对于样本进行预测的模型,该模型可以接受一个输入样本并且给出一个关于该样本的预测。训练数据集一般包括许多个样本,每个样本通常包括两个部分。第一部分在机器学习的范畴内通常称之为特征(feature),在多因子模型框架下通常称之为因子(factor)。这一部分通常是是某个标的(在股票市场预测中即为某只股票)在某个调仓期及之前关于该标的诸多特性的描述,比如该股票的前5个交易日的价格移动平均(MA5)、该股票的市盈率(P/E)等。这一部分也可以包括一些该调仓期及之前关于宏观市场环境的描述,比如该时刻GDP的环比增长率、该时刻之前沪深300指数的变动等。不过需要注意的是如果使用了这一部分特征,这一部分特征在同一横截面上不同样本上的取值是相同的,它会给机器学习算法的运行带来一些比较特殊的效果,使用的时候需要比较注意。这里的横截面指的是同一个时间上的样本点。由于每个样本通常包含多个特征,因此第一部分也被称作该样本的特征向量。每个样本的第二个部分是该样本的标签,标签通常可以是一个实数值,比如该标的在未来一段时间内的收益;标签也可以是一个分类标记,比如该标的在未来一段时间是否能够盈利的标签,如果可以盈利就标1,不能盈利就标0。对于前一种情况,它对应的机器学习任务就是回归任务(regression);对于后一种情况,它对应的机器学习认为是分类任务(classification),特别地,这一种分为两类的被称作二分类任务。
无监督学习相对于有监督学习最大的区别在于无监督学习不提供相应的标签。这里说的不提供标签指的不是我们有标签而不提供给算法,而是说无监督学习模型输出目标对应的标签通常是没法事先得到的。在金融领域,一个常见的无监督学习的例子就是对于股票的行业进行分类。虽然证监会、申万、中信等第三方人工地对于每只股票进行了行业的分类,但是这样的分类对于各只股票金融上的行为指征能力通常不强;另外,这样的分类通常把公司按照其主要业务分到一个行业中,并不会考虑到很多公司其实很多行业都有所涉及。通过无监督学习就能够较好地对于这些股票的行业进行分类,参考文献[1]提供了这样的一个应用例子。
如果使用有监督学习完成了预测类的任务,要想实际能在量化投资中盈利,还需要把相应的预测结果转化为最后的交易指令,这一步过程我们称之为策略。这种框架是一种十分常见的与机器学习相结合的量化投资框架,在这里我们姑且称之为“预测-策略”框架。原则上来说,如果预测足够准确,我们就容易从数学上推导出一个最优的投资策略。不幸的是,金融领域里面的预测问题具有噪声高、不稳定的特点,因此在这么多年的发展过程中也没有能够达到图像或者自然语言领域那样的预测准确率。
- 噪声高:金融中的价格是由千千万万的股民综合竞争产生的,有很多因素导致市场参与者的随机性或者非理性行为,因此价格的波动有相当的比例是本质上不可预测的,即具有很大的噪声。举例来说,股民李胜兵由于母亲生了重病,急需花钱看病,可能会把重仓的股票不择时机的尽快卖掉,导致了价格的变化,这样的事件本质上就不可预测。大量随机事件所产生的影响被记录在数据中,很容易误导模型的训练。
- 不稳定:这里稳定(stable)的意思指的是长期来说某投资标的的价格存在不随时间变化而有限的期望。在负反馈的系统里面,虽然有随机性但是总体上是稳定的,但是在金融的系统里面正反馈的效应是经常被触发的,从而导致了不稳定。一个经典的例子就是著名的”蝴蝶效应“。接着上面的举例来说,李胜兵大量的抛售引起来持有该股票其他股民恐慌,大家都以为是由于该公司发生了什么还没有被传播出来的负面新闻,提前知道的人开始急于抛售。于是其他股民也开始抛售,通过一传十、十传百的放大效应,该股票股价急剧下跌,这样的下跌又会引起更多人的抛售行为。这样的正反馈效应在股市中其实十分常见。更合理的例子是股民微信群里面捕风捉影的小道消息引起的正反馈。
然而量化投资问题通常还具有另外一个不同于图像识别或者自然语言处理问题的特点(优势),即它不要求我们对于每一个时刻都给出准确的判断,对于确信度不高的判断,我们可以选择输出“不知道”,从而不进行任何交易,这样的输出不会对于量化投资的结果带来损失。为了能够充分利用这样的一个性质,比较有潜力的有两种发展方向。第一种是让机器学习模型在进行预测的时候,不仅能够输出一个无偏的(unbiased)预测值,而且能够输出一个校准的(calibrated)确信度。这里“无偏”、“校准”表征的都是期望上的一致性。对于回归类的任务来说,模型输出预测值$\widehat{y}$和预测确信度$\widehat{\sigma}$。在大数极限下,对于所有预测值$\widehat{y}=y_0$的样本,如果其对应的真实值的平均值也等于$y_0$,那么这个模型是无偏的;对于所有预测确信度$\widehat{\sigma}=\sigma_0$的样本来说,如果其对应的预测值的平均标准差也为$\sigma_0$,那么这个模型是校准的。有了能够这样同时输出预测值和校准值的模型之后,再进行设计相应的策略,就能够充分应用前面提到的优势,从而可能提高策略效果。姑且称这种为“预测-校准-策略”框架。这种框架的难点在于,目前的机器学习算法中还没有有效的可以学习到确信度的方法。
另外一个途径可能利用到前述优势的方法是强化学习类的方法,由于强化学习类模型直接通过可观测数值给出交易策略,因此一个好的强化学习策略一定是对于上述优势有所利用的。如果你对于强化学习有所了解(不了解也没关系,后面我们会讲到),强化学习中学习到的价值函数将可能是对于未来价格走势预测和自身确信度的综合考量,这不同于有监督学习得到的模型,只是预测未来的价格走势。我们暂且直接称这种为“强化学习”框架。目前大家也有对于强化学习在量化投资领域应用的质疑,质疑的点主要在于强化学习主要强调的是一个智能体对于外部环境的重复探索,通过不同的探索它能尝试用各种方式来影响环境并且获得不同的奖励,从而学习到好的策略。而在金融领域,智能体没法对于历史进行分叉来尝试不同的探索以及经历环境带来的不同可能性,只能在一条轨迹上进行学习。个人认为,强化学习框架是比较有潜力的,但是可能需要对于强化学习中的某些部分进行一定的调整,从而能够适应金融中的特点。
总结一下,对于量化投资问题,我们这里提出了可能的三种框架,分别是“预测-策略”框架、“预测-校准-策略”框架和“强化学习”框架。主要用到有监督学习和强化学习。无监督学习与量化投资不直接相关,这里不单独做介绍;有监督学习在金融预测里面的运用对应的资料较为丰富,这里只简单介绍和总结。之后的会着重介绍一下强化学习的基本知识以及在金融中的应用。
决策树算法的目标是形成一棵决策树。当一个样本到达决策树之后,它会根据决策树的指示,并且结合样本自身所包含的特征从决策树的根节点走到决策树的某个叶子节点,决策树对于该样本的分类就由该叶子节点所指示的分类表示。比如如下图所示的一棵决策树,它根据市盈率和RSI指标来对样本进行划分,如果某个样本满足PE<20
和RSI<30
两个条件,那么就会被划分到“好”类中。
正如上面提到的,决策树算法的输入仍然是一个有标签的训练数据集,输出是一个决策树。决策树算法用来构建决策树的方式如下。决策树的构建是从决策树的根节点往叶子节点进行的,在每一个节点上,决策树算法会选择一个可以最有效地进行分支的特征,然后基于该特征来分支。如果在某一个节点上1)没有可供选择的特征;2)该节点对应的训练样本的标签都相同;或者3)决策树已经达到规定的最大深度或最大节点数,那么就不再往下进行分支。这个节点就被当做叶子节点,其对应的分类为该节点下简单多数训练样本的标签。
对于决策树模型而言,有后剪枝和预剪枝方法来避免过拟合。
- 模型能够反应具有层级结构的逻辑,比如对于大盘股和小盘股分别观察不同的特征并且做出不同的判断(即,在上级节点按照市值来分类,在不同分支下再使用不同的方式来判断)。
- 能够支持样本的某些特征为缺失值;能够支持连续和离散的特征混合使用。因此,对于金融的数据而言,可以不对特征做出填充缺失值、标准化等预处理工作,直接把数据传入进行训练。
- 效果较差的特征的加入不会过于影响模型的性能,不过会降低模型训练的速度。
- 在回归任务中每个叶子节点的数值为该叶子节点下样本标签的平均值,当树规模较小的时候,回归任务的精度可能较差。但是以决策树为基础的梯度提升树算法(gradient boosted tree)和随机森林算法(random forest)可以在回归任务上也有比较好的性能。
- 决策树所形成的分类边界是轴平行的,即所形成的分类边界是由多段与特征空间坐标轴平行线段组成的。即,每次决策树的分支都只能基于单一特征来进行,不能对于多个特征进行组合。多变量决策树(multivariate decision tree)模型可以对进行形如$\sum_i w_i f_i$的特征的线性组合进行分类。其中$f_i$表示某个特征,$w_i$表示相应的线性组合权重。
支持向量机算法可以解决二分类问题和回归问题。
对于二分类问题而言,支持向量机的主要目标是得到一个分类超平面$\bf{w}^T \bf{x} + b = 0$来对于样本进行划分,其中$\bf{w}, b$是需要学习的参数,$\bf{x}$是样本的特征向量。当给定一个样本输入的时候,我们计算该样本的$f(\bf{x})= \bf{w}^T \bf{x} + b$,如果$f(\bf{x})>0$就把它标为正样本,反之标位负样本。而对于回归问题而言,支持向量机的目标就是找到形如$f(\bf{x})= \bf{w}^T \bf{x} + b$的函数,并且直接把$f(\bf{x})$作为预测的输出。
支持向量机算法通过解一个优化问题来找到这样一个分类的超平面,优化问题的目标可以概括为尽量找到一个超平面来把正负样本分开。更进一步地,该算法不仅希望能把正负样本用一个超平面分开,而且希望离该超平面最近的样本到超平面的距离尽可能的远,这个距离称之为间隔(margin)。一类支持向量机算法要求找到一个超平面能够完全把训练集上的正负样本分开,这种方法称为硬间隔(hard margin)。在实际情况中,常常不存在这样一个超平面能够把训练集上的样本完全分开,那么我们对于能够完全被超平面正确分开的样本不给予损失,对于不能被该超平面正确分开的样本给予一个非负损失值,并且在优化的时候考虑最小化总的损失值。这样的方法称为软间隔(soft margin)。实际计算中,支持向量机把最大化间隔这样一个优化问题转化为其对偶问题(duel problem),从而可以更高效地来解决。
支持向量机还可以采用核方法(kernel method),这样对于样本划分的分类边界就不再局限于平面形式,还可以为参数控制的曲面形式了。常用的核有线性核(对应的就是上述的超平面)、多项式核、高斯核、拉普拉斯核以及sigmoid核。
- 具有许多成熟的软件包,比如LIBSVM、sklearn中的实现等,应用起来比较方便。
- 虽然训练的过程比较慢,但是训练得到模型是一个容易理解的公式,同时模型的计算使用也比较迅速。
- 当样本数目很大的时候,训练时间将会非常长。
- 在分类问题中,支持向量机是针对二分类任务设计的,如果需要进行多分类任务,需要专门的推广。
- 支持向量机核函数的选择直接决定了算法的最终性能,但支持向量机核函数的选择没有确定的理论依据或者方法。
- 不适合离散的特征作为输入。
贝叶斯模型指一类从概率视角出发构建的模型,这里主要介绍几类贝叶斯分类模型,包括朴素贝叶斯模型、半朴素贝叶斯模型和贝叶斯网;另外从概率视角出发还可以对于其他模型进行改造,比如贝叶斯线性回归。
对于贝叶斯分类器来说,其目标是使得分类正确的概率尽可能大,即贝叶斯分类器可以写作$h({\bf x})=arg \max_{c \in \mathcal{Y}} P(c|{\bf x})$,其中$\bf x$表示某样本的特征向量,$c$表示对于该样本考虑其可能的分类标签。考虑贝叶斯公式,可以将其进一步写为
因此,贝叶斯模型学习的目标就是基于训练数据集对于$P(c)$和$P({\bf x}|c)$给出一个好的估计。上式的分母部分可以看做一个归一化因子,可以不做估计。$P(c)$可以通过各类样本在训练数据集中出现的频率来进行估计。贝叶斯分类算法的关键在于对$P({\bf x}|c)$的估计。诚然,我们可以仿照对$P(c)$的估计,使用在给定标签为$c$的样本中不同的特征向量出现的概率来作为$P({\bf x}|c)$的估计。但是特征向量$\bf x$可能取值的数目相对于特征向量的维度呈指数级的递增,因此照这种方式来估计会面临组合爆炸、样本稀疏的问题,因此通常并不采用这种直接估计的方法。
朴素贝叶斯分类器引入了属性条件独立性假设(attribute conditional independence assumption),即认为每个属性独立地对分类结果产生影响。在此情况下有$P({\bf x}|c) = \prod_{i=1}^d P(x_i|c)$,其中$d$表示特征向量的维数。我们只需要对于每一个特征独立进行估计即可。
半朴素贝叶斯分类器引入了独依赖假设(one-dependent assumption),即认为每个特征对于分类结果的影响在该特征的取值之外最多仅依赖于一个其他特征。再次情况下有$P({\bf x}|c) = \prod_{i=1}^d P(x_i|c, x_{d(i)})$,其中$d(i)$是是第$i$个特征所依赖的特征的编号。在除了对于每一个$P(x_i|c, x_{d(i)})$进行估计之外,半朴素贝叶斯分类器还需要对于每个特征找到它最可能依赖的另一个特征。
贝叶斯网认为各个特征之间可以存在任意的依赖关系,各个特征之间可以构成一个依赖网络(即贝叶斯网),有了这样的依赖网络,当给定一个样本的特征向量时,就可以推断估计出所需要的$P({\bf x}|c)$。在贝叶斯网的构建中,通常有定义一个评分函数用来衡量贝叶斯网与训练数据集的契合程度,算法的目标就是找到一个贝叶斯网使得它与训练数据集最为契合,同时也希望找到的这个贝叶斯网不要太过于复杂。其中涉及到两个方面,即学习贝叶斯网的参数和学习贝叶斯网的结构:参数的学习较为简单,通过频次的统计即可得到;但是找到最优的贝叶斯网结构被证明是十分困难的,有许多不同的方法来近似地求解这样的结构。通过贝叶斯网络来精确推断$P({\bf x}|c)$同样被证明是非常难的,我们通常通过吉布斯采样的技术来对其进行推断。
- 从概率的视角出发来解决问题,对于问题解的估计比较准确,同时也降低了过拟合风险。
- 朴素贝叶斯模型和半朴素贝叶斯模型虽然引入了一些假设条件,不过在很多实际的情形下虽然不满足这样的假设,模型仍然可以取得较好的结果。其中可能的原因是不同特征间的依赖关系产生的影响可能被抵消。
- 贝叶斯网具有强大的表示能力和良好的可解释性。
- 贝叶斯方法的计算复杂度比较高,尤其是贝叶斯网络,计算量很大,并且找到一个最优的解被证明是十分困难的。
聚类是一类无监督学习方法,它主要目的是把数据中的样本划分为若干个通常是不相交的子集,每个子集称之为簇(cluster)。根据聚类的方式不同,聚类算法主要可以分为基于原型的聚类(prototype-based clustering)、基于密度的聚类(density-based clustering)和层次聚类(hierarchical clustering)。其中比较常见的算法有k均值算法(K-means)、学习向量量化(Learning Vector Quantization)和高斯混合聚类(mixture of Gaussian)等,它们属于上述第一类方法。
- 在没有标签的情况下,仍然可以对数据进行一定的学习,找出数据中的潜在规律。
- 它的最终目的是把样本划分为不同的类别,划分出来类别的具体含义不能事先确定。因此它不能够直接用于做预测或者交易信号,它在金融领域主要作用主要是用于一些任务的预处理,比如根据不同股票价格的运动形态将股票聚类,形成的聚类形式可能是股票所属的不同行业。
- 聚类得到的不同簇的具体含义不能事先给定,只能通过聚类之后人为观察给定其含义。
- Hayden, Lorien X., et al. "Canonical Sectors and Evolution of Firms in the US Stock Markets." arXiv preprint arXiv:1503.06205 (2015).