量化投资学习笔记106——股价预测4:时间序列分析

下面来看预测股价的另一种方法:时间序列分析。
主要参考了一篇硕士论文:史书真.股价时间 序列的分析与预测研究.大连理工大学硕士学位论文(2013).
作者分别用ARMA,bp神经网络,和二者的结合预测股价。我就参考ARMA部分。
时间序列是按时间顺序排列的一系列数据 ,这些数据中的每一个由于受到某些因素的影 响,可能会表现出某种随机性,但它们彼此之间又存在着一定的依赖关系。
研究时间序列平稳性的统计特征:概率分布、均值函数、方差、自协方差函数。
满足一定条件的时间序列称平稳时间序列,否则称非平稳时间序列。
ARMA模型的基本原理:最常用的线性时间序列模型。其原理是,某个时间序列中的单个值一般具有不确定性,但整个序列的发展却有一定的规律性。可以利用序列的历史数据,建立相应数学模型来近似描述该序列,揭示其内部规律,从而进行预测。
具体建模流程:
①对原始序列进行平稳性检验及平稳化。一个平稳序列的自相关函数,要么是截尾的,要么是拖尾的。对于非平稳序列,一般可通过一次或多次差分进行平稳化。
②模型识别。根据序列的自相关函数(ACF)和偏自相关函数(PACF)特点判断模型类别(AR, MA,ARMA)。
③模型定阶。确定模型阶数p和q,常用方法有残差方差图定阶法、F检验定阶法、准则函数定阶法。
④模型参数估计。用矩估计法,最小二乘法,极大似然估计法。
⑤模型检验。包括模型适应性检验(残差序列是否是白噪声序列)和模型参数显著性检验。
下面就对沪深300指数数据进行实操。
首先载入2018年全年的指数收盘价数据,并将其归一化到[1,2]区间中。
画图看看。

可以看出这不是平稳时间序列。再画自相关函数和偏自相关函数看看。

可以看到序列的acf是缓慢衰减的,而且是拖尾的,同样证明该序列是非平稳的。
所谓拖尾,指始终有非零取值,不会在k大于某个常数后就恒等于零(或在0附近随机波动)。而所谓截尾,在大于某个常数k后快速趋于0为k阶截尾。
AR模型:自相关系数拖尾,偏自相关系数截尾;
MA模型:自相关系数截尾,偏自相关函数拖尾;
ARMA模型:自相关函数和偏自相关函数均拖尾。
参考这里
对原始数据进行一次差分然后再画图看看。

1
diff = data.diff(1).dropna()



一次差分后,自相关系数和偏自相关系数都具有拖尾性,初步确定模型为ARMA(p,q)。
接下来要求p和q的值,用AIC法,即尝试不同的p和q,并求AIC值,其值最小的p和q即为最佳参数。
p和q的上限一般取N/10,N为数据规模。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 寻找参数p和q
def findPQ(data):
# N = len(data)
best = float("inf")
bestp, bestq = -1, -1
N = 10
for p in range(1, N):
for q in range(1, N):
try:
arma = ARMA(data, (p, q)).fit(disp = -1)
aic = arma.aic
print(p, q, aic)
if aic < best:
best = aic
bestp = p
bestq = q
except:
print("出现异常")
return p, q

这里N开始设为20,在服务器上跑了两天没结果,改小到10。
9 9 -942.4573203020877
p = 9, q = 9
用该参数建模,接下来就该用模型预测新数据了,但是就在这我被困住了好久,代码老是不对,报错。先放下吧,看看其它预测方法。
本文代码

我发文章的三个地方,欢迎大家在朋友圈等地方分享,欢迎点“在看”。
我的个人博客地址:https://zwdnet.github.io
我的知乎文章地址: https://www.zhihu.com/people/zhao-you-min/posts
我的微信个人订阅号:赵瑜敏的口腔医学学习园地

欢迎打赏!感谢支持!