時間序列模型:如何對滬指走勢進(jìn)行預(yù)測?

滬指一般指上海證券綜合指數(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
圖片展示:
按月預(yù)測.png
附加按季度預(yù)測.png

時間序列練習(xí)可用數(shù)據(jù)全套:
鏈接:https://pan.baidu.com/s/1HAB8WCYtgwVbkxStWrRm5g
提取碼:43v8

歡迎提問與指正~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容