滬指一般指上海證券綜合指數(shù)簡稱“上證指數(shù)”或“上證綜指”,其樣本股是在上海證券交易所全部上市股票,包括A股和B股,反映了上海證券交易所上市股票價格的變動情況,自1991年7月15日起正式發(fā)布。
今天,我們就要根據(jù)其歷史數(shù)據(jù)做出預(yù)測模型:
原理:
根據(jù)AR,MA,ARMA,ARIMA時間序列算法,觀察結(jié)果與時間的關(guān)系,找出目標(biāo)變量Y與時間的相性規(guī)律。
四種算法:
1、AR 全稱Auto Regresive 自回歸模型:
過去若干時刻的點(diǎn)通過線性組合,再加上白噪聲(隨機(jī)誤差)可以預(yù)測未來某個時刻的結(jié)果,模型為AR(p);
2、MA Moving Average 滑動平均模型:
通過歷史白噪聲進(jìn)行線性組合,來影響當(dāng)前時刻的數(shù)據(jù),模型為AM(q);
3、ARMA 自回歸滑動平均模型:
兩者混合使用更加準(zhǔn)確,ARMA(p,q)
4、ARIMA差分自回歸滑動平均模型:
比ARMA多一個差分過程,將不平穩(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ù)測起始時間和終止時間
endog:模型內(nèi)變量data,輸入值x
order:模型參數(shù)(p,q)
模型步驟:
1、導(dǎo)入數(shù)據(jù),改成DataFrame格式,將時間設(shè)置為index索引
2、將時間與數(shù)據(jù)定為指定的日、月、季或年平均數(shù)值
3、建立模型,預(yù)測
4、畫出走勢圖
改進(jìn)方式:
1、ARMA中的p,q值選擇,引入AIC準(zhǔn)則(赤池消息準(zhǔn)則),統(tǒng)計模型擬合好壞的標(biāo)準(zhǔn),數(shù)值越小表示擬合越好;
2、嘗試按不同時間點(diǎn)預(yù)測,可是按日、月、季或年,多種預(yù)測方式。
具體代碼與詳解:
#導(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)
#將時間轉(zhuǎn)化為標(biāo)準(zhǔn)格式,將時間設(shè)置為index索引
data.Timestamp=pd.to_datetime(data.Timestamp)
data.index=data.Timestamp
#按月,季,年來統(tǒng)計
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")#取值無窮大
#按月份建立預(yù)測模型
for param in parameters_list:
try:
model=ARMA(df_month.Price,order=(param[0],param[1])).fit()
except ValueError:
print("參數(shù)錯誤",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ù)測值
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ù)測值"]=model.predict(datetime(1990,12,31),datetime(2019,12,31))
print(df_month2)#添加預(yù)測值一列
# 開始畫圖,按月預(yù)測
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ù)測值")
plt.legend()
plt.title("滬指預(yù)測圖")
plt.xlabel("時間")
plt.ylabel("指數(shù)")
plt.show()
#按季度建立預(yù)測模型
# for param in parameters_list:
# try:
# model=ARMA(df_q.Price,order=(param[0],param[1])).fit()
# except ValueError:
# print("參數(shù)錯誤",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ù)測值"]=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="實(shí)際走向")
# plt.plot(model.predict(datetime(1990,12,31),datetime(2020,6,30)),ls="--",label="預(yù)測值")
# plt.legend()
# plt.title("滬指按季度預(yù)測圖")
# plt.xlabel("時間")
# 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ù)測值
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
圖片展示:
時間序列練習(xí)可用數(shù)據(jù)全套:
鏈接:https://pan.baidu.com/s/1HAB8WCYtgwVbkxStWrRm5g
提取碼:43v8
歡迎提問與指正~~