美国华盛顿大学西雅图校区 李 超
股票市场是国度经济的主要表现,股价的走势是股票投资者存眷的核心问题。由于股票价格固有的噪声环境和相对市场趋势的较大波动性,股价的拟合和预测是一个具有挑战性的问题。本文使用了随机森林、GBDT算法、神经网络、SVM等模型对股票价格时间序列进行了拟合。通过对上证A股贵州茅台(600519)数据的预处理、拟合、验证、调参全流程的分析,获得并展示了最终模型的效果。实验结果表明,使用梯度提升随机树(GBDT),股价拟合结果的预测误差最小。相对于随机森林和神经网络模型,GBDT算法在本文的股价预测任务中表现得更加稳定可靠。
近几年经济的飞速发展,追求上市的公司愈发增多,股票逐渐走进越来越多人的视线。股票这个纽带在股民、股东和交易所之间也愈发紧密。因为股票市场的波动十分巨大,随时可能因为一些新的政策或者其他原因,进行大幅度的波动,导致自然人股民很难对股票进行投资盈利;并且,股票价格具有高噪声、非线性,易受政策影响等特点,因此投资者很难就近规避风险。通过众多的网络数据接口,研究者可以进行数据分析,再利用机器的深度学习来对股票价格进行预测。
在目前市场环境下,散户投资过程中最大的问题是信息不对称,要获取真实信息则需要付出成本,使得散户往往依赖于无成本的“小道消息”而非科学的技术分析。形态分析认为一切能够影响股价的因素——经济的、政策的、心理的等最终都反映到K线图上。股票价格预测正是基于K线图帮助散户在缺乏透明度的市场中低成本地、科学地获取有效信息。股票价格预测每天对每只股票的未来趋势(超短线、中短期)做出预测,预测的内容包括股票未来的上涨概率、上涨幅度、下跌概率、下跌幅度、中短期走势,行业的上涨和下跌趋势,用户可以通过每日提供的大量预测数据发现存在上涨可能的股票和行业。当然,股票预测的结果的准确性取决于对模型的选择,本文便是对几种常见的方法进行一个对比,来供读者参考。
传统机器学习是基于样本出发,尝试发掘那些不能利用原理解释分析的规律,以此实现对未来数据趋势的准确预测。相关的算法有:逻辑回归、支持向量机方法、决策树方法等。传统的机器学习方法为机器学习结果的有效性与学习模型的可解释性找到了一个平衡点,为解决有限样本的学习问题提供了一种框架,主要用于有限样本情况下的模式分类、回归分析、概率密度估计等。传统机器学习方法共同的重要理论基础之一是统计学,在自然语言处理、语音识别、图像识别、信息检索和生物信息等许多计算机领域获得了广泛应用。
深度学习又称为深度神经网络。深度学习源于多层神经网络,其实质是给出了一种将特征表示和学习合二为一的方式。深度学习的特点是放弃了可解释性,单纯追求学习的有效性。经过多年的摸索尝试和研究,已经产生了诸多深度神经网络的模型,其中卷积神经网络、循环神经网络是两类典型的模型。深度学习框架是进行深度学习的基础底层框架,一般包含主流的神经网络算法模型,提供稳定的深度学习API,支持训练模型在服务器和GPU、TPU 间的分布式学习,部分框架还具备在包括移动设备、云平台在内的多种平台上运行的移植能力,从而为深度学习算法带来前所未有的运行速度和实用性。
目前,针对股票价格预测常用的机器学习方法有以下几种:随机森林模型(Random Forest)、长短期记忆模型(Long-short term memory)、RNN模型、GBDT模型等。虽然有诸多的模型算法,但是实际上一只股票不仅仅是呈现在价格方面,还有很多的外围信息,例如:换手率、收益率、市盈率、市净率等。这些信息会在选股策略中经常使用到,因为它们本身就会对股价的走势产生一定的影响,是不可被忽视的。本文主要是先对数据进行简单分析和预处理,然后通过机器学习模型(尤其是预测相关的模型)构建和参数的调整,最终将数据可视化,并且将本文使用到的模型进行比较,最终进行评价。本文从数据库中随即提取某个品牌的股价走势数据进行分析。在引用到具体算法之前,我们先开始一个简单的数据分析,例如移动平均值。通过不断引入新的平均价格来降低价格表中的“噪音”,同时表示该平均价格的平均线可能充当“阻力”,代表着股市的涨和跌,进而从中预期未来趋势。对于单只股票,我们可以先进行一些简单分析,例如移动平均值滚动平均/移动平均(MA)通过不断更新平均价格来平滑价格数据,有助于降低价格表中的“噪音”。此外,该移动平均线可能充当“阻力”,代表股票的下跌和上升趋势,你可以从中预期它的未来趋势,不太可能偏离阻力点。首先通过Matplotlib来对茅台这只股票进行简单分析。计算收盘价100天以内的移动平均值,并取每个滑窗的移动平均值。如图1所示。
图1 茅台股份(600519)在2020年5月20日-2021年2月22日期间的价格走势图
图2 茅台股份(600519)在2020年5月20日-2021年2月22日期间的收益率走势图
图3(a) 茅台股份(600519)与五粮液(000858)股价关系走势图
此外,除了参考平均值,收益率也是考虑一只股票的重要影响因素,如图2所示。
从逻辑上讲,我们理想的股票收益应该是尽可能的高且稳定,但是通过上图反映的情况来说,如果作为一个风险规避者,那就应该避开这类股票。因为在这只股票的收益率在某一时间段下跌了将近10个百分点。同时,我们也可以调用多只类似股票来研究酒水行业的股价之间的关系。如图3(a)所示。
我们可以看到,五粮液和茅台的收益之间存在着微弱正相关关系。似乎在大多情况下,五粮液的回报率越高,茅台的回报率也就越高。然后我们可以通过绘制散点矩阵进一步改进我们的分析,以可视化竞争股票之间可能的相关性。在对角点,我们将运行核密度估计(Kernel Density Estimate,KDE)。KDE是一个基本的数据平滑问题,它基于有限的数据样本对总体进行推断,它有助于生成对总体分布的估计。如图3(b)所示。
从这里可以看出五粮液和茅台之间的分布成正相关。为了更进一步证明正相关系,我们可以使用热图来可视化竞争股票直接的相关程度。颜色越深代表两只股票的相关性越强。如图4所示。
通过以上简单的一系列分析,我们对这只股票以及和其行业内的股票有了大致的了解。 接下来开始通过不同的学习模型来对这支股票进行预测。
通过改变各神经元间的权值使得样本点的实际输出值和期望输出值间误差渐渐减少。神经网络是一种非线性学习算法,它的性能优于几乎其他的机器学习算法。但是其本身还是逃不过那个广为人知的缺点:黑箱性质,这就意味着实验者并不知道神经网络是如何以及为何会得到一定的输出。具体建模步骤:首先引入激活函数,优化函数。其中,因为神经网络的线性模型表达能力不够,所以激活函数的引用是为了避免神经网络的权重、偏置全是线性的仿射变换(affine transformation)。首先我们设立一个单隐层神经网络,同时通过格子点搜索对隐含层神经元的个数进行选择。但经过训练后得到的MAPE值并不太稳定,总体趋势变化较大,如图5。所以神经网络模型并不太适合股价预测。对于未知数据,我们得到了较大的误差,这意味着该模型未能预测收盘价。值得注意的是,网络本身并不能预测股价。相反,它尝试使用给定的值猜测一个序列的下一个值是什么,这是因为价格没有编码下一次它会如何变化。如果价格上涨一段时间,就不能保证下一分钟不会下跌。价格受外部事件的影响很大,这是网络所不知的。或许,我们将能够使用神经网络进行短期预测,来确定未来几分钟内的价格变化,这可能是因为我们预测的时间段越短,外部事件发生的变化就越小。然而,在这种情况下,最好使用线性回归模型来预测价格变化的方向。如果我们仔细观察股价曲线,我们会发现它的变化是随机的。如果我们只有价格而不知道外部事件,这就是事实。因此,股价看起来就像一个鞅,这是一个我们无法预测的过程。
图3(b) 茅台股份(600519)与五粮液(000858)股价关系走势图
图4 茅台股份(600519)与五粮液(000858)股价关系热图走势图
首先便是通过随机森林对股价做一个预测。随机森林是一种集成算法(Ensemble Learning),它是属于Bagging类型。由于采用了集成算法,机器训练后得到的结果会比那些只通过单个算法得到的结果更加准确,它可以用来解决分类和回归问题。其抗过拟合能力强,因为通过平均决策树,降低了过拟合的风险,但是一旦在回归问题的训练数据中存在噪音,那么随即森林的数据集会出现过拟合的现象;并且,随机森林的时间成本相较于其他算法所需求的时间成本而言会更高。RF的随机性的特点对降低模型的方差可以起到很好作用,故随机森林一般不需要额外做剪枝,即可以取得较好的泛化和抗过拟合能力(Low Variance)。在这一个部分,我们要进行RF调参,其中包括两个部分,第一部分是bagging框架的参数调整,第二部分则是CART决策树的参数调整。首先还是建模,拟合数据和预测得到mse_test结果为0.14372028073490678。然后进行针对RF框架参数调参:(1)通常建议取一个适中的值以避免欠拟合或过拟合;(2)obb_score:采用袋外样本来评估模型的好坏。(3)criterion,即CART树做划分时对特征的评价标准,默认是基尼系数gini。然后CART默认回归树是均方差mse。然后,决策树参数方面我们要考虑:(1)特征选择criterion,使用默认的gini系数。(2)最大特征max_features。(3)max_depth,如果样本多,特征也多的情况下,最好限制最大深度。(4)min_samples_split,在样本量大的情况下,增大这个值;反之,则不需要管这个值。(5)最后还要考虑叶子节点最小样本权重、最大叶子节点数、类别权重和min_impurity_split。
具体实验步骤:我们首先对n_estimators进行网格搜素(通过sklearn.grid_search),得到最佳的弱学习器迭代次数为10,接着最决策树最大深度max_depth和内部节点再划分所需要的最小样本数min_sample_split进行网格搜素(max_depth:5;min_sample_split:50)。因为这个决策树和其他参数还存在关联,所以我们对内部节点再划分所需的最小样本数和叶子节点最小样本数进行调参(min_sample_leaf:10,min_sample_split:80)。最后,再对max_features进行调参(max_features:2)。 通过搜索到的最佳参数,我们进行最终的模拟拟合。可视化图如图6所示。
图7是最终结果图,可以看出随机森林得到的结果:预测值和测试值相差不大,还算稳定,所以通过随机森林来预测股价还是可行的。至于随机森林的缺点,当随机森林中的决策树个数很多时,训练时需要的空间和时间会比较大。随机森林中还有许多不好解释的地方,有点算是黑盒模型,在某些噪音比较大的样本集上,RF的模型容易陷入过拟合。当进行回归时,随机森林不能够做出超越训练集数据范围的预测,这可能导致在某些特定噪声的数据进行建模时出现过度拟合。对于小数据或者低维数据(特征较少的数据),可能不能产生很好的分类。处理高维数据、处理特征遗失数据、处理失衡数据是随机森林的长处。执行数据虽然比boosting等快(随机森林属于bagging),但比单只决策树慢多了。
图5 茅台股份(600519)在2020年5月20日-2021年2月22日间通过神经网络拟合误差图
图6 茅台股份(600519)在2020年5月20日-2021年2月22日期间通过RF拟合误差图
使用的决策树是CART回归树,对于回归树来说最重要的点就是寻找最佳的划分点,判别标准是基尼指数(0和1,越接近0,越表明接近最佳划分点)。但在这儿,使用平方误差(误差平方和)可以更好地评判拟合程度。其具体过程:通过步长和迭代次数入手,寻找最好的迭代次数(重复计算工作表直到满足特定数值条件为止)发现是5,开始调参,对max_depth和min_samples_split进行网格搜索,找到最大深度是9,所需最小样本数80。但深度5是一个比较合理的值,于是再把min_sample_split和min_sample_leaf进行调参。然后,最终拟合模型。需要注意的是,其中我们还要考虑损失函数,因为分类函数和回归函数的损失模型是不一样的。对于分类函数而言,有对数似然损失函数“deviance”和指数损失函数“exponential”两者输入选择,默认是对数似然损失函数“deviance”。一般来说,推荐使用默认的“deviance”,它对二元分离和多元分类各自有比较好的优化。具体过程:首先引入GradientBoostingRegressor和GridSearchCV,得到mse_test值为0.022381161587606203. 然后通过调参来提高模型的泛化能力,首先从步长(learning rate)和迭代次数(n_estimators)入手。我们先将步长初始值设置为0.1,然后对迭代次数进行网格搜索。找到一个最优的迭代次数后,对决策树进行调参。首先对最大深度max_depth和内部节点再划分所需最小样本min_samples_split进行网格搜索得到最好的最大深度和所需最小样本。由于决策树深度5是一个比较合理的值,我们先暂定5。下面再对内部节点所需最小样本和叶子节点最小样本一起调参;并对最大特征数进行网格搜索。用搜索到的最佳参数得到以下最终的模型拟合。
图7 茅台股份(600519)通过RF拟合最终误差图
图8 茅台股份(600519)通过GBDT拟合误差图
如图8所示,可以看出GBDT在股价预测中的应用也很稳定可靠。与其他基于树的模型类似,这一算法不需要对数据进行缩放就可以表现得很好,而且也适用于二元特征与连续特征同时存在的数据集。梯度提升树模型的主要参数包括:树的数量n_estimators、学习率 learning_rate,用于控制每棵树对前一棵树的错误的纠正强度。这两个参数高度相关,因为 learning_rate越低,就需要更多的树来构建具有相似复杂度的模型。随机森林的n_estimators值总是越大越好,但梯度提升不同,增大n_estimators会导致模型更加复杂,进而可能导致过拟合。通常的做法是根据时间和内存的预算选择合适的n_estimators,然后对不同的learning_rate进行遍历。另一个重要参数是max_depth(或max_leaf_nodes),用于降低每棵树的复杂度。梯度提升模型的max_depth通常都设置得很小,一般不超过5。当然它也有两个主要缺点:需要仔细调参、训练时间可能会比较长。与其他基于树的模型相同,它也通常不适用于高维稀疏数据。
这里要对以上的那几个模型进行比较,做出数据图形,做到数据可视化。
股价预测问题一直是金融领域的核心问题。随着机器学习的技术的进一步提升,研究人员开始尝试将机器学习模型运用到现实生活中。借鉴之前的研究,我们将数据预处理、拟合、验证、调参运用到上文提到的几个算法中。通过实验分析表明,GBDT相较于随机森林和神经网络模型,在本文的股价预测任务中表现得更加稳定可靠。