滬指一般指上海證券綜合指數(shù)簡(jiǎn)稱“上證指數(shù)”或“上證綜指”,其樣本股是在上海證券交易所全部上市股票,包括A股和B股,反映了上海證券交易所上市股票價(jià)格的變動(dòng)情況,自1991年7月15日起正式發(fā)布。
今天,我們就要根據(jù)其歷史數(shù)據(jù)做出預(yù)測(cè)模型:
原理:
根據(jù)AR,MA,ARMA,ARIMA時(shí)間序列算法,觀察結(jié)果與時(shí)間的關(guān)系,找出目標(biāo)變量Y與時(shí)間的相性規(guī)律。
四種算法:
1、AR 全稱Auto Regresive 自回歸模型:
過(guò)去若干時(shí)刻的點(diǎn)通過(guò)線性組合,再加上白噪聲(隨機(jī)誤差)可以預(yù)測(cè)未來(lái)某個(gè)時(shí)刻的結(jié)果,模型為AR(p);
2、MA Moving Average 滑動(dòng)平均模型:
通過(guò)歷史白噪聲進(jìn)行線性組合,來(lái)影響當(dāng)前時(shí)刻的數(shù)據(jù),模型為AM(q);
3、ARMA 自回歸滑動(dòng)平均模型:
兩者混合使用更加準(zhǔn)確,ARMA(p,q)
4、ARIMA差分自回歸滑動(dòng)平均模型:
比ARMA多一個(gè)差分過(guò)程,將不平穩(wěn)數(shù)據(jù)進(jìn)行差分平穩(wěn),模型為ARIMA(p,d,q)
模型介紹:
from statsmodels.tsa.arima_model import ARMA
ARMA(endog,order,exog=None)
ARMA.predict(start,end)#預(yù)測(cè)起始時(shí)間和終止時(shí)間
endog:模型內(nèi)變量data,輸入值x
order:模型參數(shù)(p,q)
模型步驟:
1、導(dǎo)入數(shù)據(jù),改成DataFrame格式,將時(shí)間設(shè)置為index索引
2、將時(shí)間與數(shù)據(jù)定為指定的日、月、季或年平均數(shù)值
3、建立模型,預(yù)測(cè)
4、畫(huà)出走勢(shì)圖
改進(jìn)方式:
1、ARMA中的p,q值選擇,引入AIC準(zhǔn)則(赤池消息準(zhǔn)則),統(tǒng)計(jì)模型擬合好壞的標(biāo)準(zhǔn),數(shù)值越小表示擬合越好;
2、嘗試按不同時(shí)間點(diǎn)預(yù)測(cè),可是按日、月、季或年,多種預(yù)測(cè)方式。
具體代碼與詳解:
#導(dǎo)入包
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")
#導(dǎo)入數(shù)據(jù)
data=pd.read_csv("E:/數(shù)據(jù)學(xué)習(xí)網(wǎng)站/bitcoin-master/shanghai_1990-12-19_to_2019-2-28.csv")
# print(data)
#將時(shí)間轉(zhuǎn)化為標(biāo)準(zhǔn)格式,將時(shí)間設(shè)置為index索引
data.Timestamp=pd.to_datetime(data.Timestamp)
data.index=data.Timestamp
#按月,季,年來(lái)統(tǒng)計(jì)
df_month=data.resample("M").mean()
df_q=data.resample("Q-DEC").mean()
df_y=data.resample('A-DEC').mean()
#設(shè)置pq值的取值范圍
sp=range(0,3)
sq=range(0,3)
parameters=product(sp,sq)#二元循環(huán)
parameters_list=list(parameters)#將其轉(zhuǎn)化為列表格式
resulrs=[]
best_aic=float("inf")#取值無(wú)窮大
#按月份建立預(yù)測(cè)模型
for param in parameters_list:
try:
model=ARMA(df_month.Price,order=(param[0],param[1])).fit()
except ValueError:
print("參數(shù)錯(cuò)誤",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("最優(yōu)模型:",best_model.summary())
#輸出預(yù)測(cè)值
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["預(yù)測(cè)值"]=model.predict(datetime(1990,12,31),datetime(2019,12,31))
print(df_month2)#添加預(yù)測(cè)值一列
# 開(kāi)始畫(huà)圖,按月預(yù)測(cè)
plt.figure(figsize=(20,12))
plt.rcParams['font.sans-serif']=['SimHei']
plt.plot(df_month.Price,label="實(shí)際走向")
plt.plot(model.predict(datetime(1990,12,31),datetime(2019,12,31)),ls="--",label="預(yù)測(cè)值")
plt.legend()
plt.title("滬指預(yù)測(cè)圖")
plt.xlabel("時(shí)間")
plt.ylabel("指數(shù)")
plt.show()
#按季度建立預(yù)測(cè)模型
# for param in parameters_list:
# try:
# model=ARMA(df_q.Price,order=(param[0],param[1])).fit()
# except ValueError:
# print("參數(shù)錯(cuò)誤",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("最優(yōu)模型:",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["預(yù)測(cè)值"]=model.predict(datetime(1990,12,31),datetime(2020,6,30))
# print(df_q2)
#
# # 開(kāi)始畫(huà)圖,按月計(jì)算
# plt.figure(figsize=(20,12))
# plt.rcParams['font.sans-serif']=['SimHei']
# plt.plot(df_q.Price,label="實(shí)際走向")
# plt.plot(model.predict(datetime(1990,12,31),datetime(2020,6,30)),ls="--",label="預(yù)測(cè)值")
# plt.legend()
# plt.title("滬指按季度預(yù)測(cè)圖")
# plt.xlabel("時(shí)間")
# plt.ylabel("指數(shù)")
# plt.show()
結(jié)果展示:
最優(yōu)模型: 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 預(yù)測(cè)值
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
圖片展示:


時(shí)間序列練習(xí)可用數(shù)據(jù)全套:
鏈接:https://pan.baidu.com/s/1HAB8WCYtgwVbkxStWrRm5g
提取碼:43v8
歡迎提問(wèn)與指正~~