所有文章 > AI驱动 > 突破最强时间序列模型,自回归滑动平均!!

突破最强时间序列模型,自回归滑动平均!!

1. 什么是「时间序列」?

时间序列就是随着时间变化的数据。例如:

  • 每天的气温记录
  • 每小时的股票价格
  • 每周的店铺销售额

这些数据都有一个特点——它们是按照时间顺序排列的,并且通常前面的数据会影响后面的数据。

2. 自回归(AutoRegressive,简称AR)

自回归的意思是“自己回归自己”。简单来说,就是用之前的数据去预测现在的值。

举个例子:你每天记录午饭花的钱,发现花的金额有个规律——今天的花费和前几天的花费有关系。比如,昨天和前天的花费可能会影响今天的花费。如果前两天花得比较多,今天可能会稍微省一点;反之,如果前几天没花多少,今天可能会多花一些。

在数学上,自回归可以表示为:

自回归就是通过前几天的数据来预测今天的值,类似于“靠前几天的自己,来预测今天的自己”。

3. 滑动平均(Moving Average,简称MA)

滑动平均就是用之前的“误差”来调整当前的预测。

再用午饭花费举例:假设你每天都会做预算,但有时会因为一些突发情况(比如今天特别饿,或者看到喜欢的菜)而多花了钱。这些“意外的误差”会影响你接下来的花费。

滑动平均的公式看起来是这样的:

滑动平均就是利用之前“预算偏差”来调整今天的预算,类似于“回顾前几天的误差,来修正今天的自己”。

4. 自回归滑动平均模型(ARMA)

现在,我们来把「自回归」和「滑动平均」结合起来。ARMA 模型就是在用前几天的数值(自回归)做预测的同时,还考虑到之前误差的影响(滑动平均),得到一个更准确的预测模型。

公式表示

通过 ARMA 模型,我们既利用了过去的数据趋势(自回归),也参考了之前的误差(滑动平均),让预测更接近真实情况。

举个简单的小例子

假设我们记录了过去几天的气温变化,发现今天的气温和前两天的气温(自回归部分)以及前一天的误差(滑动平均部分)有关。

假设:

这样,我们就得到了一个基于 ARMA 模型的预测。

事实上,ARMA 模型是一种结合自回归和滑动平均的方法,能够利用历史数据的趋势和误差去预测未来值。

下面,咱们从原理和案例方面再来和大家聊聊~

ARMA 模型

ARMA 模型结合了两部分:自回归 (AR) 和 滑动平均 (MA)。

假设:

1. 自回归部分 (AR)

自回归模型通过先前的序列值来预测当前值,公式为:

2. 滑动平均部分 (MA)

滑动平均模型使用过去的误差项预测当前值:

3. 综合 AR 和 MA

综合 AR 和 MA 两部分后,得到 ARMA 模型公式:

数据集选择和下载

我们在 Kaggle 上选择一个合适的时间序列数据集,如「每日温度」、「股票价格」等。之后手动实现 ARMA 模型并通过图表展示分析结果。

Python实现

首先,咱们使用 daily-min-temperatures.csv 数据集。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# 读取数据集
data = pd.read_csv('daily-min-temperatures.csv', parse_dates=['Date'], index_col='Date')
temperature = data['Temp'].values

# 绘制时间序列图
plt.figure(figsize=(10, 6))
plt.plot(data.index, temperature, color='dodgerblue')
plt.title("Daily Minimum Temperatures")
plt.xlabel("Date")
plt.ylabel("Temperature")
plt.show()

# 绘制自相关和偏自相关图
plt.figure(figsize=(12, 5))
plt.subplot(121)
plot_acf(temperature, lags=30, color='blue', ax=plt.gca())
plt.title("Autocorrelation (ACF)")

plt.subplot(122)
plot_pacf(temperature, lags=30, color='red', ax=plt.gca())
plt.title("Partial Autocorrelation (PACF)")
plt.tight_layout()
plt.show()

# 初始化ARMA模型参数
p, q = 2, 2 # 设置自回归和滑动平均的阶数
phi = np.random.randn(p)
theta = np.random.randn(q)
mu = np.mean(temperature)
n = len(temperature)

# 自定义 ARMA 模型拟合函数
def arma_model(temperature, phi, theta, p, q):
Y_pred = np.zeros(n)
residuals = np.zeros(n)

for t in range(max(p, q), n):
ar_term = np.sum([phi[i] * temperature[t - i - 1] for i in range(p)])
ma_term = np.sum([theta[i] * residuals[t - i - 1] for i in range(q)])
Y_pred[t] = mu + ar_term + ma_term
residuals[t] = temperature[t] - Y_pred[t] # 计算残差
return Y_pred, residuals

# 预测并计算残差
Y_pred, residuals = arma_model(temperature, phi, theta, p, q)

# 绘制拟合效果图
plt.figure(figsize=(10, 6))
plt.plot(data.index, temperature, label="Original", color='dodgerblue')
plt.plot(data.index, Y_pred, label="ARMA Fit", color='coral')
plt.title("ARMA Model Fitting")
plt.xlabel("Date")
plt.ylabel("Temperature")
plt.legend()
plt.show()

# 绘制残差图
plt.figure(figsize=(10, 6))
plt.plot(data.index, residuals, color='purple')
plt.title("Residuals of ARMA Model")
plt.xlabel("Date")
plt.ylabel("Residuals")
plt.show()

1. 时间序列原始数据图:展示温度随时间的变化趋势,分析季节性和周期性。

2. 自相关图 (ACF):展示滞后值与当前值的关系,帮助决定 AR 模型阶数。

3. 偏自相关图 (PACF):观察自回归的影响,帮助选择 AR 部分的阶数。

4. 残差图:观察 ARMA 模型残差的分布是否随机,验证模型的拟合效果。

最后

通过手动实现 ARMA 模型,可以深刻理解其数学推导和实现细节,同时通过图形直观地理解模型的拟合效果和残差分布。

文章转自微信公众号@深夜努力写Python