MATLAB 时间序列预测方法实战
算法运行环境为 MATLAB R2021B,执行几种时间序列预测方法,包括:
- Autoregression (AR)
- Moving Average
- Autoregressive Moving Average
- Autoregressive Integrated Moving Average (ARIMA)
- Seasonal Autoregressive Integrated Moving-Average (SARIMA)
- Seasonal Autoregressive Integrated Moving Average with Exogenous Regressors (SARIMAX)
- Vector Autoregression (VAR)
- GARCH Model
- Glostan, Jagannathan and Runkle GARCH Model

数据准备
首先准备测试数据。假设手头有个股票收盘价序列,长度 500 天:
data = cumsum(randn(500,1)*0.5 + 0.01) + 50; % 模拟股票价格
plot(data);
title('模拟股票价格');
这串随机数生成器造的数据有微弱正趋势,标准差 0.5,初始值 50。cumsum 让数据有持续性特征,符合金融时间序列特性。

AR 模型实战
自回归的核心就是拿历史数据当预测依据。比如用前 3 天的数据预测明天:
Mdl = arima('ARLags',1:3);
EstMdl = estimate(Mdl, data);
[YF, YMSE] = forecast(EstMdl, 5, data); % 预测未来 5 天
这里'ARLags'参数指定滞后阶数,1:3 表示用 t-1,t-2,t-3 时刻的值。estimate 函数会返回模型参数估计值,注意 MATLAB 自动做了标准化处理。预测时 YMSE 是预测方差,可以画置信区间。

ARIMA 进阶版
加上差分处理非平稳数据更稳健:
Mdl = arima(2,1,1); % AR 阶 2,差分阶 1,MA 阶 1
EstMdl = estimate(Mdl, data);
[YF, YMSE] = forecast(EstMdl, 5, 'Y0', data);
差分阶数 1 表示做一阶差分消除趋势。模型训练时注意看命令行输出的参数显著性,p 值小于 0.05 的项才有保留价值。如果 MA 项系数不显著,可以降阶试试。

GARCH 家族波动率建模
金融预测需处理波动聚集现象:
Mdl = garch('GARCHLags',1,'ARCHLags',1);
EstMdl = estimate(Mdl, diff(data)); % 对收益率建模
condVar = infer(EstMdl, diff(data)); % 提取条件方差
plot([diff(data), condVar]);
legend('收益率','波动率');
这里用差分后的收益率数据,infer 函数能提取波动率估计。GARCH(1,1) 模型里,ARCH 项反映新息冲击,GARCH 项体现波动持续性。如果发现杠杆效应(跌的时候波动更大),可以升级到 GJR-GARCH:
Mdl = gjr('GARCHLags',1,'ARCHLags',1,'LeverageLags',1);
EstMdl = estimate(Mdl, diff(data));
多了个 LeverageLags 参数来捕捉不对称效应。回测时要注意,这类模型对参数初值敏感,可能需要多试几次初值设定。


多变量分析——VAR 模型
当多个时间序列互相影响时:
data_multi = [data, randn(500,1)*2 + 5]; % 伪造第二个变量
Mdl = varm(2,2); % 两个变量,滞后 2 阶
EstMdl = estimate(Mdl, data_multi);
[YF, YMSE] = forecast(EstMdl, 5, data_multi);
varm 模型会自动估计变量间的交叉影响。注意数据要先做平稳性检验,可以用 MATLAB 的 adftest 做单位根检验。预测时输出的 YF 是矩阵,每列对应一个变量的预测值。
季节性模型——SARIMA
处理像销售额这种有季节波动的:
Mdl = arima('ARLags',1:2,'D',1,'Seasonality',12,...
'MALags',1,'SMALags',12);
EstMdl = estimate(Mdl, data);
这里设置季节周期为 12(比如月度数据),Seasonality 参数自动创建季节性差分。实际操作中要先用季节图判断周期长度,别瞎猜参数。可以用 x13as 工具做季节调整,再喂给模型。
注意事项
完成代码后需注意几个避坑指南:
- 预测前务必做残差诊断:用 lbqtest 检验自相关性
- 模型对比用 AIC/BIC 指标,别光看拟合误差
- 样本外预测要用滚动窗口验证,防止过拟合
- 用 parfor 加速参数寻优,特别是 SARIMAX 这种参数多的模型
总结
时间序列预测就是平衡偏差与方差的艺术。没有通吃所有场景的银弹,多备几把刷子,根据数据特征选兵器才是王道。下次遇到震荡市,不妨试试 GARCH 系模型;要是数据有明显周期规律,SARIMA 可能更香。代码只是工具,理解数据内在逻辑才是真功夫。

