一文速学-时间序列分析算法之移动平均模型(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

目录
相关文章
|
9天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
6天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
21 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
6天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
26 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
11天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
18天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
62 7
|
17天前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
27 3
|
17天前
|
机器学习/深度学习 人工智能 算法
青否数字人声音克隆算法升级,16个超真实直播声音模型免费送!
青否数字人的声音克隆算法全面升级,能够完美克隆真人的音调、语速、情感和呼吸。提供16种超真实的直播声音模型,支持3大AI直播类型和6大核心AIGC技术,60秒快速开播,助力商家轻松赚钱。AI讲品、互动和售卖功能强大,支持多平台直播,确保每场直播话术不重复,智能互动和真实感十足。新手小白也能轻松上手,有效规避违规风险。
|
18天前
|
存储 机器学习/深度学习 算法
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第26天】NumPy和SciPy是Python科学计算领域的两大核心库。NumPy提供高效的多维数组对象和丰富的数学函数,而SciPy则在此基础上提供了更多高级的科学计算功能,如数值积分、优化和统计等。两者结合使Python在科学计算中具有极高的效率和广泛的应用。
33 2
|
18天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
22天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
66 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型