精华内容
下载资源
问答
  • 时间序列模型

    千次阅读 2014-06-18 20:43:43
    时间序列是指把某一变量在不同时间上的数值按时间先后顺序排列起来所形成的序列,它的时间单位可以是分、时、日、周...时间序列模型就是利用时间序列建立的数学模型,它主要被用来对未来进行短期预测,属于趋势预测法。

    时间序列是指把某一变量在不同时间上的数值按时间先后顺序排列起来所形成的序列,它的时间单位可以是分、时、日、周、旬、月、季、年等。时间序列模型就是利用时间序列建立的数学模型,它主要被用来对未来进行短期预测,属于趋势预测法。

    一、简单一次移动平均预测法


    项数n的数值,要根据时间序列的特点而定,不宜过大或过小.n过大会降低移动平均数的敏感性,影响预测的准确性;n过小,移动平均数易受随机变动的影响,难以反映实际趋势.一般取n的大小能包含季节变动和周期变动的时期为好,这样可消除它们的影响.对于没有季节变动和周期变动的时间序列,项数n的取值可取较大的数;如果历史数据的类型呈上升(或下降)型的发展趋势,则项数n的数值应取较小的数,这样能取得较好的预测效果.

     

    1.某企业1~11月的销售收入时间序列如下表所示.n=4,试用简单一次移动平均法预测第12月的销售收入,并计算预测的标准误差.


    二、加权一次移动平均预测法

    简单一次移动平均预测法,是把参与平均的数据在预测中所起的作用同等对待,但参与平均的各期数据所起的作用往往是不同的。为此,需要采用加权移动平均法进行预测,加权一次移动平均预测法是其中比较简单的一种。

    三、指数平滑预测法


    展开全文
  • 时间序列模型调查

    千次阅读 2019-03-25 19:13:23
    时间序列模型最常用最强大的的工具就是递归神经网络(recurrent neural network, RNN)。相比与普通神经网络的各计算结果之间相互独立的特点,RNN的每一次隐含层的计算结果都与当前输入以及上一次的隐含层结果相关。...

     

    RNN 模型

    Recurrent Neural Network (回流神经网络,有的译做递归神经网络)

    时间序列模型最常用最强大的的工具就是递归神经网络(recurrent neural network, RNN)。相比与普通神经网络的各计算结果之间相互独立的特点,RNN的每一次隐含层的计算结果都与当前输入以及上一次的隐含层结果相关。通过这种方法,RNN的计算结果便具备了记忆之前几次结果的特点。

    简单来说,RNN可以通过t个历史记录预测t+1。看下图可能更容易理解它的原理

    右侧为计算时便于理解记忆而产开的结构。简单说,x为输入层,o为输出层,s为隐含层,而t指第几次的计算;V,W,U为权重,其中计算第t次的隐含层状态时为St = f(U*Xt + W*St-1),实现当前输入结果与之前的计算挂钩的目的。

    RNN的局限:
    由于RNN模型如果需要实现长期记忆的话需要将当前的隐含态的计算与前n次的计算挂钩,即St = f(U*Xt + W1*St-1 + W2*St-2 + ... + Wn*St-n),那样的话计算量会呈指数式增长,导致模型训练的时间大幅增加,因此RNN模型一般不直接用来进行长期记忆计算。另外,传统RNN处理不了长期依赖问题,这是个致命伤。

    其他关于RNN评价的概括总结:

    现实中的RNN因为层次较深,比较难优化,单纯的BPTT(back-propagation through time)容易出现问题。


    对于时间序列的模型中,在非线性模型这一块, 应该就是RNN, 它是表达能力很强的一个模型. 但是RNN的training比较困难, 同时RNN的参数选择(layer, activation function, hidden neuron, learning rate)都难以优化.


    对于纯粹时间序列预测,目前最理想的方法应该就是RNN及其变体了。标准的RNN要达到好的效果会比较难训练,目前它的带记忆的变体,比如LSTM(long-short term memory)和GRU(gated recurrent unit)都非常热门。进一步的,这些模型还可以和其它神经网络模型组合,比如在LSTM下面堆叠若干层的CNN等等,这样基本上就是目前深度学习(deep learning)中常见的处理时间序列最好的模型了。当然这也要配置和训练得当才能得到好的效果(包括数据预处理、恰当的参数等)。
     

    LSTM 模型

    LSTM(Long Short-Term Memory)模型是一种RNN的变型

    简单来说,这个模型相对于RNN的改进就是:既要提取有用的记忆信息,又要去除没用的记忆信息。通过下图容易理解

    演示了阀门是如何工作的:通过阀门控制使序列第1的输入的变量影响到了序列第4,6的的变量计算结果。

    黑色实心圆代表对该节点的计算结果输出到下一层或下一次计算;空心圆则表示该节点的计算结果没有输入到网络或者没有从上一次收到信号。

     

    LSTM模型应该是针对RNN处理不了长期依赖问题所做出的改进模型,对于之前的历史数据只提取有用的,而过滤掉了噪声,这样从某种程度上就减少了模型的计算量。备注:Python中有不少包可以直接调用来构建LSTM模型,比如pybrain, kears, tensorflow, cikit-neuralnetwork等。

     

     

    移动平均模型  

    移动平均模型是最简单的时间序列模型,分为一次移动平均和多次移动平均

    一次移动平均

    http://images2015.cnblogs.com/blog/789211/201605/789211-20160516215803607-1121795149.png

    二次移动平均

    http://images2015.cnblogs.com/blog/789211/201605/789211-20160516215813060-65813912.png

    当预测目标的基本趋势是在某一水平上下波动时,可用一次移动平均,当预测目标的基本趋势与某一线性模型相吻合时,常用二次移动平均。当序列同时存在线性趋势与周期波动时,可用趋势移动。平均移动平均的思想是:取最近N期序列值的平均值作为未来各期的预测结果,一般N的取值范围在5-200之间,当历史序列的基本趋势变化不大时且序列中随机变动的成分较多时,N的取值应该大一些,否则应该小一些,当有确定的季节变动周期资料中,移动平均的项数应取周期长度。选择最佳N值的有效方法是,比较若干模型的预测误差,均方预测误差最小者为好。

     

    指数平滑模型

    指数平滑法是生产预测中常用的一种方法。所有预测方法中,指数平滑是用得最多的一种。指数平滑法则兼容了全期平均和移动平均所长,不舍弃过去的数据,但是仅给予逐渐减弱的影响程度,即随着数据的远离,赋予逐渐收敛为零的权数。

    http://www.statr.cn/images/0031.gif

     为t+1期的指数平滑趋势预测值;
     为t期的指数平滑趋势预测值;
     为t期实际观察值;

     

    一次指数平滑法只适合于具有水平发展趋势的时间序列分析,只能对近期进行预测。如果碰到时间序列具有上升或下降趋势时,在这个上升或下降的过程中,预测偏差会比较大,这时最好用二次指数平滑法进行预测

    1、优点:所需数据资料少,就可以预测出来所需要的结果,指数平滑法是在移动平均法基础上发展起来的一种时间序列分析预测法,兼容了全期平均和移动平均所长,不舍弃过去的数据,但是仅给予逐渐减弱的影响程度,即随着数据的远离,赋予逐渐收敛为零的权数是通过计算指数平滑值,配合一定的时间序列预测模型对现象的未来进行预测。
    2、缺点:赋予远期较小的比重,近期较大的比重,所以只能进行短期预测。

     

    ARIMA模型

    在整个调查过程中,该模型的出现频率是最高的,评价来看应该是使用最广泛的一个模型,但关于其具体适用范围的介绍却很少。

    是由Box-Jenkins提出的更加全面的时间序列分析模型,也称为整合自回归移动平均模型,该模型的基础是自回归和移动平均模型(ARMA模型),在数学上,指数平滑模型仅仅是ARIMA模型的特例。

    ARIMA模型包括两个特殊模型

    <1>自回归模型(AR模型)
    设某变量的一个观测值是由其以前的p个观测值的线性组合加上随机误差项at而得,at也称为白噪声,假设at在不同时间上是相互独立无关的。

    http://images2015.cnblogs.com/blog/789211/201605/789211-20160516220121169-1682304627.png

    该模型看上去就像是自己对自己回归一样,所以称为自回归模型,一阶自回归模型记为AR(1),p阶自回归模型记为AR(p),计算AR模型的目的是了解预测值和几个过去值有关,相关关系如何,并确定各阶参数φ

    <2>移动平均模型(MA模型)

    设某变量的一个观测值是由目前和以前的q个随机误差的线性回归而得

    http://images2015.cnblogs.com/blog/789211/201605/789211-20160516220226732-737692529.png
    计算MA模型的目的是求解θ的估计值,at的假设和AR模型一样

    对于AR(p)模型,如果at不是白噪声,而是MA(q)模型的形式,那么就得出了ARMA(p,q)模型
    http://images2015.cnblogs.com/blog/789211/201605/789211-20160516220237107-1927528129.png

    显然,ARMA(P,0)就是AR(p),ARMA(0,q)就是MA(q),整个模型有p+q个参数要估计。ARMA(p,q)模型的前提条件是时间序列平稳和可逆,对于不平稳的时间序列必须经过差分变换,转化为平稳的,因此平稳之后的ARMA(p,q)模型就是ARIMA(p,d,q)模型,d为差分阶数,当不需要差分时,d=0,ARIMA(p,d,q)=ARIMA(p,0,q)=ARMA(p,q),拟合ARIMA模型就是确定阶数p,d,q,由于p,q和自相关函数ACF及偏相关函数PACF有关,因此需要结合自相关图和偏相关图进行识别确定。

     

     

    STL分解法 

    STL分解法是一个兼具通用性和鲁棒性的时间序列分解法。STL是”Seasonal and Trend decomposition using Loess”的简写。 

    STL分解基于Loess(局部加权回归法),即局部加权回归散点平滑法,是1990年由密歇根大学的R. B. Cleveland教授以及AT&T Bell实验室的W. S. Cleveland等人提出来的一种对时间序列进行分解的方法。STL分解将时间序列分解成季节项、趋势项及残余项。 

    优点: 

    1.可以处理任何类型的季节变动因素的数据,而不仅仅是季度或是月份的数据

    2.季度成分可以被允许随着时间变化而变化,并且用户可以自行控制变化率

    3.用户可以自行控制趋势-周期成分的平滑度

    4.对异常值有更好的鲁棒性


    缺点: 

    1.它只适用于加法模型

    2.it does not automatically handle trading day or calendar variation

     

     

     

    Random Walk Model

    备注:该部分取自英文pdf,有些名词怕在翻译过程中翻译的不好,而失去了它原本想要表达的意思,故此部分用英文原文

    The random walk model is very simple. Without a constant, it uses the current value of the time series to forecast all future values, i.e.,

    Ft(k) = Yt   for all  k≥1

    该式子意思应该是在t+k时刻的预测值等于在t时刻的实际值

    This model is often used for data that does not have a fixed mean and for which the history of the process is irrelevant given its current position. The time series is thus equally likely to go up or down at any point in time.

    If a constant is included, then the forecast is given by

    Ft(k) = Yt+k*∆

    where ∆ estimates the average change from one period to the next. The forecast function for such a model is a straight line with slope equal to ∆ .

     

    文章中预测旧金山金洲大桥在20年间,每个月的交通量效果图

    The plot shows:

    Observed data: shown using point symbols.

    2.One-ahead forecasts: shown as a solid line passing through the data.

    3.Forecasts for future values: extension of the forecasts past the end of the data.

    4.95% prediction limits: the red bounds around the forecasts.

     

    Note the wide prediction limits, typical of random walk models.

     

     

     

    Trend Models

    The Mean, Linear Trend, Quadratic Trend, Exponential Trend, and S-Curve models all fit various types of regression models to the data, using time as the independent variable. The models are fit by least squares, resulting in estimates of up to 3 coefficients: a, b, and c. Forecasts from the models are as follows:

    Since they weight all data equally, regression models are often not the best methods for forecasting time series data.

    在本问题中,二次模型是几个中效果最好的,下面是该模型的效果图,同样是交通数据

     

    怎么选择以上四个模型:

    画图看它的趋势,如果呈线性,则用线性模型;如果有些弯曲或者呈指数型,则用二次模型或指数模型;如果是一个S形状,则用S-curve trend model

    也可以拟合四个模型,并比较它们的测量指标,如MAPE, MAD 和 MSD。 选择指标最小的模型。

     

     

    其他模型

    ARCH模型
    ARCH模型能准确地模拟时间序列变量的波动性的变化,它在金融工程学的实证研究中也应用广泛,使人们能更加准确地把握风险(波动性),尤其是应用在风险价值(Value at Risk)理论中,在华尔街是尽人皆知的工具。

    时间序列分析方法的优点
    既考虑了观测数据在时间序列上的依存性,又考虑了随机波动的干扰

    将ARCH中的方差用ARMA模型表示,则ARCH模型变形为GARCH模型

     

    机器学习中的SVR, randomForest, lasso,xgboost,在这些资料中,更多的是讲述如何使用它们,或者是做了一些小改进,但是关于适用的范围或者使用的特点的描述就比较少。

    展开全文
  • 时间序列模型(ARIMA和ARMA)完整步骤详述

    万次阅读 多人点赞 2019-05-28 14:57:27
    老师作业要求,实现ARMA和ARIMA模型的基本全过程和最后结果。 目录 所用的所有数据包 1,数据准备与预处理 ...4,时间序列定阶 (1)ACF和PACF定阶 5,构建模型和预测 (1)ARMA模型构建 (2)模型好坏检验...

    老师作业要求,实现ARMA和ARIMA模型的基本全过程和最后结果。

    目录

    所用的所有数据包

    1,数据准备与预处理

    (1)数据准备

    (2)数据预处理

    2,数据重采样

    3,平稳性和非白噪声

    (1)差分法实现

    (2)平滑法处理

    (3)ADF检验

    (4)非白噪声检验

    4,时间序列定阶

    (1)ACF和PACF定阶

    5,构建模型和预测

    (1)ARMA模型构建

    (2)模型好坏检验

    (3)ARIMA模型构建

    总结


    所用的所有数据包

    import pandas as pd
    import numpy as np
    import seaborn as sns #热力图
    import itertools 
    import datetime
    import matplotlib.pyplot as plt
    import statsmodels.api as sm 
    from statsmodels.tsa.stattools import adfuller #ADF检验
    from statsmodels.stats.diagnostic import acorr_ljungbox #白噪声检验
    from statsmodels.graphics.tsaplots import plot_acf,plot_pacf #画图定阶
    from statsmodels.tsa.arima_model import ARIMA #模型
    from statsmodels.tsa.arima_model import ARMA #模型
    from statsmodels.stats.stattools import durbin_watson #DW检验
    from statsmodels.graphics.api import qqplot #qq图

    1,数据准备与预处理

    (1)数据准备

    自己做了点数据,做数据的代码如下:

    def genertate_data():
        index = pd.date_range(start='2018-1-1',end = '2018-9-1',freq='10T')
        index = list(index)
        data_list = []
        for i in range(len(index)):
            data_list.append(np.random.randn()) 
        dataframe = pd.DataFrame({'time':index,'values':data_list})
        dataframe.to_csv('C:\\Users\\happy\\Desktop\\old_data.csv',index=0)
        print('the data is existting')
    

    然后将它保存在了old_data.csv中,然后故意去将文件夹中的某些值,改成了-10000,弄成了异常值,(因为老师说尽可能显得步骤完整,最后分数才会高-,-所以我自己手动添加异常)

    (2)数据预处理

    这块的主要工作就是利用pandas里面的函数,去查看一下刚特殊操作后的数据。

    def data_handle():
        data = pd.read_csv('C:\\Users\\happy\\Desktop\\old_data.csv')
        #print(data.describe()) #查看统计信息,发现最小值有-10000的异常数据
        #print((data.isnull()).sum()) #查看是否存在缺失值
        #print((data.duplicated()).sum()) #重复值
        def change_zero(x):
            if x == -10000:
                return 0
            else :
                return x
        data['values'] = data['values'].apply(lambda x: change_zero(x))
    
        #利用均值填充缺失值
        mean = data['values'].mean()
        def change_mean(x):
            if x == 0:
                return mean
            else:
                return x
        data['values'] = data['values'].apply(lambda x: change_mean(x))
        #保存处理过的数据
        data.to_csv('C:\\Users\\happy\\Desktop\\new_data.csv',index=0)
        print('new data is existing')

    2,数据重采样

    为了得高分(-,-),做了很多个数据,然后一共有34992个数据,然后进行了一下重采样,数据以天进行重采样。

    def Resampling(): #重采样
        df = pd.read_csv('C:\\Users\\happy\\Desktop\\new_data.csv')
         #将默认索引方式转换成时间索引
        df['time'] = pd.to_datetime(df['time'])
        df.set_index("time", inplace=True)
       
        data = df['2018-1-1':'2018-8-1'] #取18-1-1到8-1做预测
        test = df['2018-8-1':'2018-9-1']
        data_train = data.resample('D').mean()  #以一天为时间间隔取均值,重采样
        data_test = test.resample('D').mean()
    
        return data_train,data_test

    3,平稳性和非白噪声

    由于ARMA和ARIMA需要时间序列满足平稳性和非白噪声的要求,所以要用查分法和平滑法(滚动平均和滚动标准差)来实现序列的平稳性操作。一般情况下,对时间序列进行一阶差分法就可以实现序列的平稳性,有时需要二阶查分。

    (1)差分法实现

    
    def stationarity(timeseries): #平稳性处理
        #差分法(不平稳处理),保存成新的列,1阶差分,dropna() 删除缺失值
        diff1 = timeseries.diff(1).dropna() 
        diff2 = diff1.diff(1) #在一阶查分基础上做二阶查分
        
        diff1.plot(color = 'red',title='diff 1',figsize=(10,4))
        diff2.plot(color = 'black',title='diff 2',figsize=(10,4))
    

    可以看一下图

    一阶差分基本就满足了平稳性需要。

    (2)平滑法处理

        #滚动平均(平滑法不平稳处理)
        rolmean = timeseries.rolling(window=4,center = False).mean()
        #滚动标准差
        rolstd = timeseries.rolling(window=4,center = False).std()
        
    
        rolmean.plot(color = 'yellow',title='Rolling Mean',figsize=(10,4))
        rolstd.plot(color = 'blue',title='Rolling Std',figsize=(10,4))

    处理结果如图所示。

    可以看出,平滑法不太适合我造出来的数据,一般情况下,这种方法更适合带有周期性稳步上升的数据类型。

    (3)ADF检验

    除了上述两种对于时间序列的处理方法之外,还有一种以数据的方式呈现的平稳性检验方法:ADF检验。

        #ADF检验 
        x = np.array(diff1['values'])
        adftest = adfuller(x, autolag='AIC')
        print (adftest) 

    结果如下:

    如何确定该序列能否平稳呢?主要看:

    (1)1%、%5、%10不同程度拒绝原假设的统计值和ADF Test result的比较,ADF Test result同时小于1%、5%、10%即说明非常好地拒绝该假设,本数据中,adf结果为-6.9, 小于三个level的统计值。

    (2)P-value是否非常接近0.本数据中,P-value 为 7.9e-10,接近0。

    ADF结果如何查看参考了这篇博客:

    https://blog.csdn.net/weixin_42382211/article/details/81332431

    (4)非白噪声检验

        #纯随机性检验(白噪声检验)
        p_value = acorr_ljungbox(timeseries, lags=1) 
        print (p_value)

    结果如图:

                                                            

    统计量的P值小于显著性水平0.05,则可以以95%的置信水平拒绝原假设,认为序列为非白噪声序列(否则,接受原假设,认为序列为纯随机序列。)         

    由于P值为0.315远大于0.05所以接受原假设,认为时间序列是白噪声的,即是随机产生的序列,不具有时间上的相关性。(解释一下,由于老师没有给数据,所以只能硬着头皮,假设它是非白噪声的做)

    4,时间序列定阶

    定阶用到了ACF和PACF判断模型阶数、信息准则定阶(AIC、BIC、HQIC)、热力图定阶。

    (1)ACF和PACF定阶

                 直接采用步骤3的一阶差分后的数据来进行定阶操作。

    
    def determinate_order(timeseries): 
        
        #利用ACF和PACF判断模型阶数
        plot_acf(timeseries,lags=40) #延迟数
        plot_pacf(timeseries,lags=40)
        plt.show()

    结果如图所示:

                                              

                                                  

    上面分别是ACF和PACF的图,至于如何定阶不详细叙述了。一般是通过截尾和拖尾来确定阶数。目前还没有看到总结的比较好的文章。

    (2)信息准则定阶

    由于要通过ACF和PACF图来定阶,是一种看图的方法,因此可以计算AIC等值,来进行定阶。

        #信息准则定阶:AIC、BIC、HQIC
        #AIC
        AIC = sm.tsa.arma_order_select_ic(timeseries,\
            max_ar=6,max_ma=4,ic='aic')['aic_min_order']
        #BIC
        BIC = sm.tsa.arma_order_select_ic(timeseries,max_ar=6,\
               max_ma=4,ic='bic')['bic_min_order']
        #HQIC
        HQIC = sm.tsa.arma_order_select_ic(timeseries,max_ar=6,\
                     max_ma=4,ic='hqic')['hqic_min_order']
        print('the AIC is{},\nthe BIC is{}\n the HQIC is{}'.format(AIC,BIC,HQIC))

    一般都是一个一个运行,最好不要一起运行,结果出来的太慢了。

    (3)热力图定阶

    其实热力图定阶的方式和(2)信息准则定阶的方式类似,只是用热力图的方式呈现了。

        #设置遍历循环的初始条件,以热力图的形式展示,跟AIC定阶作用一样
        p_min = 0
        q_min = 0
        p_max = 5
        q_max = 5
        d_min = 0
        d_max = 5
        # 创建Dataframe,以BIC准则
        results_aic = pd.DataFrame(index=['AR{}'.format(i) \
                                   for i in range(p_min,p_max+1)],\
                columns=['MA{}'.format(i) for i in range(q_min,q_max+1)])
        # itertools.product 返回p,q中的元素的笛卡尔积的元组
        for p,d,q in itertools.product(range(p_min,p_max+1),\
                                       range(d_min,d_max+1),range(q_min,q_max+1)):
            if p==0 and q==0:
                results_aic.loc['AR{}'.format(p), 'MA{}'.format(q)] = np.nan
                continue
            try:
                model = sm.tsa.ARIMA(timeseries, order=(p, d, q))
                results = model.fit()
                #返回不同pq下的model的BIC值
                results_aic.loc['AR{}'.format(p), 'MA{}'.format(q)] = results.aic
            except:
                continue
        results_aic = results_aic[results_aic.columns].astype(float)
        #print(results_bic)
        
        fig, ax = plt.subplots(figsize=(10, 8))
        ax = sns.heatmap(results_aic,
                     #mask=results_aic.isnull(),
                     ax=ax,
                     annot=True, #将数字显示在热力图上
                     fmt='.2f',
                     )
        ax.set_title('AIC')
        plt.show() 

    图如下所示:

                                       

    黑色的位置最好,可以看出p,q取(1,1)(3,1)(1,4)都可以。一般情况下是越小越好。

    热力图实现过程参考了下面这篇博客(找不见了=,=)如果有侵权,请告知,会删除博文。

    5,构建模型和预测

    (1)ARMA模型构建

    def ARMA_model(train_D,train,test,order):
        arma_model = ARMA(train,order) #ARMA模型
        result = arma_model.fit()#激活模型
        #print(result.summary()) #给出一份模型报告
        ############ in-sample ############
        pred = result.predict()
        
        #pred.plot()
        #train.plot()
        #print('标准差为{}'.format(mean_squared_error(train,pred)))
        
        #残差
        resid = result.resid 
        #利用QQ图检验残差是否满足正态分布
        plt.figure(figsize=(12,8))
        qqplot(resid,line='q',fit=True)
        #利用D-W检验,检验残差的自相关性
        print('D-W检验值为{}'.format(durbin_watson(resid.values)))

     说明:train_D是重采样之后的数据,train是一阶查分后的,test是train样本外的数据,order给的是(1,1)通过定阶得到的。

    以上都是通过参数传递进来的,没有在里面写。

    预测过程有两种预测方式,一种是样本内的预测,一种是样本外的预测。意思就是,一个是根据train数据集的时间,在这个时间段内进行预测;样本外预测就是train的是2018-1-1到8-1的,但是要预测的是8-1到9-1的情况,是out-sample预测,一般情况下,out-sample是我们想要的,而不是样本内的预测。样本外的预测代码如下:

        pred_one = result.predict(start=len(train)-5,end = len(train)+30, \
                                  dynamic=True)
        #print(pred_one)
        #print(len(test))
        #print(pred_one[6:-1])
        #pred_one.plot()
        #test.plot()
        print('标准差为{}'.format(mean_squared_error(test,pred_one[6:-1],sample_weight=None,\
            multioutput='uniform_average'))) #标准差(均方差)

    预测为样本内外是由dynamic参数决定的,特别注意:样本外的预测也要从样本内的某一个时间点开始才能进行预测。

    在求解标准差的时候,要注意数据对齐。

    (2)模型好坏检验

        #残差
        resid = result.resid 
        #利用QQ图检验残差是否满足正态分布
        plt.figure(figsize=(12,8))
        qqplot(resid,line='q',fit=True)
        #利用D-W检验,检验残差的自相关性
        print('D-W检验值为{}'.format(durbin_watson(resid.values)))

    用残差来检验模型的好坏,上述代码在创建模型里面面已经写过了,

    qq图如下所示:                   

                                                     

               通过qq图可以看出,残差基本满足了正态分布。

               D-W检验结果为:

                                                            

             当D-W检验值接近于2时,不存在自相关性,说明模型较好。

             D-W检验如何数学说明,可以参考下面链接。

             https://wenku.baidu.com/view/57224dcfcf84b9d528ea7aba.html

    (3)ARIMA模型构建

    创建模型的代码基本同上,只不过ARIMA有三个参数:p,d,q。其中p和q可以参考定阶的方法确定。d指的是用了多少阶差分,在我的模型中运用了一阶差分,因此d=1。

    由于预测都是针对的差分法后的数据做的预测,但是真实数据并不是那样的,因此我还对差分后的数据进行还原操作。

    看一下通过预测与实际真实值对比,模型到底是否很好。

    def string_toDatetime(string):
        return  datetime.datetime.strptime(string, "%Y-%m-%d %H:%M:%S")
    
    def ARIMA_model(train_H,train,test):
        arima_model = ARIMA(train,order =(1,1,1)) #ARIMA模型
        result = arima_model.fit()
        #print(result.summary()) #给出一份模型报告
        ########得到训练集的预测时间序列#########
        pred = result.predict()
        
        #######还原#########
        ##2018-8-1 00:00 到 2018-9-1 00:00 ###
        #将差分后的序列还原,pred_restored为还原之后
        idx = pd.date_range(string_toDatetime('2018-8-1 00:00:00'),periods=len(pred[4:20]),freq='D')
        pred_list= []
        for i in range(len(pred[4:20])):
            pred_list.append(np.array(pred)[i+4])
        pred_numpy = pd.Series(np.array(pred_list),index=idx)    
        
        pred_restored = pd.Series(np.array(train_H)[5][0],\
             index=[train_H.index[5]]).append(pred_numpy).cumsum()
        x1 = np.array(pred_restored)
        x2 = np.array(train_H[5:22])
        y = []
        for i in range(len(pred_restored)):
            y.append(i+1)
        y = np.array(y)
        fig1 = plt.figure(num=2, figsize=(10,4),dpi=80)
        plt.plot(y,x1,color='blue')
        plt.plot(y,x2,color='red')
        plt.ylim(0,0.8)
        plt.show()

    代码里面对差分法后的进行还原,主要是下面这行代码:

        pred_restored = pd.Series(np.array(train_H)[5][0],\
             index=[train_H.index[5]]).append(pred_numpy).cumsum()

    主要用到了的是cumsum()这个函数,这个函数作用不再赘述,自行百度吧。

    总结

    关于ARMA和ARIMA模型,从数据处理到最后建模实现,就完成了。

    但是,里面其实有一个很大的问题,就是当数据不是平稳性的数据的时候,用到了差分法进行处理,用到了dropna()这个函数,这个函数的意思是去掉序列中nan(在这个了里面是0)。因此当序列中两列相邻值相等时,就会去掉前面那一列,因此处理后的数据可能不是按照每一天的数据分布的,但是预测出来的是每一天都存在的。

    如果不加dropna()这个函数的话,定阶那些都会报错(错误信息是存在nan值),但是模型不会报错。因此这块是一个存在的问题,还亟待处理,但是我看了很多的文章,对于这里好像没有过多深入的研究。

    整篇博客都是代码实现的,具体的数学公式,自行百度吧~~

    展开全文
  • 时间序列模型 (二):移动平均法

    万次阅读 多人点赞 2019-04-21 22:18:52
    时间序列的其它博文系列: 时间序列模型 (一):模型概述 ...时间序列模型 (六):平稳时间序列模型 :自回归AR 、移动平均 MA 、ARMA 模型 时间序列模型 (七): 时间序列建模的基本步骤 目录 移动平均法 ...

    时间序列的其它博文系列:

    时间序列模型 (一):模型概述

    时间序列模型 (二):移动平均法

    时间序列模型 (三):指数平滑法

    时间序列模型 (四):差分指数平滑法、 自适应滤波法v

    时间序列模型 (五): 趋势外推预测方法

    时间序列模型 (六):平稳时间序列模型 :自回归AR 、移动平均 MA 、ARMA 模型

    时间序列模型 (七): 时间序列建模的基本步骤



    目录

    移动平均法

    简单移动平均法

    加权移动平均法

    趋势移动平均法


    移动平均法 可以作为一种数据平滑的方式 ,以每天的气温数据为例,今天的天气可能与过去的十天的气温有线性关系;或者有的人对食物有一种节俭的美德,他们做的饭菜能看出有些是上一顿的,当然也有一部分是今天的做的,再假设隔两顿的都被倒掉了,并且每天都是这样的,那么这碗饭菜可能就是一部分上一顿的再加上一部分今天现做的,这就是一个一阶的移动平均。

    移动平均法

    移动平均法是根据时间序列资料逐渐推移,依次计算包含一定项数的时序平均数, 以反映长期趋势的方法。当时间序列的数值由于受周期变动和不规则变动的影响,起伏 较大,不易显示出发展趋势时,可用移动平均法,消除这些因素的影响,分析、预测序列的长期趋势。  移动平均法有简单移动平均法,加权移动平均法,趋势移动平均法等。 

    简单移动平均法

    近N 期序列值的平均值作为未来各期的预测结果。一般 N 的取值范围: 5≤N≤ 200。当历史序列的基本趋势变化不大且序列中随机变动成分较多时,N 的 取值应较大一些。否则 N 的取值应小一些。在有确定的季节变动周期的资料中,移动平均的项数应取周期长度。选择佳 N 值的一个有效方法是,比较若干模型的预测误 差。预测标准误差小者为好。 

    简单移动平均法只适合做近期预测,而且是预测目标的发展趋势变化不大的情况。 如果目标的发展趋势存在其它的变化,采用简单移动平均法就会产生较大的预测偏差和滞后。 

    例 1  某企业 1 月~11 月份的销售收入时间序列如表 1 示。试用一次简单滑动平 均法预测第 12 月份的销售收入。 

    计算的 Matlab 程序如下: 

    clc,clear 
    y=[533.8  574.6  606.9  649.8   705.1  772.0  816.4  892.7  963.9  1015.1  1102.7]; m=length(y);   
     n=[4,5];   %n 为移动平均的项数 
    for i=1:length(n)    
     %由于 n 的取值不同,yhat 的长度不一致,下面使用了细胞数组    
        for j=1:m-n(i)+1         
            yhat{i}(j)=sum(y(j:j+n(i)-1))/n(i);     
        end    
        y12(i)=yhat{i}(end);     
        s(i)=sqrt(mean((y(n(i)+1:m)-yhat{i}(1:end-1)).^2)); 
    end 
    y12,s 
     

     

    加权移动平均法

    在简单移动平均公式中,每期数据在求平均时的作用是等同的。但是,每期数据所包含的信息量不一样,近期数据包含着更多关于未来情况的信心。因此,把各期数据等同看待是不尽合理的,应考虑各期数据的重要性对近期数据给予较大的权重,这就 是加权移动平均法的基本思想。 

    例 2  我国 1979~1988 年原煤产量如表 2 所示,试用加权移动平均法预测 1989 年 的产量

    计算的 MATLAB 程序如下: 

    y=[6.35 6.20    6.22    6.66    7.15    7.89    8.72    8.94    9.28    9.8]; 
    w=[1/6;2/6;3/6]; 
    m=length(y);n=3; 
    for i=1:m-n+1     
        yhat(i)=y(i:i+n-1)*w; 
    end 
    yhat 
    err=abs(y(n+1:m)-yhat(1:end-1))./y(n+1:m) 
    T_err=1-sum(yhat(1:end-1))/sum(y(n+1:m)) 
    y1989=yhat(end)/(1-T_err)

     在加权移动平均法中, \small w_{t} 的选择,同样具有一定的经验性。一般的原则是:近期 数据的权数大,远期数据的权数小。至于大到什么程度和小到什么程度,则需要按照预 测者对序列的了解和分析来确定。 

    趋势移动平均法

    简单移动平均法和加权移动平均法,在时间序列没有明显的趋势变动时,能够准确 反映实际情况。但当时间序列出现直线增加或减少的变动趋势时,用简单移动平均法和 加权移动平均法来预测就会出现滞后偏差。因此,需要进行修正,修正的方法是作二次 移动平均,利用移动平均滞后偏差的规律来建立直线趋势的预测模型。这就是趋势移动平均法。  一次移动的平均数为 

    例 3  我国 1965~1985 年的发电总量如表 3 所示,试预测 1986 年和 1987 年的发 电总量。 

    解  由散点图 1 可以看出,发电总量基本呈直线上升趋势,可用趋势移动平均法 来预测。 

    计算的 MATLAB 程序如下: 

    clc,clear 
    load y.txt   %把原始数据保存在纯文本文件 y.txt 中 
    m1=length(y);    
    n=6;   %n 为移动平均的项数 
    for i=1:m1-n+1     
        yhat1(i)=sum(y(i:i+n-1))/n; 
    end 
    yhat1 
    m2=length(yhat1); 
    for i=1:m2-n+1    
        yhat2(i)=sum(yhat1(i:i+n-1))/n; 
    end 
    yhat2   
    plot(1:21,y,'*') 
    a21=2*yhat1(end)-yhat2(end) 
    b21=2*(yhat1(end)-yhat2(end))/(n-1) 
    y1986=a21+b21 
    y1987=a21+2*b21 

    趋势移动平均法对于同时存在直线趋势与周期波动的序列,是一种既能反映趋势变 化,又可以有效地分离出来周期变动的方法。 


    时间序列的其它博文系列:

    时间序列模型 (一):模型概述

    时间序列模型 (二):移动平均法

    时间序列模型 (三):指数平滑法

    时间序列模型 (四):差分指数平滑法、 自适应滤波法v

    时间序列模型 (五): 趋势外推预测方法

    时间序列模型 (六):平稳时间序列模型 :自回归AR 、移动平均 MA 、ARMA 模型

    时间序列模型 (七): 时间序列建模的基本步骤

    展开全文
  • 时间序列模型Prophet使用详细讲解

    万次阅读 多人点赞 2018-10-26 20:39:34
    默认情况下,只有在时间序列的前80%才会推断出突变点,以便有足够的长度来预测未来的趋势,并避免在时间序列的末尾出现过度拟合的波动。这个默认值可以在很多情况下工作,但不是所有情况下都可以,可以使用 change...
  • 数学建模之时间序列模型及其应用

    千次阅读 多人点赞 2020-08-12 21:38:42
    时间序列模型就是将预测对象按照时间顺序排列起来,用这一组时间序列过去的变化规律,推断今后变化的可能性及变化趋势、变化规律。 时间序列模型也是一种回归模型,其一方面承认事物发展的延续性,运用过去的数据来推测...
  • 本文大量参考了预测类问题与时间序列 时间序列的四个特性 时间序列:某个物理量对时间的函数。 拿到一个时间序列,可以从四个角度去认识和挖掘它: 1:随机vs确定 可由外界的变化而确定,也可以是因为有复杂的...
  • 时间序列模型学习笔记(一)

    千次阅读 2017-03-28 22:58:41
    时间序列模型学习笔记(一)1.时间序列的预处理时间序列的预处理是对一个观察值序列的纯随机性和平稳性进行检验,根据检验结果可以将此序列分为不同的类型,纯随机序列也称为白噪声序列,是没有任何信息可以提取的平稳...
  • 时间序列模型之相空间重构

    万次阅读 多人点赞 2015-10-10 13:20:21
    时间序列模型之相空间重构
  • 1 概念 ARIMA模型,全称为自回归积分滑动平均模型(Autoregressive ...ARIMA模型是指在将非平稳时间序列转化为平稳时间序列过程中,将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型。 ...
  • 基于时间序列模型的预测

    千次阅读 2017-06-22 21:54:36
    时间序列预测 自相关与偏自相关 读取数据 可视化数据 稳定时间序列 ARIMA模型 可视化时间序列预测 在需要考虑季节性上的模型使用SARIMA模型 SARIMA模型 Jupyter 设置 In [1]: %%...
  • 机器学习之时间序列模型

    千次阅读 2020-04-03 11:25:57
    一、时间序列概念 在生产和科学研究中,对某一个或一组变量x(t)进行观察测量,将在一系列时刻t1, t2, …, tn (t为自变量)按照时间次序排列,并用于解释变量和相互关系的数学表达式。在相等的时间间隔内收集到的不同...
  • 时间序列模型之灰度模型

    万次阅读 2015-11-01 01:12:15
    灰度模型使用等时间距观测到的数据值来构造灰色预测模型,从而达到能够预测未来某一时刻的数值的目的。 尽管灰度系统的现象不够清楚,内部的结构并不为人所知,数据是杂乱的,但是却是互相关联的,有整体功效的,...
  • 时间序列模型步骤教程(ARIMA)

    千次阅读 2020-10-29 19:17:17
    时间序列的分析的步骤是先对数据进行平稳性和非白噪声检验(如不满足需对数据进行平滑或差分等预处理),然后才是模型调参跟预测,因此本文分为2大部分介绍,答题思路见脑图。 一、数据准备&探索 1、平稳性 ...
  • 【算法原理】时间序列模型ARIMA

    千次阅读 2020-03-14 16:33:43
    时间序列模型主要用来预测,若平稳性都无法保证,何来预测? 2. 差分 举例来说:一阶差分就是XtX_tXt​与Xt−1X_{t-1}Xt−1​时刻的差值。二阶差分就是在一阶差分完成后,在进行一次一阶差分的操作。 差分...
  • 时间序列预测模型

    千次阅读 2019-06-10 10:07:24
    时间序列预测模型 时间序列分析模型建立了 观察结果 与 时间变化 的关系,能帮我们预测未来一段时间内的结果变化情况。 时间序列和逻辑回归的区别 首先,在选择模型前,我们需要确定结果与变量之间的关系。 回归分析...
  • 时间序列预测常见模型总结

    千次阅读 2019-09-08 09:59:29
    按照研究对象可分为一元时间序列、多元时间序列; 按照连续性可分为离散时间序列、连续时间序列; 按照统计特性分为平稳时间序列、非平稳时间序列。其中,序列概率分布与时间无关,则称该序列为狭义平稳时间序列;...
  • 序列模型】第一课--循环序列模型

    千次阅读 2018-05-04 15:17:39
    课程来源:吴恩达 深度学习课程 《序列模型》 笔记整理:王小草 时间:2018年4月28日 吴恩达的课程一直是我深爱喜绝的,深入浅出,10分钟可以讲完一个可能要一个小时或者半天理解的知识点,并且讲得老少都懂,...
  • 时间序列常用模型

    千次阅读 2019-09-29 01:30:44
    1、自回归模型(英语:Autoregressive model,简称AR模型),是统计上一种处理时间序列的方法。 或者也可为 其中: c是常数项;被假设为平均数等于0,标准差等于的随机误差值;被假设为对于任何的t都不变。...
  • 时间序列之ARIMA模型原理

    千次阅读 2019-04-18 22:55:50
    时间序列模型的意义: 在经典的回归模型中,主要是通过回归分析来建立不同变量之间的函数关系(因果关系),以考察事物之间的联系。本案例要讨论如何利用时间序列数据本身建立模型,以研究事物发展自身的规律,并...
  • 时间序列分析——ARIMA模型

    千次阅读 2018-02-28 18:07:10
    指数平滑法对时间序列上连续的值之间的相关性没有要求。但是,如果你想使用指数平滑法计算出预测区间, 那么预测误差必须是不相关的, 且必须是服从零均值、 方差不变的正态...时间序列模型通常适用于做短期预测,即...
  • 卷积神经网络模型(CNN)可以应用于时间序列预测。有许多类型的CNN模型可用于每种特定类型的时间序列预测问题。在本介绍了在以TF2.1为后端的Keras中如何开发用于时间序列预测的不同的CNN模型。这些模型是在比较小的...
  • 时间序列模型优化

    千次阅读 2019-04-24 20:16:39
    这通过右下角的自相关(即相关图)来证实,这表明时间序列残差与其本身的滞后版本具有低相关性。 7、fbprophet框架 时间序列受四种成分影响: 趋势:宏观、长期、持续性的作用力,比如我国房地产价格...
  • 01引言上一篇推文【Python量化基础】时间序列的自相关性与平稳性着重介绍了时间序列的一些基础概念,包括自相关性、偏自相关性、白噪声和平稳性,以及Python的简单实现...
  • 时间序列预测模型笔记

    千次阅读 2019-08-29 11:07:21
    详细解释时间序列预测模型相关基础概念:差分、白噪声、残差序列、ADF结果如何查看、pq值如何确定。ARIMA模型具体实现步骤。
  • 时间序列预测模型ARIMA浅析

    千次阅读 2019-09-27 17:20:20
    本文聊聊arima模型。ARIMA是一种比较常用的基于历史数据来做预测的时间序列模型。时间序列在商业中有很多应用,比如它可以解释销售中的季节性规律;可以预测新客或流失客户...
  • 1、绘制拟合曲线由前两章可知,时间序列分析模型为: Yt=0.9711×Yt−1−0.2664×ut−0.0793×ut−2+utY_t=0.9711\times Y_{t-1}-0.2664\times u_t-0.0793\times u_{t-2}+u_t 下面根据该模型来绘制拟合曲线,并...
  • R语言 时间序列ARIMA模型方法

    万次阅读 多人点赞 2017-02-17 14:17:03
     ARIMA:全称为自回归积分滑动平均模型(Autoregressive Integrated Moving Average Model,简记ARIMA),是由博克思(Box)和詹金斯(Jenkins)于70年代初提出一著名时间序列预测方法 ,所以又称为box-jenkins模型、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 123,069
精华内容 49,227
关键字:

时间序列模型的选择标准