ARIMA+SVM 组合模型预测股票收盘价:原理、复现与避坑指南
简介这份资源面向具备一定MATLAB基础、希望入门时间序列与机器学习组合建模的学习者与量化研究者核心是用支持向量机改进ARIMA的股票价格预测方案。包内共3个文件以2个m脚本和1个xlsx数据表为主压缩包约13KB脚本分别承担ARIMA建模与SVM预测改进的主流程数据表提供上证指数历史收盘价作为训练与验证来源。已有1045人学习下载说明该思路在预测类课程设计与实战练习中较受关注。读者可据此掌握ARIMA自动定阶、SVM核函数非线性回归、两者串联预测的完整实现并借助R方、均方差、相对误差等指标对比改进前后的精度差异同时理解如何替换数据源迁移到其他股票或更长时间区间形成可复用的预测与评估框架。1. ARIMA 单打独斗为什么在收盘价上总差一口气用 ARIMA 预测股票收盘价很多人第一次跑完就发现一个尴尬现象样本内拟合得漂漂亮亮一到样本外就变成“昨天的价格平移”。这不是代码写错了而是 ARIMA 的线性假设在真实盘面上先天吃亏。股票价格里既有线性自相关也有大量非线性结构——波动聚集、跳空、情绪脉冲这些用纯 AR 和 MA 项根本抓不住。于是就有了“ARIMASVM”这条路线先用 ARIMA 把线性成分剥掉再让支持向量机去学残差里的非线性规律。它解决的不是“预测明天涨跌”这种玄学问题而是让价格序列的预测误差更小、方向命中更稳。适合谁适合已经会跑 ARIMA、但发现残差还有明显结构、想用 SVM 做二次修正的从业者。下面按“先立住原理、再动手复现、最后避坑”的顺序讲透。2. 拆开 ARIMASVM线性残差交给谁非线性残差怎么接2.1 ARIMA 到底在拟合什么残差为什么不能直接丢ARIMA(p,d,q) 的三块分工要记牢d 是差分阶数负责把非平稳序列变成平稳p 是自回归项用过去 p 个值解释当前值q 是移动平均项用过去 q 个预测误差解释当前值。股票收盘价通常一阶差分后就近似平稳所以 d 一般取 1这也是为什么很多人直接上 ARIMA(1,1,1) 或 ARIMA(2,1,2) 先试。关键在于ARIMA 拟合完模型会吐出一串残差。如果残差是纯白噪声说明线性部分已经榨干再上 SVM 意义不大但真实股票残差往往还有自相关和异方差Ljung-Box 检验 p 值小于 0.05 就是信号。这时候残差里剩下的就是非线性结构正是 SVM 的用武之地。我一般会先画残差时序图和 ACF 图肉眼确认有没有“成串”的波动。如果残差在某个区间明显放大说明波动聚集存在SVM 用 RBF 核比线性核更合适。2.2 为什么选 SVM 接残差而不是直接上 LSTMSVM 在小样本、高维、非线性回归上有两个硬优势一是结构风险最小化泛化误差可控不像神经网络容易过拟合二是核函数把低维非线性映射到高维线性RBF 核处理残差这种“局部波动”很顺手。股票日线数据通常几千条LSTM 参数多、训练慢、调参玄学而 SVM 用网格搜索就能把 C 和 gamma 定下来。常见做法是ARIMA 负责趋势和线性自相关SVM 负责残差修正最终预测值 ARIMA 预测值 SVM 预测残差。这个加法结构简单、可解释、易复现比端到端黑箱更适合一线落地。2.3 最小可跑通流程从收盘价到残差修正下面这段代码用 Python 把整条链路串起来数据用 yfinance 拉一段真实日线ARIMA 用 statsmodelsSVM 用 sklearn 的 SVR。注意这里只做单步预测演示滚动预测在最后一章展开。import numpy as np import pandas as pd import yfinance as yf from statsmodels.tsa.arima.model import ARIMA from sklearn.svm import SVR from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error, mean_absolute_error # 1. 拉数据只取收盘价 df yf.download(AAPL, start2020-01-01, end2024-01-01) price df[Close].dropna().values.reshape(-1, 1) # 2. 划分训练集和测试集8:2 split int(len(price) * 0.8) train, test price[:split], price[split:] # 3. ARIMA 拟合训练集d1 先验 model ARIMA(train, order(2, 1, 2)) model_fit model.fit() print(model_fit.summary()) # 4. 拿到训练集残差 resid_train model_fit.resid # 5. 用残差构造 SVM 训练样本用前 lag 个残差预测当前残差 lag 5 X_svm, y_svm [], [] for i in range(lag, len(resid_train)): X_svm.append(resid_train[i-lag:i]) y_svm.append(resid_train[i]) X_svm, y_svm np.array(X_svm), np.array(y_svm) # 6. 标准化SVM 对尺度敏感 scaler StandardScaler() X_svm_scaled scaler.fit_transform(X_svm) # 7. 训练 SVRRBF 核 svr SVR(kernelrbf, C100, gamma0.1, epsilon0.01) svr.fit(X_svm_scaled, y_svm) # 8. 在测试集上滚动预测 history list(train.flatten()) preds [] for t in range(len(test)): # ARIMA 预测下一步 arima_pred model_fit.forecast(steps1)[0] # 取最近 lag 个残差标准化后喂给 SVR recent_resid resid_train[-lag:] recent_resid_scaled scaler.transform(recent_resid.reshape(1, -1)) svm_correction svr.predict(recent_resid_scaled)[0] # 最终预测 ARIMA SVM 修正 final_pred arima_pred svm_correction preds.append(final_pred) # 更新历史真实值进入下一轮 history.append(test[t][0]) # 重新拟合 ARIMA保持模型跟进 model ARIMA(history, order(2, 1, 2)) model_fit model.fit() resid_train model_fit.resid # 9. 评估 preds np.array(preds).flatten() test_flat test.flatten() print(RMSE:, np.sqrt(mean_squared_error(test_flat, preds))) print(MAE:, mean_absolute_error(test_flat, preds))逻辑说明第 3 步 ARIMA 先吃掉线性部分第 5 步把残差做成监督学习样本lag5 表示用过去 5 天残差预测当天残差第 7 步 SVR 用 RBF 核拟合残差第 8 步滚动预测时每步都用最新真实值重新拟合 ARIMA保证残差序列不过期。参数说明ARIMA 的 order 先用 (2,1,2) 试后面用 AIC 定SVR 的 C 控制惩罚力度gamma 控制 RBF 核宽度epsilon 是不敏感损失带宽。这三个参数用 GridSearchCV 在验证集上搜别在测试集上调。提示yfinance 拉的数据偶尔有缺失dropna 之后要检查索引是否连续否则差分会出错。3. 参数怎么定ARIMA 定阶与 SVM 调参的实操顺序3.1 ARIMA 定阶先看 ACF/PACF再用 AIC 兜底定阶不要一上来就网格搜先画差分后序列的 ACF 和 PACF。ACF 拖尾、PACF 截尾p 取截尾处ACF 截尾、PACF 拖尾q 取截尾处。如果都拖尾说明 p、q 都不为 0这时候用 AIC 在候选集里选。我一般会跑一个循环p 从 0 到 5q 从 0 到 5d 固定 1记录 AIC选最小的。注意 AIC 只比较同阶差分下的模型d 不同不能直接比。import warnings warnings.filterwarnings(ignore) best_aic np.inf best_order None for p in range(6): for q in range(6): try: m ARIMA(train, order(p, 1, q)).fit() if m.aic best_aic: best_aic m.aic best_order (p, 1, q) except: continue print(Best ARIMA order:, best_order, AIC:, best_aic)这段跑完通常几十秒best_order 就是你的基准。如果 AIC 最小的阶数很大比如 p5、q5要警惕过拟合可以适当降阶再看残差白噪声检验。3.2 SVM 调参C 和 gamma 的网格怎么划SVR 的 C 越大对训练误差惩罚越重容易过拟合gamma 越大RBF 核越窄模型越关注局部。股票残差波动范围有限C 从 1 到 1000 按对数取gamma 从 0.001 到 1 按对数取epsilon 取 0.01、0.05、0.1 三档。from sklearn.model_selection import GridSearchCV param_grid { C: [1, 10, 100, 1000], gamma: [0.001, 0.01, 0.1, 1], epsilon: [0.01, 0.05, 0.1] } grid GridSearchCV(SVR(kernelrbf), param_grid, cv5, scoringneg_mean_squared_error, n_jobs-1) grid.fit(X_svm_scaled, y_svm) print(Best params:, grid.best_params_)cv5 是时间序列里常用的折数但严格来说应该用 TimeSeriesSplit避免未来信息泄露。如果数据量小5 折也够用但心里要清楚这个偏差。3.3 残差白噪声检验SVM 该不该上的判据ARIMA 拟合完用 Ljung-Box 检验残差。p 值大于 0.05说明残差已经是白噪声SVM 修正空间很小p 值小于 0.05残差还有结构SVM 值得上。from statsmodels.stats.diagnostic import acorr_ljungbox lb_test acorr_ljungbox(resid_train, lags[10], return_dfTrue) print(lb_test)如果 lb_test 的 p 值小于 0.05继续 SVM否则回头检查 ARIMA 阶数是不是不够或者数据本身信噪比太低。注意Ljung-Box 对 lag 敏感lag 取 10 或 20 都行但要在报告里写清楚。4. 避坑与排查ARIMASVM 最容易翻车的 5 个地方4.1 现象测试集 RMSE 比单 ARIMA 还大原因SVM 在残差上过拟合了训练集把噪声当信号学走了。常见于 C 设得太大、gamma 设得太小或者 lag 取得太长导致特征维度爆炸。解决把 C 降一个数量级gamma 升一个数量级lag 从 5 降到 3 再试。同时检查标准化是不是只在训练集上 fit测试集必须用同一个 scaler。4.2 现象滚动预测越跑越慢最后卡死原因每步都重新拟合 ARIMA数据量累积到几千条时statsmodels 的拟合耗时线性增长。解决不要每步都重拟合改成每 20 步或每 50 步重拟合一次中间用固定模型预测。或者换用 ARIMA 的 append 方法增量更新但 statsmodels 的 append 支持有限稳妥做法还是定期重拟合。4.3 现象SVM 修正项几乎为 0加了等于没加原因残差标准化后数值太小SVR 的 epsilon 设得太大把修正项全当成了不敏感损失内的噪声。解决把 epsilon 降到 0.001 或 0.005同时检查残差标准差。如果残差标准差本身很小说明 ARIMA 已经拟合得很好SVM 确实没必要上。4.4 现象预测曲线整体平移方向全反原因差分还原时忘了把差分值加回原始尺度或者 ARIMA 的 forecast 返回的是差分后的值。解决用 model_fit.forecast 时确认返回尺度必要时手动做累加还原。更稳妥的做法是用 model_fit.get_forecast 拿预测均值和置信区间再逐层还原。4.5 现象换一只股票参数全废原因ARIMA 阶数和 SVM 参数是在特定股票上调的不同股票的波动结构差异很大。解决把定阶和调参流程脚本化每换一只股票就重跑一遍 AIC 搜索和网格搜索。不要指望一套参数打天下这是血泪经验。5. 进阶技巧滚动预测窗口与误差归因怎么做滚动预测是 ARIMASVM 落地的关键。固定窗口比如只用最近 250 个交易日比全历史窗口更稳因为股票的市场结构会变太老的数据反而干扰。我一般用 expanding window 和 rolling window 各跑一遍比较 RMSE选更稳的那个。误差归因也值得做把最终误差拆成 ARIMA 误差和 SVM 修正误差两部分看谁贡献大。如果 SVM 修正误差占比超过 30%说明 ARIMA 阶数可能不够或者残差结构太强需要回头调 ARIMA。# 误差归因示例 arima_errors [] svm_errors [] for t in range(len(test)): arima_pred model_fit.forecast(steps1)[0] svm_correction svr.predict(scaler.transform(resid_train[-lag:].reshape(1, -1)))[0] final_pred arima_pred svm_correction arima_errors.append(abs(test[t][0] - arima_pred)) svm_errors.append(abs(test[t][0] - final_pred)) print(ARIMA MAE:, np.mean(arima_errors)) print(ARIMASVM MAE:, np.mean(svm_errors))如果 ARIMASVM 的 MAE 比单 ARIMA 低 5% 以上这个改进就值得保留如果只低 1% 到 2%要考虑复杂度是否划算。最后一个习惯每次跑完把 ARIMA 阶数、SVM 参数、RMSE、MAE、Ljung-Box p 值记到一张表里换股票、换时间段都对照看。这个习惯帮我省了很多重复调参的时间也希望帮到你。本文还有配套的精品资源点击获取

相关新闻

PyQt5+PyInstaller打包实战:资源文件与qss路径避坑指南

PyQt5+PyInstaller打包实战:资源文件与qss路径避坑指南

打包这活儿,写代码的时候没感觉,等要把程序发给别人用的时候,麻烦就来了。对方电脑上不一定装了Python,更别说PyQt5那套依赖,你辛辛苦苦写好的GUI程序,最后还得教人家配环境、敲命令、装库,这体…

2026/10/13 13:35:26 阅读更多 →
DIE查壳工具实战:原理、命令与自动化集成,PEiD换用避坑指南

DIE查壳工具实战:原理、命令与自动化集成,PEiD换用避坑指南

简介:DIE(Detect It Easy)是一款专业查壳工具,面向逆向分析、恶意代码排查及软件安全爱好者,相比PEID功能更全面,支持深度检测与超大文件读取。整个压缩包共1362个文件,压缩后约13.55MB&#xf…

2026/10/13 13:35:33 阅读更多 →
氧氯化铈:稀土基宽禁带半导体的冷门潜力股

氧氯化铈:稀土基宽禁带半导体的冷门潜力股

我先说一个场景:你在挑功率器件材料,翻来覆去就是SiC、GaN、Ga2O3这几张脸;你在查紫外探测方案,找来找去还是AlGaN那套体系。但宽禁带半导体的版图其实远不止这些“明星”,稀土基卤氧化物里藏着一个冷门选手——氧氯化…

2026/10/13 13:35:37 阅读更多 →

最新新闻

MATLAB共享储能电站冷热电多微网双层优化配置模型详解

MATLAB共享储能电站冷热电多微网双层优化配置模型详解

先说一句啊,这篇不是那种把模型往纸上一放、公式一抄就完事的论文复现,而是基于“MATLAB共享储能电站服务冷热电多微网系统双层优化配置模型”这条线,把建模思路、求解路线、MATLAB实现细节和踩坑经验一次性捋清楚。如果你想做园区级综合能源…

2026/10/14 7:20:37 阅读更多 →
90天PMP通关攻略:专治拖延症的反人性备考技巧

90天PMP通关攻略:专治拖延症的反人性备考技巧

2026年6月PMP考试:一场与“拖延症”的终极对决!90天通关全攻略(内附反人性备考技巧)如果有人问我,PMP考试难在哪,我大概率会说:难在开始。2026年6月那场考试,我提前90天就买好了教材…

2026/10/14 7:20:37 阅读更多 →
电商数据获取技术解析与实战架构设计

电商数据获取技术解析与实战架构设计

1. 电商数据获取的核心价值与挑战在电商行业摸爬滚打这些年,我深刻体会到数据就是决策的氧气。记得2016年刚入行时,团队还在用Excel手动统计商品点击量,现在回头看简直像石器时代。如今一个中等规模的电商平台,日均产生的用户行为…

2026/10/14 7:20:37 阅读更多 →
豆瓣电影排行榜高级爬虫实战:从请求构造到数据存储的完整链路

豆瓣电影排行榜高级爬虫实战:从请求构造到数据存储的完整链路

很多人学网络爬虫时,第一个练手项目都会选豆瓣电影排行榜的数据抓取。理由很简单:页面结构清晰、数据规律、难度适中。但如果你以为requests拿到HTML、正则抠出几条电影名就算学会了爬虫,那离真正的高级数据抓取还差着十万八千里。我见过不少…

2026/10/14 7:20:37 阅读更多 →
做Temu多久能看到收益?回款周期与利润真相深度拆解

做Temu多久能看到收益?回款周期与利润真相深度拆解

做Temu多久能看到收益?这个问题几乎每个新入局的人都问过,但网上的答案特别极端:一边是晒后台截图说上架三天就出单的,一边是吐槽备货压了几万块却迟迟见不到钱的。我跟几个做全托管、半托管的朋友反复对过账,也盯着后…

2026/10/14 7:20:37 阅读更多 →
AI编程教程为何爆火2万Star:从零基础到生产落地的完整路径

AI编程教程为何爆火2万Star:从零基础到生产落地的完整路径

1. 这个“2万Star”到底意味着什么:从GitHub数字看AI编程教程的真实分量很多人看到标题里“2万Star”第一反应是:哇,火了。但作为在开发者教育领域摸爬滚打十多年的老手,我得先泼一盆冷静的水——Star数从来不是教学内容质量的直接…

2026/10/14 7:19:37 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →