1. 引言
现在常用的时间序列分析法主要是建立自回归模型(AR)、移动平均模型(MA)、自回归滑动平均模型(ARMA)和自回归移动平均模型(ARIMA),其中ARIMA模型是较成熟的模型,常被用来对股价(最高价、最低价、开盘价、收盘价)及综合指数进行预测 [1] [2] 。文献 [3] [4] 给出了时间序列一些常用方法。文献 [5] [6] 采用SVM对金融数据进行预测,文献 [7] 使用神经网络预测,这些预测方法都是基于单一股票信息的。投资人基于社会形势(如利息率、公司盈利、贸易收支、相关政策、流行趋势等),利用一些理论或计算方法对股价进行评估,因此股票价格预测是一个多信息综合的结果。不同股票在同一段时间内受到的社会因素的影响是一致的,但这些社会因素很难被人总结出来,因此很难对股价变化做出适当的分析。实验证明存在这样一种现象:单独的看股票A,它的价格在任意浮动,股票B也同样如此,但实验发现有7%的股票的价格变化能准确预测一周后另外7%的股票的价格变化,即存在一种可能,用前一周股票A的股价走势能很好的预测下周股票B的走势。这种现象很难被人所总结出来,且其规律不一定固定的公式。但是可以利用机器学习的方法实时的学习这种规律,即可以从众多股票中学习到这种社会因素对股票价格的影响,以达到预测的目的。本文研究的方法试图找出这样的7%股票A,用其一段时间的历史数据变化情况来预测另外7%的股票B。
2. 股票数据研究
股票价格受社会因素和投资者行为影响。社会因素属于随机变量,随着时间段变化,而投资者行为具有稳定的偏好,在一定程度上是可预见的。因此一段时间内的股票价格走势具有相似性的特点,这种相似性对属于同一行业分类、概念分类的股票尤为明显。这并不意味着不同行业的股票之间没有相关性,事实上不同行业间的股票价格变化有时也具有相关性,这种相关性的产生很难用常识或经济知识来解释。
2.1. 相似股票度量方法
股票价格走势是随时间序列变化的,两个序列是否相似,主要看它们的变化趋势是否一致。目前时间序列相似度度量,最常用的是基于样本间“距离”(Distance)的计算,其中大多是欧式距离(ED)及其变体形式。他们都具有“闵可夫斯基距离”(Minkowski Distance)的定义形式。
股票价格时间序列的欧式距离计算,是以股票价格
和
的差值作为基础,对于股票价格数据而言,即使是经过归一化处理的数据,走势相似的股票之间的距离也可能很大。如图1所示,可以看出X和Y的走势是完全相同的,但使用欧式距离计算出来的结果会很大。
对股票趋势进行预测的研究,综上所述显然用样本间“距离”的计算方式是不合适的。本文基于皮尔森积矩相关系数(Pearson product-moment correlation coefficient)计算股票之间的相似度 [8] [9] 。以下以股票价格为例,给出计算的具体描述。首先计算股票价格的变化率作为基础计算数据,设某只股票的价格
序列
,序列W的变化率计算表达式
,其中
,最终的变化率序列
。
设任意股票X价格变化率时间序列
和股票Y价格变化率时间序列
,序列X的标准差
其中
为时间序列X的均值,同理可计算出Y的标准差
。
表示时间序列X与Y的协方差,则股票之间相似度的计算公式如下:

时间序列X和Y的距离
,其中
,
表示正相关,
表示负相关。
取股票代码为600520的2014-03-27到2016-11-07的价格数据,利用以上方法计算出与其相关度
的股票一共13个,绘制出它们的价格变化如图2所示,
上图中横坐标表示时间,纵坐标表示股票价格,从图可以看出不同种类的股票即使价格相差很大,股票的波动情况却极为相似。实验证明使用基于统计的相关系数作为股票时间序列相似度度量是有效的。同时透过上图价格走势相似的多支股票,本文认为各种社会因素对它们的影响具有一致性。
2.2. 基于时间序列滑动窗口获取数据
具有历史相似性的股票,在同一时间段的波动并不严格的相同,甚至在变化上有时会产生一种错位的现象,一些股票的价格变化会优先于另外一些股票。以下以股票闭市价格为例介绍如何用时间序列滑动得到错位现象的描述数据。
取任意股票(假设为k)时间段长为ε的价格数据,滑动时间片长度θ,其中ε和θ的取值根据前期计算出的均值确认,一般取4~10天(使用2016年9月的2100支股票的历史价格信息,可计算出这种错位现象的时间均值为4.21天,方差为2.6,取不同时间段值,结果可能不同)。然后与其具有历史相似度的股票(假设为i)做滑动的相似度计算,相似度计算同样使用上文的皮尔森积矩相关系数。如图3所示,股票k和股票i具有相同的时间起始点,长度为ε的股票k的时间序列,在股票i的时间序列上向前滑动长度为θ。

Figure 2. Historical price similar to stock price volatility
图2. 历史价格相似股票价格波动图

