4. 经典模型:移动平均(MA)、自回归(AR)、自回归移动平均(ARMA)模型原理与实现

资金流预测,说白了就是跟时间序列打交道。我做了这么多年量化,发现很多新手一上来就上LSTM、Transformer,结果效果还不如几个经典模型。今天咱们就把这三个祖师爷级别的模型——MA、AR、ARMA,掰开揉碎了讲清楚。

核心观点:这三个模型是时间序列分析的基石。你想想看,连它们都搞不明白,后面那些花里胡哨的模型大概率也是空中楼阁。

4.1 自回归模型(AR)——用过去预测未来

AR模型的核心思想特别朴素:明天的值,等于过去几天的值的线性组合,再加上一个随机误差。用数学公式表达就是:

Y_t = c + φ₁Y_{t-1} + φ₂Y_{t-2} + ... + φ_pY_{t-p} + ε_t

这里的p就是阶数,表示我们往前看多少天。φ是系数,ε是白噪声。

我个人习惯用偏自相关函数(PACF)来确定p值。为什么?因为PACF能帮我们找到真正的滞后关系,排除中间变量的干扰。

实战经验:我在做某电商平台的日资金流入预测时,发现PACF在滞后2阶后突然截尾。这意味着p=2就够了。当时团队里有人非要用p=10,结果过拟合得一塌糊涂。

Python实现其实很简单,用statsmodels库几行代码搞定:

import statsmodels.api as sm
from statsmodels.tsa.ar_model import AutoReg

# 假设data是资金流时间序列
model = AutoReg(data, lags=2)  # p=2
result = model.fit()
print(result.summary())

# 预测未来3天
forecast = result.predict(start=len(data), end=len(data)+2)

4.2 移动平均模型(MA)——用误差修正预测

MA模型跟AR模型思路完全不同。它不看过去的实际值,而是看过去的预测误差。公式长这样:

Y_t = μ + ε_t + θ₁ε_{t-1} + θ₂ε_{t-2} + ... + θ_qε_{t-q}

说白了,MA模型认为当前值等于一个常数,加上过去q天的预测误差的加权和。这个模型特别适合处理那些有「冲击效应」的时间序列——比如突发大额资金转入,影响会持续几天。

我记得有一次做银行间市场资金流预测,遇到一个典型场景:某大行突然拆入大笔资金,随后几天市场利率都会波动。这种「冲击衰减」效应,用MA模型拟合得特别好。

确定q值看自相关函数(ACF)。如果ACF在滞后q阶后截尾,那q就是最佳阶数。

from statsmodels.tsa.arima.model import ARIMA

# MA模型其实就是ARIMA(0,0,q)
model = ARIMA(data, order=(0,0,2))  # q=2
result = model.fit()
print(result.summary())

避坑指南:我曾经犯过一个错误——把MA模型和移动平均线搞混了。移动平均线是平滑工具,MA模型是统计模型。两者名字像,但本质完全不同。千万别搞混。

4.3 自回归移动平均模型(ARMA)——强强联合

ARMA模型就是把AR和MA结合起来。你想想看,既然AR能捕捉趋势,MA能捕捉冲击,那为什么不一起用呢?

Y_t = c + φ₁Y_{t-1} + ... + φ_pY_{t-p} + ε_t + θ₁ε_{t-1} + ... + θ_qε_{t-q}

ARMA(p,q)需要同时确定p和q。这里有个小技巧:

  • 先看PACF确定p的候选值
  • 再看ACF确定q的候选值
  • 用AIC或BIC信息准则选最优组合

我建议不要手动一个个试。写个循环自动搜索,省时省力:

import itertools
import warnings
warnings.filterwarnings('ignore')

best_aic = float('inf')
best_order = None

for p in range(0, 5):
    for q in range(0, 5):
        try:
            model = ARIMA(data, order=(p,0,q))
            result = model.fit()
            if result.aic < best_aic:
                best_aic = result.aic
                best_order = (p,0,q)
        except:
            continue

print(f'最佳阶数: {best_order}, AIC: {best_aic}')

4.4 模型对比与选择

模型 适用场景 参数确定 我的经验
AR(p) 趋势性强、周期性明显 看PACF截尾 资金流有周规律时首选
MA(q) 有冲击效应、噪声大 看ACF截尾 突发事件后效果极佳
ARMA(p,q) 复杂模式、两者兼有 AIC/BIC搜索 大部分场景的默认选择

重要提醒:这三个模型都要求时间序列是平稳的。如果不平稳,需要先做差分。这就是后面要讲的ARIMA模型了。嗯,这里先埋个伏笔。

4.5 知识体系结构图

下面这张图帮你理清三个模型的关系和选择逻辑:

时间序列经典模型选择流程图 原始时间序列 是否平稳? 做差分 → ARIMA AR(p)模型 看PACF截尾 ARMA(p,q)模型 AIC/BIC搜索 MA(q)模型 看ACF截尾

4.6 实战中的注意事项

最后分享几个我踩过的坑:

  • 数据量问题:ARMA模型至少需要50个样本点。少于这个数,参数估计会很不稳定。我见过有人用30天的数据跑ARMA(5,5),结果完全不可信。
  • 阶数不要太大:p和q一般不超过5。超过这个范围,模型容易过拟合,而且解释性变差。
  • 残差检验不能省:模型拟合后一定要检查残差是不是白噪声。如果不是,说明模型没捕捉到所有信息。

我的习惯:每次建模后,我都会画残差的ACF图。如果看到明显的自相关,就回去调整模型。这个习惯帮我避免了很多次「伪拟合」。

好了,这三个经典模型就讲到这里。它们虽然简单,但用好了威力不小。下次遇到资金流预测问题,别急着上深度学习,先试试ARMA——说不定效果更好。


公众号:蓝海资料掘金营,微信deep3321