一文速学-时间序列分析算法之移动平均模型(MA)详解+Python实例代码

简介: 一文速学-时间序列分析算法之移动平均模型(MA)详解+Python实例代码

前言


有一段时间没有继续更新时间序列分析算法了,传统的时间序列预测算法已经快接近尾声了。按照我们系列文章的讲述顺序来看,还有四个算法没有提及:

9cad461ba9954d4c9a1f3d455bf624d0.png平稳时间序列预测算法都是大头,比较难以讲明白。但是这个系列文章如果从头读到尾,细细品味研究的话,会发现时间序列预测算法从始至终都在做一件事,也就是如何更好的利用到历史数据,挖掘历史数据中蕴含的周期性规律或者是趋势。在看完这个系列的上述文章要理解平稳时间序列预测算法并不是一件难事,真正难的是原理和推导,以及实际起来运用方式,这是十分重要的。关键还是在于如何理解此类算法,好了就让我们开始一步一步完成此算法的推导以及代码编写到实际案例的运用。


博主会长期维护博文,有错误或者疑惑可以在评论区指出,感谢大家的支持。


一、移动平均模型(MA)


移动平均模型MA是和自回归模型AR多少是有点联系的,它并非是历史时序值的线性组合而是历史白噪声的线性组合。与AR最大的不同之处在于,AR模型中历史白噪声的影响是间接影响当前预测值的(通过影响历史时序值)。AR模型是把随机部分简化,保留历史序列部分,那么对偶地,MA模型是将历史序列值简化,保留随机部分。


我们通过原理和公式与AR模型进行对比,就能更好的理解MA模型。


模型原理


根据我们上篇文章的基础内容和AR模型的讲解:时间序列分析算法之平稳时间序列预测算法和自回归模型(AR)详解+Python代码实现


自回归


自回归只适用于预测与自身前期相关的现象,数学模型表达式如下:


0c38733fff3845e2b4cec998a0d08421.png


其中是bb43b299481c47759f19b4ca352deefd.png当前值,4874e895ffc94d24ac1496e833a2f907.png是常数项,e3401fd4fbb84aa68ed3c77d3ebf7528.png是阶数,24e37eaf545142348d2072efcd792e68.png是自相关系数,c056c513017046b0b1484f17ad706b7b.png是误差,同时

7432d326a3a346959982b47734253db6.png要符合正态分布。该模型反映了在t时刻的目标值值与前t-1~p个目标值之前存在着一个线性关系,即:


78cf6bd1569b4fa6bcadf0c1e667bf31.png

移动平均模型


移动平均模型(MA)关注的是自回归模型中的误差项的累加,数学模型表达式如下:


624ee1f59fae4eb288e066dc24a15887.png


该模型反映了在t时刻的目标值值与前t-1~p个误差值之前存在着一个线性关系,即:


4323aa01e0bc4131b55515a81f23542f.png

对两边求期望方差,可以得到:


1a6ec38c7c924553a6e9e7eae55ada31.png17a2f316bbe242a1b9447f7d39d82093.png

MA模型总是弱平稳的。特别的,4874e895ffc94d24ac1496e833a2f907.png=0,成为中心化MA(q)模型

自相关系数

2d5a09b98c16446da8d89ea28f2b16bf.png


MA模型的自相关系数是q阶截尾的。


常用的 MA 模型的自相关系数

通用:


98e0954b612441309c07b1bb0b47d2bf.png



MA(1)模型


865532ceb1fe4c5bbf942e7e000c60f7.png


MA(2)模型

769c97d7526d495c8356550a41c10b71.png



自协方差函数

7746887623ec4240872774d65ba429f4.png


二、Python案例实现


平稳时间序列建模步骤


由AR模型、MA模型和ARMA模型的 自相关系数和偏自相关系数 的性质,选择出合适的模型。


AR、MA和ARMA模型自相关系数和偏自相关系数的性质如下:


image.png


002e6e422e0b4067aa1901832d5cab61.png



平稳性检验


单位根检验(Unit Root Test)单位根检验是针对宏观经济数据序列、货币金融数据序列中是否具有某种统计特性而提出的一种平稳性检验的特殊方法,单位根检验的方法有很多种,包括ADF检验、PP检验、NP检验等。

#导入包
from statsmodels.tsa.stattools import adfuller
def test_stationarity(timeseries):
    #Determing rolling statistics 
    rolmean=timeseries.rolling(7).mean()
    rolstd=timeseries.rolling(7).std()
    #Plot rolling statistics:
    orig=plt.plot(timeseries,color='blue',label='Original') 
    mean=plt.plot(rolmean,color='red',label='Rolling Mean') #均值
    std=plt.plot(rolstd,color='black',label='Rolling Std') #标准差
    plt.legend(loc='best')
    plt.title('Rolling Mean & Standard Deviation')
    plt.show(block=False)
    #Perform Dickey-Fuller Test:
    print('Results of Dickey-Fuller Test:')
    dftest=adfuller(timeseries,autolag='AIC')
    dfoutput=pd.Series(dftest[0:4],index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
    for key,value in dftest[4].items():
        dfoutput['Critical Value (%s)'%key]=value 
    print(dfoutput)
#检验结果
test_stationarity(df_test['客流量'])

6a1d4f61501c471caf455492334b5268.png


Results of Dickey-Fuller Test:

Test Statistic                  -4.608773

p-value                          0.000124

#Lags Used                      15.000000

Number of Observations Used    483.000000

Critical Value (1%)             -3.443962

Critical Value (5%)             -2.867543

Critical Value (10%)            -2.569967

dtype: float64


输出内容解析:


ADF:float,测试统计。

pvalue:float,probability value:MacKinnon基于MacKinnon的近似p值(1994年,2010年)。

usedlag:int,使用的滞后数量。

NOBS:int,用于ADF回归和计算临界值的观察数。

critical values:dict,测试统计数据的临界值为1%,5%和10%。基于MacKinnon(2010)。

icbest:float,如果autolag不是None,则最大化信息标准。

resstore:ResultStore, optional,一个虚拟类,其结果作为属性附加

Returns
    -------
    adf : float
        The test statistic.
    pvalue : float
        MacKinnon"s approximate p-value based on MacKinnon (1994, 2010).
    usedlag : int
        The number of lags used.
    nobs : int
        The number of observations used for the ADF regression and calculation
        of the critical values.
    critical values : dict
        Critical values for the test statistic at the 1 %, 5 %, and 10 %
        levels. Based on MacKinnon (2010).
    icbest : float
        The maximized information criterion if autolag is not None.
    resstore : ResultStore, optional
        A dummy class with results attached as attributes.

补充说明:


该模型要求序列必须是平稳的时间序列数据。通过分析t值,分析其是否可以显著地拒绝序列不平稳的原假设


若呈现显著性(p<0.05或0.01),则说明拒绝原假设,该序列为一个平稳的时间序列,反之则说明该序列为一个不平稳的时间序列


临界值(1%、5%、10%不同程度拒绝原假设的统计值)和ADF Test result的比较,ADF Test result同时小于1%、5%、10%即说明非常好地拒绝该假设


Lag值:最优的滞后阶数


差分阶数:本质上就是下一个数值 ,减去上一个数值,主要是消除一些波动使数据趋于平稳,非平稳序列可通过差分变换转化为平稳序列


AIC值:衡量统计模型拟合优良性的一种标准,数值越小越好


临界值:临界值是对应于一个给定的显着性水平的固定值


该序列检验的结果显示,基于字段客流量:

在差分为0阶时,显著性P值为0.000**,水平上呈现显著性,拒绝原假设,该序列为平稳的时间序列。


MA预测模型


数据经过调整后,一般有两种情况:

1)严格平稳序列,各值之间不存在相关性,这是我们可以对残差的白噪声进行建模的一个简单的例子。但非常罕见。

2)值之间有显著相关性的序列。需要使用一些统计模型。

移动平均模型关注的是自回归模型中的误差项的累加。它能够有效地消除预测中的随机波动。


消除趋势和季节性变化


差分Differencing


取某一时刻的观测值与前一时刻的观测值之差。


分解Decomposition


对趋势和季节性进行建模,并将其从模型中移除

取某一时刻的观测值与前一时刻的观测值之差:


df_diff=df_test['客流量']-df_test['客流量'].shift()
df_diff.dropna(inplace=True)
test_stationarity(df_diff)

5d8bc7ce07084123b95cd699b3ef95e0.png


ACF自协方差和PACF偏自相关函数


ACF:时间序列Xt的自协方差是信号与其经过时间平移的信号之间的协方差。例如将t1,t2与t1-5和t2-5 相比。将有序的随机变量序列与其自身相比较,它反映了同一序列在不同时序的取值之间的相关性。

PACF:偏自相关函数(PACF)计算的是严格的两个变量之间的相关性,是剔除了中间变量的干扰之后所得到的两个变量之间的相关程度。对于一个平稳的AR§模型,求出滞后为k的自相关系数p(k)时,实际所得并不是x(t)与x(t-k)之间的相关关系。这是因为在这两个变量之间还存在k-1个变量,它们会对这个自相关系数产生一系列的影响,而这个k-1个变量本身又是与x(t-k)相关的。这对自相关系数p(k)的计算是一个不小的干扰。而偏自相关函数可以剔除这些干扰。


#ACF and PACF plots:
from statsmodels.tsa.stattools import acf,pacf
lag_acf=acf(df_diff,nlags=20)
lag_pacf=pacf(df_diff,nlags=20,method='ols')
#Plot ACF:
plt.subplot(121)
plt.plot(lag_acf)
plt.axhline(y=0,linestyle='--',color='gray')
plt.axhline(y=-1.96/np.sqrt(len(df_diff)),linestyle='--',color='gray')
plt.axhline(y=1.96/np.sqrt(len(df_diff)),linestyle='--',color='gray')
plt.title('Autocorrelation Function')
#Plot PACF:
plt.subplot(122)
plt.plot(lag_pacf)
plt.axhline(y=0,linestyle='--',color='gray')
plt.axhline(y=-1.96/np.sqrt(len(df_diff)),linestyle='--',color='gray')
plt.axhline(y=1.96/np.sqrt(len(df_diff)),linestyle='--',color='gray')
plt.title('Partial Autocorrelation Function')
plt.tight_layout()

56a5395e1b81469f8734be5690c2a3da.png

在这个图上,两条在0附近的虚线是置信区间,可以用来决定’p’和‘q’


模型建立


df_diff=df_test['客流量']-df_test['客流量'].shift()
import statsmodels.api as sm
model = sm.tsa.arima.ARIMA(df_test['客流量'],order=(0,1,2))
results_MA=model.fit()
plt.plot(df_diff)
plt.plot(results_MA.fittedvalues,color='red')
plt.title('RSS: %.4f'% ((results_MA.fittedvalues-df_diff)**2).sum())
print((results_MA.fittedvalues-df_diff).sum())

4057a01c196d4c7dafea3e711d65be70.png


MA与AR模型的对比

dafdfda1dcd74417a4277838b6d6004e.png

目录
相关文章
|
3天前
|
机器学习/深度学习 数据采集 供应链
使用Python实现智能食品消费需求分析的深度学习模型
使用Python实现智能食品消费需求分析的深度学习模型
37 21
|
5天前
|
机器学习/深度学习 数据采集 搜索推荐
使用Python实现智能食品消费偏好预测的深度学习模型
使用Python实现智能食品消费偏好预测的深度学习模型
38 23
|
6天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费习惯预测的深度学习模型
使用Python实现智能食品消费习惯预测的深度学习模型
38 19
|
3天前
|
数据可视化 算法 数据挖掘
Python量化投资实践:基于蒙特卡洛模拟的投资组合风险建模与分析
蒙特卡洛模拟是一种利用重复随机抽样解决确定性问题的计算方法,广泛应用于金融领域的不确定性建模和风险评估。本文介绍如何使用Python和EODHD API获取历史交易数据,通过模拟生成未来价格路径,分析投资风险与收益,包括VaR和CVaR计算,以辅助投资者制定合理决策。
31 15
|
7天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费趋势分析的深度学习模型
使用Python实现智能食品消费趋势分析的深度学习模型
50 18
|
4天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费模式预测的深度学习模型
使用Python实现智能食品消费模式预测的深度学习模型
21 2
|
7月前
|
算法 编译器 开发者
如何提高Python代码的性能:优化技巧与实践
本文探讨了如何提高Python代码的性能,重点介绍了一些优化技巧与实践方法。通过使用适当的数据结构、算法和编程范式,以及利用Python内置的性能优化工具,可以有效地提升Python程序的执行效率,从而提升整体应用性能。本文将针对不同场景和需求,分享一些实用的优化技巧,并通过示例代码和性能测试结果加以说明。
|
1月前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
46 2
|
3月前
|
人工智能 数据挖掘 数据处理
揭秘Python编程之美:从基础到进阶的代码实践之旅
【9月更文挑战第14天】本文将带领读者深入探索Python编程语言的魅力所在。通过简明扼要的示例,我们将揭示Python如何简化复杂问题,提升编程效率。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往高效编码世界的大门。让我们开始这段充满智慧和乐趣的Python编程之旅吧!
|
2月前
|
大数据 Python
Python 高级编程:深入探索高级代码实践
本文深入探讨了Python的四大高级特性:装饰器、生成器、上下文管理器及并发与并行编程。通过装饰器,我们能够在不改动原函数的基础上增添功能;生成器允许按需生成值,优化处理大数据;上下文管理器确保资源被妥善管理和释放;多线程等技术则助力高效完成并发任务。本文通过具体代码实例详细解析这些特性的应用方法,帮助读者提升Python编程水平。
111 5