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

目录
相关文章
|
27天前
|
机器学习/深度学习 数据采集 算法
时间序列结构变化分析:Python实现时间序列变化点检测
在时间序列分析和预测中,准确检测结构变化至关重要。新出现的分布模式往往会导致历史数据失去代表性,进而影响基于这些数据训练的模型的有效性。
43 1
|
2月前
|
机器学习/深度学习 算法 数据挖掘
6种有效的时间序列数据特征工程技术(使用Python)
在本文中,我们将探讨使用日期时间列提取有用信息的各种特征工程技术。
106 0
|
28天前
|
机器学习/深度学习 索引 Python
python之序列
python之序列
139 59
|
15天前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
60 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
19天前
|
机器学习/深度学习 数据采集 算法
数据稀缺条件下的时间序列微分:符号回归(Symbolic Regression)方法介绍与Python示例
有多种方法可以处理时间序列数据中的噪声。本文将介绍一种在我们的研究项目中表现良好的方法,特别适用于时间序列概况中数据点较少的情况。
31 1
数据稀缺条件下的时间序列微分:符号回归(Symbolic Regression)方法介绍与Python示例
|
12天前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
30 4
|
10天前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
21 1
|
1月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
16天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
20 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
2月前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业
下一篇
无影云桌面