滬指一般指上海證券綜合指數(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 自回歸模型:
過去若干時刻的點通過線性組合,再加上白噪聲(隨機誤差)可以預(yù)測未來某個時刻的結(jié)果懂从,模型為AR(p)授段;
2、MA Moving Average 滑動平均模型:
通過歷史白噪聲進行線性組合番甩,來影響當(dāng)前時刻的數(shù)據(jù)侵贵,模型為AM(q);
3缘薛、ARMA 自回歸滑動平均模型:
兩者混合使用更加準(zhǔn)確窍育,ARMA(p,q)
4、ARIMA差分自回歸滑動平均模型:
比ARMA多一個差分過程宴胧,將不平穩(wěn)數(shù)據(jù)進行差分平穩(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溶其、畫出走勢圖
改進方式:
1、ARMA中的p敦间,q值選擇瓶逃,引入AIC準(zhǔn)則(赤池消息準(zhǔn)則),統(tǒng)計模型擬合好壞的標(biāo)準(zhǔn)廓块,數(shù)值越小表示擬合越好;
2厢绝、嘗試按不同時間點預(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="實際走向")
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="實際走向")
# 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
歡迎提問與指正~~