沪指一般指上海证券综合指数简称“上证指数”或“上证综指”,其样本股是在上海证券交易所全部上市股票,包括A股和B股,反映了上海证券交易所上市股票价格的变动情况,自1991年7月15日起正式发布。
今天,我们就要根据其历史数据做出预测模型:
原理:
根据AR,MA,ARMA,ARIMA时间序列算法,观察结果与时间的关系,找出目标变量Y与时间的相性规律。
四种算法:
1、AR 全称Auto Regresive 自回归模型:
过去若干时刻的点通过线性组合,再加上白噪声(随机误差)可以预测未来某个时刻的结果,模型为AR(p);
2、MA Moving Average 滑动平均模型:
通过历史白噪声进行线性组合,来影响当前时刻的数据,模型为AM(q);
3、ARMA 自回归滑动平均模型:
两者混合使用更加准确,ARMA(p,q)
4、ARIMA差分自回归滑动平均模型:
比ARMA多一个差分过程,将不平稳数据进行差分平稳,模型为ARIMA(p,d,q)
模型介绍:
from statsmodels.tsa.arima_model import ARMA
ARMA(endog,order,exog=None)
ARMA.predict(start,end)#预测起始时间和终止时间
endog:模型内变量data,输入值x
order:模型参数(p,q)
模型步骤:
1、导入数据,改成DataFrame格式,将时间设置为index索引
2、将时间与数据定为指定的日、月、季或年平均数值
3、建立模型,预测
4、画出走势图
改进方式:
1、ARMA中的p,q值选择,引入AIC准则(赤池消息准则),统计模型拟合好坏的标准,数值越小表示拟合越好;
2、尝试按不同时间点预测,可是按日、月、季或年,多种预测方式。
具体代码与详解:
#导入包
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
from statsmodels.tsa.arima_model import ARMA
import warnings
from itertools import product
warnings.filterwarnings("ignore")
#导入数据
data=pd.read_csv("E:/数据学习网站/bitcoin-master/shanghai_1990-12-19_to_2019-2-28.csv")
# print(data)
#将时间转化为标准格式,将时间设置为index索引
data.Timestamp=pd.to_datetime(data.Timestamp)
data.index=data.Timestamp
#按月,季,年来统计
df_month=data.resample("M").mean()
df_q=data.resample("Q-DEC").mean()
df_y=data.resample('A-DEC').mean()
#设置pq值的取值范围
sp=range(0,3)
sq=range(0,3)
parameters=product(sp,sq)#二元循环
parameters_list=list(parameters)#将其转化为列表格式
resulrs=[]
best_aic=float("inf")#取值无穷大
#按月份建立预测模型
for param in parameters_list:
try:
model=ARMA(df_month.Price,order=(param[0],param[1])).fit()
except ValueError:
print("参数错误",param)
continue
aic=model.aic
if aic<best_aic:
best_aic=aic
best_model=model
best_parame=param
resulrs.append([param,model.aic])
resulrs_table=pd.DataFrame(resulrs)
resulrs_table.columns=(['parames',"aic"])
# print("最优模型:",best_model.summary())
#输出预测值
df_month2=df_month[["Price"]]
datelist=[datetime(2018,3,31),datetime(2019,4,30),datetime(2019,5,31),datetime(2019,6,30),datetime(2019,7,31),datetime(2019,8,31)]
future=pd.DataFrame(index=datelist,columns=df_month2.columns)
df_month2=pd.concat([df_month2,future])
df_month2["预测值"]=model.predict(datetime(1990,12,31),datetime(2019,12,31))
print(df_month2)#添加预测值一列
# 开始画图,按月预测
plt.figure(figsize=(20,12))
plt.rcParams['font.sans-serif']=['SimHei']
plt.plot(df_month.Price,label="实际走向")
plt.plot(model.predict(datetime(1990,12,31),datetime(2019,12,31)),ls="--",label="预测值")
plt.legend()
plt.title("沪指预测图")
plt.xlabel("时间")
plt.ylabel("指数")
plt.show()
#按季度建立预测模型
# for param in parameters_list:
# try:
# model=ARMA(df_q.Price,order=(param[0],param[1])).fit()
# except ValueError:
# print("参数错误",param)
# continue
# aic=model.aic
# if aic<best_aic:
# best_aic=aic
# best_model=model
# best_parame=param
# resulrs.append([param,model.aic])
#
# resulrs_table=pd.DataFrame(resulrs)
# resulrs_table.columns=(['parames',"aic"])
# # print("最优模型:",best_model.summary())
#
# df_q2=df_q[["Price"]]
# # print(df_q2)
#
# datelist=[datetime(2019,3,31),datetime(2019,6,30),datetime(2019,9,30),datetime(2019,12,31),datetime(2020,3,31),datetime(2020,6,30)]
# future=pd.DataFrame(index=datelist,columns=df_q2.columns)
# df_q2=pd.concat([df_q,future])
# # print(df_q2)
#
# df_q2["预测值"]=model.predict(datetime(1990,12,31),datetime(2020,6,30))
# print(df_q2)
#
# # 开始画图,按月计算
# plt.figure(figsize=(20,12))
# plt.rcParams['font.sans-serif']=['SimHei']
# plt.plot(df_q.Price,label="实际走向")
# plt.plot(model.predict(datetime(1990,12,31),datetime(2020,6,30)),ls="--",label="预测值")
# plt.legend()
# plt.title("沪指按季度预测图")
# plt.xlabel("时间")
# plt.ylabel("指数")
# plt.show()
结果展示:
最优模型: ARMA Model Results
==============================================================================
Dep. Variable: Price No. Observations: 339
Model: ARMA(2, 2) Log Likelihood -2208.110
Method: css-mle S.D. of innovations 162.159
Date: Sun, 14 Jul 2019 AIC 4428.219
Time: 10:55:22 BIC 4451.175
Sample: 12-31-1990 HQIC 4437.367
- 02-28-2019
===============================================================================
coef std err z P>|z| [0.025 0.975]
-------------------------------------------------------------------------------
const 1840.3415 489.717 3.758 0.000 880.514 2800.169
ar.L1.Price 0.5137 0.130 3.959 0.000 0.259 0.768
ar.L2.Price 0.4501 0.128 3.508 0.001 0.199 0.702
ma.L1.Price 0.8480 0.121 6.985 0.000 0.610 1.086
ma.L2.Price 0.3796 0.062 6.095 0.000 0.258 0.502
Roots
=============================================================================
Real Imaginary Modulus Frequency
-----------------------------------------------------------------------------
AR.1 1.0254 +0.0000j 1.0254 0.0000
AR.2 -2.1667 +0.0000j 2.1667 0.5000
MA.1 -1.1171 -1.1776j 1.6231 -0.3708
MA.2 -1.1171 +1.1776j 1.6231 0.3708
-----------------------------------------------------------------------------
Price 预测值
2019-01-31 2555.663395 2562.690035
2019-02-28 2759.671400 2512.273755
2018-03-31 NaN 3245.481297
2019-04-30 NaN 2862.520492
2019-05-31 NaN 2816.232885
2019-06-30 NaN 2801.803030
2019-07-31 NaN 2773.554697
2019-08-31 NaN 2752.547171
图片展示:
时间序列练习可用数据全套:
链接:https://pan.baidu.com/s/1HAB8WCYtgwVbkxStWrRm5g
提取码:43v8
欢迎提问与指正~~