Figure 3. Slide calculation example diagram
图3. 滑动计算示例图
首先计算出股票k具有历史相似度(通过相似度阈值
确认)的股票集合
。对于任意股票
,可以计算出时间片长度为
的滑动相似度集合
,其中n表示滑动长度。若
,其中
为相似度阈值(一般取0.5~0.7之间),则表示集合
对应的股票i的数据可以用于股票k的预测分析。得到最终的描述数据集合:

通过上面的数据计算可以得到如表1的数据字段。
同理,使用同样的方法可以得到价格日K线、3日K线、周K线等的描述数据。
在股票交易中由成交量形成的“成交量柱”,简称“量柱”,能反应股民的交易动向和意图,因为交易量是真实货币堆砌起来的。因此股票“量柱”的变化和价格有非常强的关系。股票“量柱”的描述数据,可用上文中的数据集合
(即滑动天数取
中的n天)结合交易量数据计算得到。数据描述见表2。
利用以上数据获取方法,按以下步骤做简单的预测实验:
1) 假设预测日期Date为2016-09-27,取Date之前的数据用于数据计算,Date之后的数据用于结果验证。
2) 取窗口长度
= 10,滑动最大长度
= 10,历史天数300天,历史相似度阈值
= 0.6,滑动窗口相似度阈值
= 0.65。
3) 选取随机500支待预测的股票,利用滑动窗口计算出表1,表2的描述数据。
4) 获取待预测股票日期Date后的真实价格变化数据。
5) 利用描述数据集合
中的滑动天数数据,获取预测数据。
6) 比较真实数据与描述数据的走势情况,可以得到预测的准确率。

Table 1. Price sliding window data description table
表1. 价格滑动窗口数据描述表

Table 2. Transaction volume sliding window data description table
表2. 交易量滑动窗口数据描述表
下面分别选取描述数据中的历史相似度Mki和“柱量”的相似度Vk,分析其与预测准确率的变化情况。
图4中横坐标表是历史相似度,纵坐标表示走势预测的准确率,从图4中可以看到历史价格相似度与预测的准确率有一定的正相关性。历史价格相似度越大,预测的准确率也就越大。
图5中横坐标表是“柱量”相似度,纵坐标表示走势预测的准确率。从图5中可以看出,“柱量”相似度越大,一定范围内的预测的准确率也有变大的趋势。

Figure 4. Historical price similarity and forecast accuracy
图4. 历史价格相似度与预测准确率

Figure 5. The similarity of columns and the prediction accuracy
图5. “柱量”相似度与预测准确率
实验利用本文提出的滑动窗口计算方法得到的预测数据的准确性与“柱量”相似度、历史相似度等有一定的相关性,为进一步验证这一结论的有效性,下面用CART模型来试图学习出这种相关性。
3. 基于CART的预测模型
通过上文的预测实验可知描述数据与预测的准确率之间是存在一定相关性的,为验证这种相关性,本文使用决策树(Decision Trees)算法中的CART (Classification and Regression Trees)算法,使用上文的描述数据拟合出一个预测模型。CART与C4.5非常相似,区别在于CART支持数值变量且不产生显式的决策规则集合 [10] 。
模型选用决策树是因为其易于理解和解释,只需少量的数据准备工作,其它许多机器学习模型需要数据归一化、虚拟变量创建以及移除空白值(blank values)等预处理操作,金融股票数据中各数据的单位、大小、空值等非常多样,若是数据的处理工作对结果的影响比较大。决策树能够同时处理数值数据(numerical data)和类别数据(categorical data),金融数据中类别数据如股票的行业分类、概念分类等许多都是非数值型的数据。但是最优决策树的问题已经被证明是一个NP-完全问题,即使是某些比较简单的情形下获得最优解也非常困难,实际应用的决策树学习算法一般都是基于启发式优化方法,本文将不涉及对决策树的最优化处理,仅使用决策模型说明预测问题。
模型的训练数据使用上文经过滑动窗口计算出的历史描述数据和股票的基本描述数据,其中股票基本描述数据如表3,股票基本数据可以从各金融网上获取。
使用上一节中滑动窗口计算出历史的描述数据(历史数据时间与待预测的时间不能相隔过长,范围在1~10天,因为预测的天数不超过10天),经过整理后的训练数据中的部分输入数据(Input data)如图6所

Table 3. Stock basic data description table
表3. 股票基本数据描述表

Figure 6. Part of the input data of the model training
图6. 模型训练的部分输入数据
示,图中包含的描述数据字段有:{滑动天数,相似度,预测数据方差,交易量相似度,历史相似度,最大相似天数,最大滑动相似天数,原始数据方差,均值,市盈率,毛利率}。
模型训练数据的目标数据(Target data),使用预测数据和真实数据比较得到。首先获取预测数据和真实数据的股票价格走势的形状,设有股票价格时间序列
,计算得到序列的变化率序
列
,设置变化率阈值
,使用下面的公式可以
将变化率序列
变为包含−1,0和1的序列,用来表示股票价格时间序列X的走势。

下图7的示例图,横坐标为时间,纵坐标为股票价格,折线图为股票走势图。计算下图时间序列可以得到走势序列
。通过比较两个走势序列,可以得知两个股票价格时间序列是否相等。
使用以上的训练数据建立的决策树模型,设置决策树最大深度为5,节点分裂使用信息增益熵(entropy),模型拟合后使用Graphviz下的dot工具绘制出生成的决策树结果如图8所示。
从上图中可以看出决策树模型只对已出现数据的决策,不能用来预测超出预测数据范围以外的值,且建树的大小和数据本身数量相关性比较大,很容易过拟合或欠拟合。本文使用决策树来判断上文滑动窗口计算出的预测值的准确性,其中数据经过处理后都有一定的范围,即用决策树来验证本文预测方法正确性可以满足需求。
4. 算法描述
本文提出的基于时间序列滑动窗口金融数据分析算法,分为三个部分:1、利用时间序列滑动窗口从历史数据获取模型训练数据;2、训练数据输入决策树CART训练出预测模型;3、再次使用滑动时间序列窗口获取最新的模型输入数据,用已经训练好的模型判断数据预测的正确性。为了得到有效的模型,数据集的范围取股票市场的有效股票。时间序列滑动窗口预测算法具体描述如图9所示。
输入:股票数据时间序列集合
。
输出:股票时间序列
预测值。

Figure 8. Decision tree model graphical result display
图8. 决策树模型图形化结果显示

Figure 9. Sliding window prediction algorithm flow chart
图9. 时间序列滑动窗口预测算法流程图
步骤1:将时间序列集合
中的序列转化成变化率序列
。
步骤2:取集合
中序列的历史数据,设
,历史相隔天数
,则股票历史数据序列
。
步骤3:使用历史数据序列做滑动窗口计算,得到描述数据集合
(上文1.2中),获取股票的基本描述数据(市盈率、流通股本等),组成模型训练数据中的输入数据。取
与描述数据中的预测数据比较,得到模型训练的结果数据。
步骤4:将得到的训练数据输入决策树CART模型,得到训练好的决策模型。
步骤5:使用整个
序列进行滑动窗口计算,同样可以得到一个描述数据集合
,获取股票的基本描述数据,我们可以得到模型测试数据。
步骤6:将通过测试数据输入训练好的模型可以得到测试数据是否用于适合预测,我们将适合预测
的数据的变化率序列转化为预测值序列
,可用
检验预测的准
确性。
5. 实验分析
5.1. 实验说明
为了确保算法的真实有效,实验数据来源于真实交易数据(主要来源于凤凰财经http://finance.ifeng.com/),以天为单位获取股票的历史前复权数据,包括开市价格、闭市价格、成交量。同时获取股票基本信息包括:所属行业、地区、市盈率、流通股本(亿)、总股本(亿)、总资产(万)、流动资产、固定资产、公积金、每股公积金、每股收益、每股净资、市净率、上市日期、未分利润、每股未分配、收入同比(%)、利润同比(%)、毛利率(%)、净利润率(%)、股东人数。选取2015-01-04到2016-10-27一年多的股票前复权数据。
算法的具体参数设置如表4所示。
5.2. 实验结果
实验结果与现在常用的时间序列分析模型ARMA(Auto regressive Moving Average Model)(方法参考文献 [11] [12] [13] )对比,模型ARMA(p,q)中p和q的选取使用采用BIC准则精确得到,模型拟合使用静态方式。图10和图11是股票代码为600512的股票在2016-9-30,ARMA模型(其中BIC = −877.684926648,p = 0,q = 1)的历史价格拟合结果和预测结果。
从图11的拟合结果(绿线为真实值,红线为预测值)可以看出使用ARMA模型并不能很好的拟合出原始数据曲线,原因在于ARMA模型要求整个序列的变化确有一定的规律性,即序列本身具有一定的稳定性,序列历史数据对尚未产生的数据有一定的约束性。使用本文提出的方法预测出来的结果如图12所示,结果虽有偏差但预测出来的走势是比较准确的。

Table 4. Experimental parameter setting table
表4. 实验参数设置表
测试使用1500支股票2014-03-27到2016-09-26的数据用本文滑动窗口计算出模型的训练数据,使用训练数据训练出的CART模型准确度仅为0.62(训练数据中的80%作为测试的训练数据,20%作为验证数据)。随机选取500支股票2014-03-27到2016-09-30的数据用滑动窗口计算得到预测的描述数据,计算出能预测的股票为128支(得到的数量与设置的相似度阈值有关),然后使用拟合出来的CART模型判断预测准确的股票64支,计算真实值与预测值得走势形状准确度为67.18%。
6. 结论
经过测试验证了本文提出的滑动窗口计算方法的有效性,与ARMA模型相比预测的准确度更高。但本文选取的CART模型并非最适合的学习模型(还可选用Stochastic Gradient Descent (SGD)、Logistic regression、Neural network等),且用于模型拟合的数据选取偏少或不够专业,导致CART模型的拟合程度不高,这些问题有待更加专业的领域知识的介入分析,提高模型的拟合程度将极大的增加最终预测的准确度。