美文网首页数据分析专栏
时间序列模型:如何对沪指走势进行预测?

时间序列模型:如何对沪指走势进行预测?

作者: Viva_Stephen | 来源:发表于2019-07-14 11:07 被阅读57次

    沪指一般指上海证券综合指数简称“上证指数”或“上证综指”,其样本股是在上海证券交易所全部上市股票,包括A股和B股,反映了上海证券交易所上市股票价格的变动情况,自1991年7月15日起正式发布。

    今天,我们就要根据其历史数据做出预测模型:

    原理:

    根据AR,MA,ARMA,ARIMA时间序列算法,观察结果与时间的关系,找出目标变量Y与时间的相性规律。

    四种算法:

    1、AR 全称Auto Regresive 自回归模型:
    过去若干时刻的点通过线性组合,再加上白噪声(随机误差)可以预测未来某个时刻的结果,模型为AR(p);
    2、MA Moving Average 滑动平均模型:
    通过历史白噪声进行线性组合,来影响当前时刻的数据,模型为AM(q);
    3、ARMA 自回归滑动平均模型:
    两者混合使用更加准确,ARMA(p,q)
    4、ARIMA差分自回归滑动平均模型:
    比ARMA多一个差分过程,将不平稳数据进行差分平稳,模型为ARIMA(p,d,q)

    模型介绍:
    from statsmodels.tsa.arima_model import ARMA
    ARMA(endog,order,exog=None)
    ARMA.predict(start,end)#预测起始时间和终止时间
    

    endog:模型内变量data,输入值x
    order:模型参数(p,q)

    模型步骤:

    1、导入数据,改成DataFrame格式,将时间设置为index索引
    2、将时间与数据定为指定的日、月、季或年平均数值
    3、建立模型,预测
    4、画出走势图

    改进方式:
    1、ARMA中的p,q值选择,引入AIC准则(赤池消息准则),统计模型拟合好坏的标准,数值越小表示拟合越好;
    2、尝试按不同时间点预测,可是按日、月、季或年,多种预测方式。

    具体代码与详解:
    #导入包
    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")
    #导入数据
    data=pd.read_csv("E:/数据学习网站/bitcoin-master/shanghai_1990-12-19_to_2019-2-28.csv")
    # print(data)
    #将时间转化为标准格式,将时间设置为index索引
    data.Timestamp=pd.to_datetime(data.Timestamp)
    data.index=data.Timestamp
    #按月,季,年来统计
    df_month=data.resample("M").mean()
    df_q=data.resample("Q-DEC").mean()
    df_y=data.resample('A-DEC').mean()
    
    #设置pq值的取值范围
    sp=range(0,3)
    sq=range(0,3)
    parameters=product(sp,sq)#二元循环
    parameters_list=list(parameters)#将其转化为列表格式
    
    resulrs=[]
    best_aic=float("inf")#取值无穷大
    #按月份建立预测模型
    for param in parameters_list:
        try:
            model=ARMA(df_month.Price,order=(param[0],param[1])).fit()
        except ValueError:
            print("参数错误",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("最优模型:",best_model.summary())
    #输出预测值
    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["预测值"]=model.predict(datetime(1990,12,31),datetime(2019,12,31))
    print(df_month2)#添加预测值一列
    
    # 开始画图,按月预测
    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="预测值")
    plt.legend()
    plt.title("沪指预测图")
    plt.xlabel("时间")
    plt.ylabel("指数")
    plt.show()
    
    #按季度建立预测模型
    # for param in parameters_list:
    #     try:
    #         model=ARMA(df_q.Price,order=(param[0],param[1])).fit()
    #     except ValueError:
    #         print("参数错误",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("最优模型:",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["预测值"]=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="预测值")
    # plt.legend()
    # plt.title("沪指按季度预测图")
    # plt.xlabel("时间")
    # plt.ylabel("指数")
    # plt.show()
    

    结果展示:

    最优模型:                               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          预测值
    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
    
    图片展示:
    按月预测.png 附加按季度预测.png

    时间序列练习可用数据全套:
    链接:https://pan.baidu.com/s/1HAB8WCYtgwVbkxStWrRm5g
    提取码:43v8

    欢迎提问与指正~~

    相关文章

      网友评论

        本文标题:时间序列模型:如何对沪指走势进行预测?

        本文链接:https://www.haomeiwen.com/subject/yaqbkctx.html