精华内容
下载资源
问答
  • 基于 Holt-Winters季节预测模型 的时间序列预测
    2021-02-02 14:12:22
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from statsmodels.tsa.api import ExponentialSmoothing
    
    data = pd.read_excel('时间序列预测数据集.xlsx')
    # data.columns=[时间,投递人数,投递次数,工程师投递人数,工程师投递次数,招聘发布公司量,发布职位量,工程师岗位发布公司,工程师岗位发布量]
    
    for i in data.drop('时间',axis=1).columns:
        y = data[i][:37]
        ets = ExponentialSmoothing(y, trend='add', seasonal='add', seasonal_periods=12)
        r = ets.fit()
        pred = r.predict(start=len(y), end=len(y) + 12)
        data[i][37:] = pred
        pd.DataFrame({
        'origin': data[i],
        'fitted': r.fittedvalues,
        'pred': pred
    }).plot(legend=True)
        plt.title(i)
    data
    

    https://www.cnblogs.com/lfri/p/12243268.html

    更多相关内容
  • 利用ARIMA季节模型预测 目的:某公司业务具有明显的季节性波动,为了提前做好假日部署,需根据历史数据预测未来留存用户数量 1、数据准备 import pmdarima as pm import pandas as pd import matplotlib.pyplot as ...

    利用ARIMA季节模型预测

    目的:某公司业务具有明显的季节性波动,为了提前做好假日部署,需根据历史数据预测未来留存用户数量

    1、数据准备

    import pmdarima as pm
    import pandas as pd
    import matplotlib.pyplot as plt
    
    #导入数据
    data=pd.read_excel(r"C:\Users\csdn\Desktop\test.xlsx",sheet_name="OG",index_col = u'month')['liucun']
    data=pd.DataFrame(data)
    
    #查看原始数据时序图
    plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
    data.plot()
    plt.show()
    

    2、查看数据基本情况

    #查看原始数据自相关系数
    from statsmodels.graphics.tsaplots import plot_acf
    plot_acf(data).show()
    
    #定义ADF输出格式化函数,结果中Test Statistic大于1%置信水平值,P>0.05,liucun存在单位根,序列不平稳
    from statsmodels.tsa.stattools import adfuller
    def adf_test(timeseries):
        print ('ADF检验结果:')
        dftest = adfuller(timeseries, autolag='AIC')
        dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','Number of Lags Used','Number of Observations Used'])
        for key,value in dftest[4].items():
           dfoutput['Critical Value (%s)'%key] = value
        print (dfoutput)
    
    #对数据集使用ADF检验
    adf_test(data[u'liucun'])
    
    

    3、如果时间序列不平稳,需进行差分转换,得到差分之后的平稳序列再进行预测
    (1)如果明确需一阶差分的话

    #ADF检验结果说明原始序列不平稳,需进行差分,一阶 差分
    D_data = data.diff(1).dropna()
    D_data.columns = [u'liucun差分']
    D_data.plot() #时序图
    plt.show()
    plot_acf(D_data).show() #自相关图
    
    #对一阶差分后的序列进行单位根检验,P值小于0.05,一阶差分后的序列平稳
    from statsmodels.graphics.tsaplots import plot_pacf
    plot_pacf(D_data).show() #偏自相关图
    adf_test(D_data[u'liucun差分'])
    

    (2)如果不明确需进一步定阶

    #定好差分阶数后,对模型p,q定阶,可用aic或bic指标,ARIMA(data, (0, 0, 1)).fit().bic
    from statsmodels.tsa.arima_model import ARIMA
    pmax =int(len(data) / 5)    #一般阶数不超过 length /10
    qmax = int(len(data) / 5)
    aic_matrix = []
    for p in range(pmax +1):
        temp= []
        for q in range(qmax+1):
            try:
                temp.append(ARIMA(data, (p, 1, q)).fit().aic)
            except:
                temp.append(None)
        aic_matrix.append(temp)
    
    aic_matrix = pd.DataFrame(aic_matrix)   #将其转换成Dataframe 数据结构
    print(aic_matrix)
    
    p,q = aic_matrix.stack().idxmin()   #先使用stack 展平, 然后使用 idxmin 找出最小值的位置
    print(u'AIC 最小的p值 和 q 值:%s,%s' %(p,q))
    

    4、定好阶后可带入ARIMA模型进行拟合

    #找到是AIC/BIC最小的p,q参数,代入ARIMA模型中,进行拟合
    from statsmodels.tsa.arima_model import ARIMA
    print(ARIMA(data, (5,1,0)).fit().bic)
    model=ARIMA(data, (5,1,0)).fit()
    model.summary2() 
    
    #model.fittedvalues
    fittedvalues = pd.Series(model.fittedvalues, copy=True)
    plt.figure(figsize=(10, 6))
    plt.plot(fittedvalues,label="forecast")
    plt.plot(data,label="real")
    plt.plot(D_data,label="diff")
    plt.xlabel('month',fontsize=12,verticalalignment='top')
    plt.ylabel('avgdau',fontsize=14,horizontalalignment='center')
    plt.legend()
    plt.show()
    
    

    5、对拟合的模型效果进行评价

    # 计算R平方值
    import numpy as np
    yhat =model.fittedvalues                        # or [p(z) for z in x]
    ybar = np.sum(D_data[u'liucun差分'])/len(D_data[u'liucun差分'])          # or sum(y)/len(y)
    ssreg = np.sum((D_data[u'liucun差分']-ybar)**2)   # or sum([ (yihat - ybar)**2 for yihat in yhat])
    sstot = np.sum((D_data[u'liucun差分'] -yhat)**2)    # or sum([ (yi - ybar)**2 for yi in y])
    R =1- (sstot/ssreg)
    R
    

    6、利用拟合出来的模型进行预测

    #利用模型进行预测
    model.forecast(7)   #为未来8个月进行预测, 返回预测结果, 标准误差, 和置信区间
    
    展开全文
  • 测试序列稳定性:看以看到整体的序列并没有到达稳定性要求,要将时间序列转为平稳序列,有如下几种方法:DeflationbyCPILogarithmic(取对数)FirstDifference(一阶差分)SeasonalDifference(季节差分)...
  • ARIMA乘积季节模型及其在月径流预测中的应用,卢艳,,本文研究了应用ARIMA乘积季节模型在月径流预测中的可行性。以1985年1月至2001年12月汀江观音桥站月流量资料建立模型,以2002年的资料作�
  • 自己编写的在2018版matlab上是没有问题的,过早的版本可能会报错如2014版之前
  • 本文研究乘积季节模型在我国煤矿事故总数预测中的应用,通过对我国2006年1月到2010年12月煤矿事故总数数据来进行实证分析,采用差分方法对序列资料进行平稳化,然后进行模型定阶并估计其参数,建立了合适的乘积季节预测...
  • 本文研究乘积季节模型在我校图书借阅预测中的应用,通过对我校2007年1月到2009年12月的月度图书借阅数据来进行实证分析,采用差分方法对序列资料进行平稳化,然后进行模型定阶并估计其参数,建立了我校图书借阅的乘积...
  • 基于ARIMA季节乘积模型,提出一种新的矿井涌水量的预测方法,通过普通差分和季节差分保证矿井涌水量时间序列的平稳化,以模型定阶、参数估计和假设检验等过程建立合适的乘积季节模型ARIMA(2,1,1)(1,1,1)12。...
  • 由于建模是利用Box-Cox变换过后的数据进行的,所以在画图前需要把模型预测的结果转换成对原序列的预测结果。将原序列的真实值和预测值画在同一图中: 将尾部放大来看,红线表示预测值,黑色虚线表示95%的预测区间,...

    数据来自澳大利亚莫纳什大学统计学教授Rob Hyndman创建的时间序列数据库(TSDB),数据库涵盖近800个时间序列数据(经济、水文、气象、农业等);该数据集提供了从1973年到1995年美国新单户住宅的月销售量数据,共包含265条数据信息(1973年1月到1995年1月)

    对原始数据作图,如图1。可以大致判断该数据存在着序列相关性,以及季节性的变动,同时没有缺失值以及明显异常的点。
    图1 原始数据时间序列

    数据初步分析和预处理

    (1)正态性

    时间序列模型的建立和预测通常是在假设数据是正态分布的情况下进行的。通过对序列的观察可以发现,各时间段下数据变化范围所显示的方差随时间变化有较大的不同。做出数据QQ图可以看出,住宅月销量不服从正态分布的,于是进行Box-Cox转换。通过计算lambda = 0.667,最终得到变换后的序列数据: Y t = 1 λ ( X t λ − 1 ) Y_t=\frac{1}{λ}(X_t^λ-1) Yt=λ1(Xtλ1)
    图2 Box-Cox变换 lambda选取比较变换前后的数据序列QQ图以及W检验结果可以看到,相比于原始数据,Box-Cox变换后的数据正态性有较大的改善。
    图3 Box-Cox变换前后QQ图
    Shapiro-Wilk normality test

    data: houses.bcdata: houses
    W = 0.99337W = 0.99104
    p-value = 0.2908p-value = 0.1053

    同时序列方差也由145.24明显降低为10.52,因此,Box-Cox变换后的数据更适合我们进行建模。变换后的序列如下图。
    在这里插入图片描述

    (2)序列相关性

    做出变换后的序列与其滞后各阶的散点图,可以看出一阶滞后自相关很强,二阶、三阶较弱,之后更高的阶数自相关几乎为0,而到了十二阶,自相关性又变得很强。
    图5 各滞后阶数序列相关性
    做出自相关函数和偏自相关函数图像:
    图6 houses.bc自相关函数
    图7 houses.bc偏自相关函数
    通过绘制转换序列的ACF和PACF图,注意到序列中存在一个周期,因为每隔12个月便出现显著的相关性,意味着季节成分的周期是12,即d=12。

    (3)平稳性

    对变换后的序列进行单位根检验得到:
    Augmented Dickey-Fuller Test
    data: houses.bc
    Dickey-Fuller = -3.7804
    Lag order = 6
    p-value = 0.02045
    由于原假设是存在单位根,即序列非平稳,而p值<0.05,因此变换后的序列具有平稳性。

    模型建立

    模型建立过程按照下面流程图开展。均基于Box-cox变换后的序列。
    图8 建模流程图

    (1)模型识别

    由第三部分自相关函数带有周期性,以及偏自相关函数滞后一阶、二阶、十三阶的值较大,因此可对序列进行季节差分和一阶差分。
    a) 仅进行季节差分的结果如下:
    图9 季节差分序列图
    进行单位根检验,得到该序列为平稳的:
    Augmented Dickey-Fuller Test
    data: diff(houses.bc, lag = 12)
    Dickey-Fuller = -3.2832
    Lag order = 6
    p-value = 0.07447
    alternative hypothesis: stationary
    查看ACF、PCF图:
    图10 季节差分ACF/PACF图
    从ACF图可以看出序列与滞后前1-11项的相关性线性递减,可以判断为AR模型;结合PACF可知,序列具有拖尾特征,一阶显著,12阶显著,36阶、48阶较为显著,季节部分可以判断为AR模型。
    b) 仅进行一阶差分的结果如下:
    图11 一阶差分序列图
    与上述分析步骤相同,通过单位根检验(Dickey-Fuller = -8.8681,p-value<0.01)、ACF/PACF图分析,我们知道:该序列仍存在明显的周期性,但有效地消除了一些趋势,使平稳性得到了极大的改善。
    图12 一阶差分ACF/PACF图
    c) 一阶差分和季节差分得到的序列结果如下:
    图13 一阶差分×季节差分序列图
    通过一阶差分有效消除了趋势分量影响,通过季节差分消除了周期因素影响,该序列稳定(Dickey-Fuller = -7.084 , p-value = 0.01),ACF/PACF如图。从图中可以看到在ACF中显著的只有滞后12阶,在PACF中显著的有滞后12阶、24阶,以及较显著的36阶、48阶(考虑到模型的简洁性,30阶、40阶可忽略不计);具有拖尾的特征。前1-11阶不显著因此常规部分可以看成白噪声,而季节部分可以判为AR模型。
    图14 一阶差分×季节差分ACF/PACF图

    (2)模型定阶

    从模型识别中我们看到仅季节差分后的序列已经适合建模,但由于增加了一阶差分后序列的趋势分量得到了比较大的改善,而模型复杂度也并未增加太多,因此也可以对一阶差分和季节差分后的序列进行建模。
    a) 仅进行季节差分的序列的备选模型
    非季节性部分,ACF线性递减,PACF一阶显著,可以定为AR(1)
    季节部分,PACF 12阶显著,36阶、48阶较为显著,可以定为SAR(1)或SAR(4)
    于是备选模型有:
    ARIMA(1,0,0)×(1,1,0)
    ARIMA(1,0,0)×(4,1,0)
    b) 进行一阶差分和季节差分的序列备选模型
    非季节性部分, ACF中滞后1到11阶均不显著,因此可判断为MA(0)。PACF中各滞后阶数也不显著,因此我们将考虑AR(0);但由于ACF、 PACF在滞后2阶均处于临界状态,在滞后二阶之后相关性下降很快,因此AR的另一个可能的阶数为AR(2)
    周期性方面,ACF在滞后12阶之后不再显著,可以假设模型SMA(1)。PACF在滞后4之后不再显著,并具有拖尾特征,所以可以假设模型SAR(4);由于滞后2阶之后观察到的相关性不像之前的那么大,这意味着它们可能只是来自于噪声,所以也可以考虑模型SAR(2);
    所以备选模型有:
    ARIMA(0,1,0)×(0,1,1)
    ARIMA(0,1,0)×(2,1,0)
    ARIMA(0,1,0)×(2,1,1)
    ARIMA(0,1,0)×(4,1,0)
    ARIMA(0,1,0)×(4,1,1)
    ARIMA(2,1,0)×(0,1,1)
    ARIMA(2,1,0)×(2,1,0)
    ARIMA(2,1,0)×(2,1,1)
    ARIMA(2,1,0)×(4,1,0)
    ARIMA(2,1,0)×(4,1,1)

    (3)参数估计

    通过对以上各模型的参数进行估计,得到下面的结果:

    模型参数情况选择
    ARIMA(1,0,0)×(1,1,0)显著log likelihood = -443.31, aic = 890.61
    ARIMA(1,0,0)×(4,1,0)显著log likelihood = -426.36, aic = 862.71
    ARIMA(0,1,0)×(0,1,1)显著log likelihood = -416.91, aic = 835.83
    ARIMA(0,1,0)×(2,1,0)显著log likelihood = -437.46, aic = 878.92
    ARIMA(0,1,0)×(2,1,1)不显著
    ARIMA(0,1,0)×(4,1,0)显著log likelihood = -429.77, aic = 867.54
    ARIMA(0,1,0)×(4,1,1)不显著
    ARIMA(2,1,0)×(0,1,1)显著log likelihood = -415.02, aic = 836.04
    ARIMA(2,1,0)×(2,1,0)显著log likelihood = -435.26, aic = 878.52
    ARIMA(2,1,0)×(2,1,1)不显著
    ARIMA(2,1,0)×(4,1,0)显著log likelihood = -427.5, aic = 867
    ARIMA(2,1,0)×(4,1,1)不显著

    根据参数的显著性情况,结合模型的拟合效果和简洁性(对数似然值、AIC值),最终选出2个效果较好的模型,其模型参数如下:

    Model1: ARIMA(0,1,0)×(0,1,1)
    Coefficients:
                  sma1	        
                -1.0000	      
        s.e.     0.0893	
        sigma^2 estimated as 1.382:  
        log likelihood = -416.91,  
        aic = 835.83	
    
    Model2: ARIMA(2,1,0)×(0,1,1)
    Coefficients:
                 ar1      ar2     sma1
             -0.0932   -0.0870   -1.0000
      s.e.    0.0627   0.0626    0.0924
      sigma^2 estimated as 1.362:  
      log likelihood = -415.02,  
      aic = 836.04
    

    (4)模型诊断

    a) 残差分析
    Model 1 :
    在这里插入图片描述

    在这里插入图片描述
    方差齐性:从残差分布图可以看出,残差没有明显趋势,并且几乎所有残差都集中在±3之间,但有一个时间点上的残差超过3接近于4;
    正态性:从QQ图可以看到,残差基本符合正态性假设,但尾部有一点较为异常;进行W检验,得到W = 0.99488, p-value = 0.5623,因此可以认为符合正态性假设;
    独立性:从ACF图可以看到,在滞后20和28项存在较为显著的相关性;进行游程检验p=0.398,经过Ljung-Box检验p=0.2289,因此在整体上可以认为符合独立性假设。
    Model 2:
    残差分析图与模型1的结果十分类似不再呈现。于是,与模型1一样,均存在一个异常值点,均能通过W检验、游程检验、Ljung-Box检验,因此符合方差齐性、正态性、独立性假设。
    b) 处理异常值
    对于残差分析中发现的一个异常值,我们通过软件命令找到,发现它是一个新息异常值,位于第159位(即1986年3月);于是我们通过对异常值点单独进行回归拟合再加入模型中来消除影响。得到模型3、模型4;模型估计如下:

    模型3: 加入IO的ARIMA(0,1,0)×(0,1,1)
     Coefficients:
               sma1      IO
             -1.0000   2.8264
       s.e.   0.0797   0.8321
       sigma^2 estimated as 1.322:
       log likelihood = -411.27, 
       aic = 826.55
       
    模型4:加入IO的ARIMA(2,1,0)×(0,1,1)
     Coefficients:
          		ar1        ar2       sma1      IO
    		  -0.0858   -0.0964   -1.0000   2.9400
       s.e.   0.0628    0.0626     0.0837   0.8623
       sigma^2 estimated as 1.301:
       log likelihood = -409.32,
       aic = 826.65
    

    可以看出与模型1、2相比,对数似然均有所增加,AIC也变小了。
    依然进行同样的残差诊断,可以发现:方差齐性、独立性、正态性检验均通过;
    进一步检验异常值,此时既没有可加异常值也没有新息异常值。

    (5)过拟合

    对于模型3的所有尝试得到的过拟合模型,一部分模型并没有有效降低AIC,还有一部分模型降低了AIC但估计的参数值不显著。
    对模型4进行过拟合最终获得了表现更好的几个模型;模型ARIMA(2,1,1)×(0,1,1)、模型ARIMA(2,1,2)×(0,1,1)等,比较AIC可以得到ARIMA(2,1,2)×(0,1,1)是最优的,AIC为821.33,对数似然值为-404.67。所以确定这一模型作为最终拟合模型。
    模型参数估计如下,记为模型5:
    Coefficients:
    ar1 ar2 ma1 ma2 sma1 IO
    1.7844 -0.9279 -1.8773 1.0000 -1.0000 2.6435
    s.e. 0.0250 0.0262 0.0274 0.0289 0.0641 0.8405
    sigma^2 estimated as 1.238:log likelihood = -404.67, aic = 821.33
    进行最后的残差检验:
    图16 模型5残差序列图
    图17 模型5残差QQ图和ACF图
    根据上面3个图,可以看出:

    1. 残差没有明显趋势,并且所有残差都集中在±3之间,符合方差齐性。
    2. 残差均分布在QQline附近,基本符合正态性假设;进行W检验,得到W = 0.99534, p-value = 0.6463,因此可以认为符合正态性假设。
    3. ACF图中所有滞后项的相关性均不显著,可以认为残差是白噪声;进行游程检验p= 0.136,经过Ljung-Box检验p= 0.4514,因此可以认为符合独立性假设。
      于是,模型5 调整异常值的ARIMA(2,1,2)×(0,1,1)模型通过了所有残差检验。

    结果预测

    利用第四部分选出的模型5即调整异常值的ARIMA(2,1,2)×(0,1,1)模型,进行预测。由于建模是利用Box-Cox变换过后的数据进行的,所以在画图前需要把模型预测的结果转换成对原序列的预测结果。将原序列的真实值和预测值画在同一图中:
    在这里插入图片描述
    将尾部放大来看,红线表示预测值,黑色虚线表示95%的预测区间,圆圈表示真实值,可以看到,所有的真实值均落在预测值的95%置信区间内,可见这一模型有较高的可信度。
    在这里插入图片描述

    总结

    为预测美国新单户住宅的销售量,基于1973年到1995年的月销售量数据建立了乘法季节模型。由于数据集平稳较差,首先采用了Box-Cox变换;转换后的数据显示了一定的趋势和季节性成分,因此进行了季节性的差分、选择性进行了一阶差分。在这之后,通过检查ACF和PACF,根据AIC指标确定了两个候选模型。对于每个模型,进行残差诊断,并去除异常值。继而经过过拟合得到了效果最好的模型:
    ARIMA(2,1,2)X(0,1,1)
    Coefficients:
    ar1 ar2 ma1 ma2 sma1 IO
    1.7844 -0.9279 -1.8773 1.0000 -1.0000 2.6435
    s.e. 0.0250 0.0262 0.0274 0.0289 0.0641 0.8405
    sigma^2 estimated as 1.238:log likelihood = -404.67, aic = 821.33
    这一模型的系数显著不为0,有最低的AIC,并且通过了所有的残差诊断,残差为白噪声序列。同时我们看到,它成功地预测了序列的未来数值,真实值在预测值的95%置信区间内。
    因此,通过这一模型我们便可以基于过去数据,较为准确地预测未来美国新单户住宅的销量,为各方决策提供参考;进一步根据供求关系,可以帮助我们来判断最佳的购买时期。

    展开全文
  • 案例五季节ARIMA模型建模与预测实验指导 一实验目的 学会识别时间序列的季节变动 能看出其季节波动趋势 学会剔除季节因素的方法 了 解ARIMA模型的特点和建模过程掌握利用最小二乘法等方法对 ARIMA模型进行估计 利用...
  • 本文研究乘积季节模型在我校图书借阅预测中的应用,通过对我校2007年1月到2009年12月的月度图书借阅数据来进行实证分析,采用差分方法对序列资料进行平稳化,然后进行模型定阶并估计其参数,建立了我校图书借阅的乘积...
  • 它还结合了复杂的自动程序来进行识别,精确的最大似然估计和离群值检测,可用于文献中提供的许多类型的模型(例如,多季节ARIMA模型,传递函数,指数平滑,不可观测的分量,VARX)。 例如,您可以通过自动识别异常值...
  • 季节指数预测模型PPT课件.pptx
  • 服装零售的季节性离散灰色预测模型
  • 季节性时间序列建模与预测 ,孟玲清,王晓雨,所谓所谓时间序列,就是各种社会、经济、自然现象的数量指标按照时间次序排列起来的统计数据,其有多种构成因素,每种因素对系统
  • 季节ARIMA模型在社会消费品零售总额预测中的应用,蒋建,石学军,本文首先简要介绍了ARMA模型季节ARIMA模型,接着利用统计软件EViews,通过分析我国社会消费品零售总额从1997年1月到2010年6月的月度数�
  • 季节ARIMA模型建模和预测.doc
  • 季节ARIMA模型建模与预测.pdf
  • 旅游客流量具有明显的非线性和季节性特征,所以采取季节调整方法对样本数据进行预处理,...结果显示:季节调整的PSO-SVR模型预测精度明显高于SVR、季节调整的SVR和PSO-SVR模型,该模型是进行旅游客流量预测的有效工具。
  • 运用SPSS软件和SAS软件系统中的时间序列建模方法建立了我国城乡居民储蓄存款模型,并认为用最大似然估计法(ML)对结果进行短期预测,用无约束最小二乘估计法(ULS)对结果进行中长期预测,可得到较高的预测精度.
  • 在之前的专栏中我们用ARIMA的方法做了时间序列的趋势性预测。 不过我们经常还会遇到一种情况,即某些时间序列中存在明显的周期性变化,这种周期是...一种适用于描述这类序列的模型称作季节时间序列模型(SARIMA, se...

    在之前的专栏中我们用ARIMA的方法做了时间序列的趋势性预测。

    不过我们经常还会遇到一种情况,即某些时间序列中存在明显的周期性变化,这种周期是由于季节性变化(季度、月度等)引起的。

    如下图所示,为1949年到1960年每月国际航空公司的乘客人数。从中可以看到明显的季节性,该周期为12个月。

    其中包含了季节性和趋势性

    一种适用于描述这类序列的模型称作季节时间序列模型(SARIMA, seasonal ARIMA model),也叫乘积ARIMA模型,因为模型的形式是以相乘的形式表示。

    有关于SARIMA的理论知识这里也不展开了,需要了解基础原理的可以看这里(这个文档是付费的,不过免费预览的那段也足够用了)。

    假设你已经了解了模型的基本形式,现在开始编程。编程答题思路与ARIMA相同,不过细节处有颇多不同。

    1.加载试验数据与参数设置

    %% 1.加载数据
    load('Data_Airline.mat')   %加载航空公司数据
    data = Data(:);            %转为列向量
    S = 12;                    %季节性序列变化周期,12个月
    figflag = 'on';            %打开画图
    step = 48;                 %预测步数

    2.确定季节性与非季节性差分数

    与ARIMA模型一样,使用SARIMA模型也要求数据平稳。不同的是SARIMA的差分项有两个,分别是季节性差分与非季节性差分。通常季节性差分经过一次即可,非季节性差分通常在0~3之间。

    使用下述代码将原始序列进行差分计算,需要注意差分后的序列长度将会缩短。

    %% 2.确定季节性与非季节性差分数,D取默认值1,d从0至3循环,平稳后停止
    for d = 0:3
        D1 = LagOp({1 -1},'Lags',[0,d]);     %非季节差分项的滞后算子
        D12 = LagOp({1 -1},'Lags',[0,1*S]);  %季节差分项的滞后算子
        D = D1*D12;                          %相乘
        dY = filter(D,data);                 %对原数据进行差分运算
        if(getStatAdfKpss(dY))               %数据平稳
            disp(['非季节性差分数为',num2str(d),',季节性差分数为1']);
            break;
        end
    end

    上述代码中的getStatAdfKpss为检验数据是否已经平稳的自定义函数,当函数返回1时说明数据已经平稳。

    3.确定SARIMA模型阶数

    这个步骤中需要确定的阶数有四个:AR阶数p,MA阶数q,SAR阶数P,SMA阶数Q。这里就不贴PCA和FPCA定阶的方法了,而是直接用简单粗暴的暴力定阶(基于AICBIC准则的方法)。

    %% 3.确定阶数ARlags,MALags,SARLags,SMALags
    max_ar = 3;  %
    max_ma = 3;
    max_sar = 3;
    max_sma = 3;
    try
        [AR_Order,MA_Order,SAR_Order,SMA_Order] = SARMA_Order_Select(dY,max_ar,max_ma,max_sar,max_sma,S,d); %自动定阶
    catch ME %捕捉错误信息
        msgtext = ME.message;
        if (strcmp(ME.identifier,'econ:arima:estimate:InvalidVarianceModel'))
             msgtext = [msgtext,'  ','无法进行arima模型估计,这可能是由于用于训练的数据长度较小,而要进行拟合的阶数较高导致的,请尝试减小max_ar,max_ma,max_sar,max_sma的值'];
        end
        msgbox(msgtext, '错误')
    end
    disp(['ARlags=',num2str(AR_Order),',MALags=',num2str(MA_Order),',SARLags=',num2str(SAR_Order),',SMALags=',num2str(SMA_Order)]);

    SARMA_Order_Select是我自己写的一个函数,只需要输入信号、最大p值、最大q值、最大P、最大Q、序列周期和差分阶数就可以得到推荐p、q、P、Q。

    运行结果为:

    ARlags=1,MALags=1,SARLags=1,SMALags=1

    即p=1,q=1,P=1,Q=1

    4.残差检验

    为了确保确定的阶数合适,还需要进行残差检验。残差即原始信号减掉模型拟合出的信号后的残余信号。如果残差是随机正态分布的、不自相关的,这说明残差是一段白噪声信号,也就说明有用的信号已经都被提取到ARMA模型中了。

    下述代码中的creatSARIMA是笔者专门写的构建模型的函数,这里的处理方式的不同就是ARMA与SARIMA方法的众多差别的体现。总体来说SARIMA的是更复杂的。

    Mdl = creatSARIMA(AR_Order,MA_Order,SAR_Order,SMA_Order,S,d);  %创建SARIMA模型
    try
        EstMdl = estimate(Mdl,data);
    catch ME %捕捉错误信息
        msgtext = ME.message;
        if (strcmp(ME.identifier,'econ:arima:estimate:InvalidVarianceModel'))
             msgtext = [msgtext,'  ','无法进行arima模型估计,这可能是由于用于训练的数据长度较小,而要进行拟合的阶数较高导致的,请尝试减小max_ar和max_ma的值']
        end
        msgbox(msgtext, '错误')
        return
    end
    [res,~,logL] = infer(EstMdl,data);   %res即残差
    
    stdr = res/sqrt(EstMdl.Variance);
    figure('Name','残差检验','Visible','on')
    subplot(2,3,1)
    plot(stdr)
    title('Standardized Residuals')
    subplot(2,3,2)
    histogram(stdr,10)
    title('Standardized Residuals')
    subplot(2,3,3)
    autocorr(stdr)
    subplot(2,3,4)
    parcorr(stdr)
    subplot(2,3,5)
    qqplot(stdr)

    v2-2428304cbb5a6a68e810a57ddddd0fa2_720w.jpg

    残差检验

    上图为残差检验的结果图。Standardized Residuals是查看残差是否接近正态分布,理想的残差要接近正态分布;ACF和PACF检验残差的自相关和偏自相关,理想的结果应该在图中不存在超出蓝线的点;最后一张QQ图是检验残差是否接近正太分布的,理想的结果中蓝点应该靠近红线。

    除了上述图像检验方法,还可以通过Durbin-Watson对相关性进行检验:

    % Durbin-Watson 统计是计量经济学分析中最常用的自相关度量
    diffRes0 = diff(res);  
    SSE0 = res'*res;
    DW0 = (diffRes0'*diffRes0)/SSE0 % Durbin-Watson statistic,该值接近2,则可以认为序列不存在一阶相关性。

    运算结果为1.9887,这个值越接近2越说明残差不存在一阶相关性。

    上述检验可以证明,残差接近正态分布,且相互独立,可以认为ARMA建模符合要求。

    5.预测

    [forData,YMSE] = forecast(EstMdl,step,data);   %matlab2018及以下版本写为Predict_Y = forecast(EstMdl,step,'Y0',Y);   matlab2019写为Predict_Y = forecast(EstMdl,step,Y);
    
    lower = forData - 1.96*sqrt(YMSE); %95置信区间下限
    upper = forData + 1.96*sqrt(YMSE); %95置信区间上限
    
    figure('Visible','on')
    plot(data,'Color',[.7,.7,.7]);
    hold on
    h1 = plot(length(data):length(data)+step,[data(end);lower],'r:','LineWidth',2);
    plot(length(data):length(data)+step,[data(end);upper],'r:','LineWidth',2)
    h2 = plot(length(data):length(data)+step,[data(end);forData],'k','LineWidth',2);
    legend([h1 h2],'95% 置信区间','预测值',...
    	     'Location','NorthWest')
    title('Forecast')
    hold off

    直接上结果:

    上图中灰线为用来训练的数据,黑线为未来值的预测,红线为95%置信区间上下限。也就是说未来真实值有95%的概率落在这个范围内。

    6.封装

    上述整个过程可以封装成一个函数,如下:

    function [forData,lower,upper] = Fun_SARIMA_Forecast(data,step,max_ar,max_ma,max_sar,max_sma,S,figflag)
    % 使用SARIMA进行预测的函数,可以直接调用,非季节差分阶数自动确定。p,q,P,Q自动确定
    % 输入:
    % data为待预测数据,一维数据,使用SARIMA时,该数据长度至少为10+S,S为周期长度,但是达到10+S之后仍然可能会报错,可能是由数据的差分处理使得目标数据长度变短导致的。
    % step为拟预测步数
    % max_ar为AR模型搜寻的最大阶数   建议不大于3
    % max_ma为MA模型搜寻的最大阶数   建议不大于3
    % max_sar为SAR模型搜寻的最大阶数   建议不大于3
    % max_sms为SMA模型搜寻的最大阶数   建议不大于3
    % S为季节性周期
    % figflag 为画图标志位,'on'为画图,'off'为不画
    % 输出:
    % forData为预测结果,其长度等于step
    % lower为预测结果的95%置信下限值
    % upper为预测结果的95%置信上限值

    直接调用就可以出结果。

    获取文章中全部源码,可以点击下述链接获取:

    SARIMA代码说明文档(公开版) | 工具箱文档

    SARIMA时间序列预测图形界面版软件(试用版) | 工具箱文档

    参考:

    MATLAB 文档中心 - MathWorks 中国

    展开全文
  • 经济管理中的计算机应用例题
  • 季节ARIMA模型建模和预测实验指导.doc
  • 季节ARIMA模型建模与预测实验指导.docx
  • 数学建模学习方法-图书借阅流量行为季节预测模型
  • 数学建模-季节ARIMA模型建模与预测.zip
  • 基于ARIMA季节模型的新能源汽车市场前景预测研究.pdf
  • 论文研究-季节预测的组合灰色神经网络模型研究.pdf, 对于季节性时间序列具有增长性和波动性的二重趋势性 ,本文提出了季节预测的组合灰色神经网络模型 ,研究了同时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,759
精华内容 3,103
关键字:

季节模型预测