要理解ARMA模型,我们首先得明白它是两个模型的大杂烩——自回归模型(AR)和平均移动模型(MA)。自回归模型就像是我们在猜测一个人的未来,会参考他的过去; 平均移动模型则更像是在分析一个人的情绪波动,他现在的心情可能受之前一段时间内情绪的影响。
我们可以用种花的例子来形象理解一下。你有一个花园,你想预测明年的花会开得怎么样。自回归就好比你去翻看过去几年的花开记录,观察一下每年花开得好不好和那年的特定情况有什么关系(比如说气候、肥料的使用量等等)。你可能发现,一般来说,如果去年花开得好,那么今年花也会开得不错。
平均移动模型则不太一样,它更关注一些随机的、不好预料的因素,比如说突然之间来了一场病虫害,或者是邻居家的狗跑来你家花园里疯跑,这些因素都可能导致花开得不好。这个模型会考虑这些突发因素对花开的影响,即使这些情况已经过去了,但它们留下的影响可能还会持续一段时间。
现在,我们把这两个模型混合在一起,就得到了ARMA模型。这个模型不仅会考虑过去花开的规律,还会考虑那些偶然发生的、可能影响花开的突发事件。这样,我们预测花开的情况就既考虑了历史规律,又没有忽略随机事件的影响,预测结果自然更加全面和精准。
简而言之,ARMA模型综合了历史数据和随机干扰,它能帮我们更好地理解和预测一些像股票价格、天气变化这样随时间变化的序列数据。
所以,如果你想要预测未来的某个序列数据,比如说房价走势、商店的销量等等,可以想象你是一个有经验的花匠,你会根据以往的经验(自回归部分)和可能发生的意外(平均移动部分)综合判断,然后用ARMA模型这个工具来帮你更科学地预测未来。
ARMA模型是自回归移动平均模型(AutoRegressive Moving Average model)的缩写,集合了自回归模型(AR)和移动平均模型(MA),适合处理平稳的时间序列数据。
自回归模型(AR):自回归模型是用自身的历史数据来进行预测,它假设当前观测值与之前的观测值存在线性关系。例如,AR(p)模型将时间序列Y在t时刻的值,表示为一个常数项和前p个历史值的线性组合,再加上一个误差项。表达式为:
其中,是在时间t的观测值, 是模型的自回归系数,描述了时刻的观测值对t时刻观测值的影响, 是白噪声,表示时刻的随机误差项, 是常数项。
移动平均模型(MA):移动平均模型是用过去的误差项来进行预测,反映了历史预测误差对当前值的影响。例如,MA(q)模型将时间序列Y在t时刻的值,表示为一个常数项和前q个历史误差项的线性组合。
其中, 表示时间点t的观测值, 是平均值, 是白噪声误差,,,...,是模型的参数,表示过去 个时间点的误差对当前观测值的影响。
ARMA模型则把AR模型和MA模型结合起来,构成了一种能有效拟合和预测平稳时间序列的模型。ARMA(p,q)模型将时间序列X在t时段的值,表示为一方面是前p个历史值的线性组合(AR部分),另一方面是前q个历史误差项的线性组合(MA部分),最后增加一个常数项。这样既考虑了时间序列的自回归特性,又考虑了移动平均特性。表达式为:
其中, 表示时间点 的观测值, 是平均值,,,..., 和 ,,...,是模型的参数,是白噪声误差。
1import pandas as pd
2import numpy as np
3import statsmodels.api as sm
4
5# 生成一个ARMA模型的时间序列数据
6np.random.seed(0)
7n = 1000
8ar_params = np.array([0.7, -0.4]) # AR模型的参数,其中的每个元素代表 AR 模型中的一个阶数对应的参数值
9ma_params = np.array([0.2, 0.3]) # MA模型的参数,其中的每个元素代表 MA 模型中的一个阶数对应的参数值
10arma_process = sm.tsa.ArmaProcess(ar_params, ma_params) # 基于指定的 AR 和 MA 参数生成 ARMA 模型的时间序列数据
11data = arma_process.generate_sample(nsample=n)
12
13# 拟合ARMA模型
14model = sm.tsa.ARMA(data, order=(2, 2)) # 这里选择了AR阶数为2,MA阶数为2的ARMA模型
15results = model.fit()
16
17# 输出模型拟合结果
18print(results.summary())
19
20# 预测未来的值
21forecast_start = n
22forecast_end = n + 10
23forecast_values = results.predict(start=forecast_start, end=forecast_end)
24
25# 打印预测结果
26print(forecast_values)
1import pandas as pd
2import numpy as np
3import statsmodels.api as sm
4
5# 生成一个ARMA模型的时间序列数据
6np.random.seed(0)
7n = 1000
8ar_params = np.array([0.7, -0.4]) # AR模型的参数,其中的每个元素代表 AR 模型中的一个阶数对应的参数值
9ma_params = np.array([0.2, 0.3]) # MA模型的参数,其中的每个元素代表 MA 模型中的一个阶数对应的参数值
10arma_process = sm.tsa.ArmaProcess(ar_params, ma_params) # 基于指定的 AR 和 MA 参数生成 ARMA 模型的时间序列数据
11data = arma_process.generate_sample(nsample=n)
12
13# 拟合ARMA模型
14model = sm.tsa.ARMA(data, order=(2, 2)) # 这里选择了AR阶数为2,MA阶数为2的ARMA模型
15results = model.fit()
16
17# 输出模型拟合结果
18print(results.summary())
19
20# 预测未来的值
21forecast_start = n
22forecast_end = n + 10
23forecast_values = results.predict(start=forecast_start, end=forecast_end)
24
25# 打印预测结果
26print(forecast_values)
输出结果:
1 ARMA Model Results
2==============================================================================
3Dep. Variable: y No. Observations: 1000
4Model: ARMA(2, 2) Log Likelihood -557.144
5Method: css-mle S.D. of innovations 0.422
6Date: Mon, 25 Dec 2023 AIC 1126.288
7Time: 20:51:18 BIC 1155.735
8Sample: 0 HQIC 1137.480
9
10==============================================================================
11 coef std err z P>|z| [0.025 0.975]
12------------------------------------------------------------------------------
13const -0.0706 0.068 -1.035 0.301 -0.204 0.063
14ar.L1.y 1.4377 0.070 20.513 0.000 1.300 1.575
15ar.L2.y -0.4696 0.052 -8.979 0.000 -0.572 -0.367
16ma.L1.y -0.2172 0.066 -3.270 0.001 -0.347 -0.087
17ma.L2.y -0.6190 0.044 -14.179 0.000 -0.705 -0.533
18 Roots
19=============================================================================
20 Real Imaginary Modulus Frequency
21-----------------------------------------------------------------------------
22AR.1 1.0685 +0.0000j 1.0685 0.0000
23AR.2 1.9930 +0.0000j 1.9930 0.0000
24MA.1 1.1077 +0.0000j 1.1077 0.0000
25MA.2 -1.4585 +0.0000j 1.4585 0.5000
26-----------------------------------------------------------------------------
27[-0.69647744 -0.37943429 -0.22069184 -0.14135483 -0.10183922 -0.08228518
28 -0.0727293 -0.06817359 -0.0661114 -0.06528599 -0.06506771]
1 ARMA Model Results
2==============================================================================
3Dep. Variable: y No. Observations: 1000
4Model: ARMA(2, 2) Log Likelihood -557.144
5Method: css-mle S.D. of innovations 0.422
6Date: Mon, 25 Dec 2023 AIC 1126.288
7Time: 20:51:18 BIC 1155.735
8Sample: 0 HQIC 1137.480
9
10==============================================================================
11 coef std err z P>|z| [0.025 0.975]
12------------------------------------------------------------------------------
13const -0.0706 0.068 -1.035 0.301 -0.204 0.063
14ar.L1.y 1.4377 0.070 20.513 0.000 1.300 1.575
15ar.L2.y -0.4696 0.052 -8.979 0.000 -0.572 -0.367
16ma.L1.y -0.2172 0.066 -3.270 0.001 -0.347 -0.087
17ma.L2.y -0.6190 0.044 -14.179 0.000 -0.705 -0.533
18 Roots
19=============================================================================
20 Real Imaginary Modulus Frequency
21-----------------------------------------------------------------------------
22AR.1 1.0685 +0.0000j 1.0685 0.0000
23AR.2 1.9930 +0.0000j 1.9930 0.0000
24MA.1 1.1077 +0.0000j 1.1077 0.0000
25MA.2 -1.4585 +0.0000j 1.4585 0.5000
26-----------------------------------------------------------------------------
27[-0.69647744 -0.37943429 -0.22069184 -0.14135483 -0.10183922 -0.08228518
28 -0.0727293 -0.06817359 -0.0661114 -0.06528599 -0.06506771]
summary()
方法表示ARMA模型结果的整体展示。以下是各部分的解释:
y
,意味着时间序列数据的名称或者标签)。css-mle
表示使用条件和平方和方法结合最大似然估计)。下面是参数的估计结果:
每个参数旁边的括号包含了:
最后部分列出了模型的根(roots),这些是AR和MA多项式的解,它们可以用来分析模型的稳定性和可逆性:
模型的稳定性要求所有AR根都在单位圆外,即它们的模长(Modulus)大于1。可逆性要求所有MA根也都在单位圆外。在这个模型中,所有根的模都大于1,所以模型是稳定且可逆的。
应用领域:
适用问题:
优点:
缺点: