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

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

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

歡迎提問(wèn)與指正~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容