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 知识体系结构图
下面这张图帮你理清三个模型的关系和选择逻辑:
4.6 实战中的注意事项
最后分享几个我踩过的坑:
- 数据量问题:ARMA模型至少需要50个样本点。少于这个数,参数估计会很不稳定。我见过有人用30天的数据跑ARMA(5,5),结果完全不可信。
- 阶数不要太大:p和q一般不超过5。超过这个范围,模型容易过拟合,而且解释性变差。
- 残差检验不能省:模型拟合后一定要检查残差是不是白噪声。如果不是,说明模型没捕捉到所有信息。
我的习惯:每次建模后,我都会画残差的ACF图。如果看到明显的自相关,就回去调整模型。这个习惯帮我避免了很多次「伪拟合」。
好了,这三个经典模型就讲到这里。它们虽然简单,但用好了威力不小。下次遇到资金流预测问题,别急着上深度学习,先试试ARMA——说不定效果更好。
公众号:蓝海资料掘金营,微信deep3321