简介Python实现的ARIMA时间序列预测完整项目内含可直接运行的源码与配套数据面向计算机、电子信息工程、数学等专业学生完成课程设计、期末大作业或毕业设计也适合希望快速掌握时间序列建模流程的初学者。项目基于Anaconda与PyCharm环境开发采用参数化编程主要参数集中便于修改几乎逐行添加保姆级注释清晰展示ARIMA模型构建、训练与预测的关键代码方便小白对照学习并二次开发。压缩包共5个文件包含1个Python脚本、3个CSV数据文件和1个Excel表格整体仅61KB轻量便携数据文件与脚本分离可替换为自己的时序数据直接进行预测实验。目前已有961人学习下载由资深算法工程师整理注释细致、思路清晰适合毕业设计、课程作业以及初学者快速上手ARIMA预测建模。1. ARIMA时间序列预测不是所有序列都适合直接建模做销售预测、监控指标波动、分析服务器日志趋势的时候ARIMA 是我第一个上手的模型也是踩坑最多的模型。这份 Python 源码和数据包把从数据清洗、平稳性检验、定阶到滚动预测的整条链路都串了起来拿到就能跑跑完能直接换到自己的序列上不用再从零拼代码。先说一个反直觉的结论ARIMA 建模最耗时间的不是调参数而是平稳性处理和定阶这两个前置环节整个项目七成的工作量都堆在那里。适合刚开始接触时间序列预测的开发者也适合想给手头业务数据快速出一版基线预测结果的分析师。2. 数据清洗与平稳性检验拿到序列先做的三件事2.1 平稳性与差分原理为什么ARIMA强依赖这个前提ARIMA 全称是自回归积分滑动平均其中「积分」Integrated对应的就是差分这一步。也就是说模型默认你送入的数据是平稳序列如果原始数据不平稳你得先用差分把趋势和季节性成分剥掉剥完才能进入 p、q 定阶环节。平稳性在工程上的意义更直接序列的均值和方差不能随时间变化否则模型学到的统计规律本身就是漂移的预测出来的数字看着合理一换时间段就失效。判断平稳性我一般走两步先做 ADF 检验看 p 值再对比差分前后的均值方差曲线。两块都过了才往下走。很多人习惯跳过检验直接差分或者差分后不做白噪声检查就开训这两种情况我都翻过车。非平稳序列强行建模最容易出现的结果是 R² 很高但预测曲线整体滞后这是典型的伪回归不是模型效果好。另外缺失值处理要放在检验之前。时间序列的缺失不能直接删行否则索引断裂会让 ACF 计算错位。常见做法是向前填充业务指标一般用 ffill 就能满足。如果缺失段太长填充不如插值这个后面避坑章里再说。2.2 ADF检验实操用statsmodels确定差分阶数dstatsmodels 的adfuller是行业里最常用的平稳性检验入口。先看加载数据和检验的代码import pandas as pd import numpy as np from statsmodels.tsa.stattools import adfuller df pd.read_csv(sales_data.csv, parse_dates[date], index_coldate) # 缺失值向前填充适合业务指标类的连续序列 series df[sales].astype(float).fillna(methodffill) result adfuller(series, autolagAIC) print(fADF statistic: {result[0]:.4f}) print(fp-value: {result[1]:.4f}) print(fcritical values: {result[4]})adfuller返回的元组里第一个是检验统计量第二个是 p 值第四个是 1%、5%、10% 显著性水平下的临界值。判断逻辑很简单p 值小于 0.05 拒绝「存在单位根」的原假设说明序列平稳反之不平稳需要差分。autolagAIC表示滞后阶数由 AIC 自动确定我一般保持默认手动指定滞后阶数容易引入主观误差。如果 p 值大于 0.05进入差分环节# 一阶差分后做ADF复检 series_diff1 series.diff().dropna() result_diff adfuller(series_diff1, autolagAIC) print(f1阶差分后 p-value: {result_diff[1]:.4f}) if result_diff[1] 0.05: d 1 else: # 一阶不平稳才考虑二阶差分 series_diff2 series.diff().diff().dropna() result_diff2 adfuller(series_diff2, autolagAIC) print(f2阶差分后 p-value: {result_diff2[1]:.4f}) d 2我把差分阶数 d 显式设成变量后面建模时直接复用。一个容易忽略的细节diff()之后序列长度会少 1后面建模时用series[d:]对齐真实样本避免索引错位导致预测值跟实际日期对不上。业务序列里我基本没见过需要 d3 的情况如果二阶差分之后仍然不平稳先别急着加阶数回去看一眼数据里是不是有离群点或重复段。2.3 白噪声排除与对数变换建模前的最后检查第三步是排除白噪声。白噪声意味着序列已经没有可被模型利用的自相关结构差分后的序列如果本身就是白噪声ARIMA 的 p、q 应该都是 0硬加参数只会让模型去拟合噪声。这里用 Ljung-Box 检验from statsmodels.stats.diagnostic import acorr_ljungbox lb_test acorr_ljungbox(series_diff1, lags[10], return_dfTrue) print(lb_test[lb_pvalue])p 值大于 0.05 时残差近似白噪声序列里没有显著的滞后相关性这时再做 ARIMA 意义不大p 值小则说明存在可建模的自相关结构。这个检验在模型训练完以后还要再做一次两次都通过才算闭环。第一次是确认序列有信号第二次是确认模型把信号榨干了。对数变换也要在这个阶段决定。如果序列的波动幅度跟水平值成正比——比如销量从 100 涨到 10000方差也跟着放大——直接差分得到的是非齐性方差建模效果不稳定。我一般先画一下原始序列和取对数后的序列看波动是否被压平。需要时用np.log1p(series)做对数变换预测完再np.expm1()还原。源码里的示例数据刚好是方差随水平放大的类型所以数据预处理脚本里对数变换是默认开启的。3. 定阶与参数选择ACF/PACF读图、auto_arima与信息准则的配合3.1 从PACF截尾和ACF拖尾确定候选阶数差分完成后进入 p 和 q 的定阶。教科书方法是同时看 ACF 和 PACF 两张图PACF 在滞后 k 阶处截尾说明 p 可以取 kACF 截尾说明 q 取对应阶数。画图代码import matplotlib.pyplot as plt from statsmodels.graphics.tsaplots import plot_acf, plot_pacf fig, axes plt.subplots(1, 2, figsize(12, 4)) plot_acf(series_diff1, axaxes[0], lags20) plot_pacf(series_diff1, axaxes[1], lags20, methodywm) plt.tight_layout() plt.show()读图时有个坑PACF 在第 1 阶突出、第 2 阶稍微冒头时很多人直接定 p2结果 AIC 比 p1 高出一截。图只给候选范围真正做决定的是信息准则。我的读法是先看 PACF 是否有明显截尾再看 ACF 是否拖尾如果两张图都是缓慢衰减说明序列可能还残留趋势回上一章检查差分阶数。methodywm是 Yule-Walker 方法的改进版对短序列的 PACF 估计比默认方式稳定。样本量少于 200 时我会显式指定这个参数否则画出来的 PACF 在低阶处容易抖动干扰判断。3.2 用pmdarima自动定阶参数配置和搜索策略人工读图定阶对新手不友好而且业务数据通常没有教科书那么干净的截尾特征。实际项目里我建议先用pmdarima的auto_arima自动扫一遍拿到候选阶数后再手动验证。这不是偷懒是把模型选择交给信息准则去优化人只做方向判断。from pmdarima import auto_arima stepwise_model auto_arima( series, # 传入已做平稳化处理的序列 start_p0, max_p5, start_q0, max_q5, d1, # 上一章确定的差分阶数 seasonalFalse, # 示例数据不带季节周期先关闭 traceTrue, # 打印搜索过程方便观察收敛方向 error_actionignore, suppress_warningsTrue, stepwiseTrue, information_criterionaic ) print(stepwise_model.order) print(stepwise_model.summary())重点解释几个参数。stepwiseTrue时不遍历全部 p×q 组合而是走类似贪心路径先设一个基准模型然后尝试上下微调 p、q保留 AIC 更优的方向耗时大幅下降。information_criterionaic控制选模型依据换成bic时对参数惩罚更重结果通常阶数更小。我习惯先用 AIC 选再用 BIC 复核两个准则结论不一致时取阶数小的一侧。seasonalFalse这里特意关掉季节性搜索。如果数据里有周度或年度周期不先做季节分解直接丢给auto_arima它会把季节阶数混进非季节阶数里导致 p、q 被拉得很高。源码附带的示例数据不涉及季节性但换自己的业务数据时如果有明显周期要同时打开seasonalTrue并设置mm 是周期长度月度数据填 12周数据填 7。3.3 手动比对AIC/BIC别把自动结果当成唯一答案auto_arima给出的阶数不一定适合实际业务解释两个原因一是在搜索空间边界上表现不稳定换一组max_p可能得到不同结果二是纯靠信息准则选出来的高维参数不一定符合数据生成逻辑。我会把自动结果当起点再手动比较几组相邻阶数from statsmodels.tsa.arima.model import ARIMA import itertools p_range range(0, 4) q_range range(0, 4) d 1 results [] for p, q in itertools.product(p_range, q_range): try: model ARIMA(series, order(p, d, q)) model_fit model.fit() results.append((p, q, model_fit.aic, model_fit.bic)) except Exception: # 某些阶数组合在数值上不可解直接跳过 continue results.sort(keylambda x: x[2]) for p, q, aic, bic in results[:5]: print(fARIMA({p},{d},{q}) AIC{aic:.2f} BIC{bic:.2f})model.fit()输出的aic和bic可以直接用不用另算。一个工程细节不同阶数下样本起点会有差异严格说 AIC 并不可直接比较但业界普遍接受这种近似只要阶数差异不大、样本量充足结论基本可靠。我一般会人为排除 p、q 同时大于 3 的组合高维模型在业务预测里很难解释对数据分布变化的鲁棒性也差。定阶后还要检查系数显著性。model_fit.summary()里每个参数都有 coef 和 P|z| 两列如果某个参数的 p 值大于 0.05说明这阶可能冗余降一阶重跑。这一步很多人跳过结果模型 AIC 很低但预测曲线抖动剧烈多半就是混进了不显著的高阶项。4. 训练、评估与滚动预测划分、指标与两种预测方式4.1 按时间划分训练集与测试集别把最后一段数据拿去训练时间序列划分跟普通机器学习完全不同不能用train_test_split随机切。序列的前后顺序是信息的一部分随机打乱会把未来信息泄露到训练集里。正确做法是把最后一段连续数据留作测试train_ratio 0.8 split_idx int(len(series) * train_ratio) series_train series.iloc[:split_idx] series_test series.iloc[split_idx:]划分比例没有绝对标准。几百个点以下我留 15%20% 做测试超过一千个点可以留 10%。注意测试集要保留原序列的索引和频率后续计算误差时才能按时间对齐。最稳妥的检查方式是打印series_train.index[-1]和series_test.index[0]确认它们是相邻时间点中间没有跳空。4.2 误差指标的正确选择MAE、RMSE与MAPE的坑评估预测效果时我同时算三个指标因为各有侧重。RMSE 对大误差敏感适合用来发现极端偏离MAE 反映平均绝对误差易于解释MAPE 不依赖量纲方便跨序列对比。from sklearn.metrics import mean_absolute_error, mean_squared_error mae mean_absolute_error(series_test, pred) rmse np.sqrt(mean_squared_error(series_test, pred)) mape np.mean(np.abs((series_test - pred) / series_test)) * 100 print(fMAE{mae:.2f}, RMSE{rmse:.2f}, MAPE{mape:.2f}%)选模型时我先看 RMSE 在训练期和测试期的差距如果训练期远小于测试期大概率是过拟合此时要降阶数而不是加参数。MAPE 有个先天的坑测试集里只要有接近 0 的值百分比会异常放大这种情况改用对称 MAPESMAPE或直接看 MAE。不要因为某个指标好看就下结论三个指标放在一起看趋势才靠谱。4.3 forecast与滚动一步预测两种落地方式ARIMA 的预测有两种常见用法。一次性多步预测适合给出未来 n 个点的整体走势滚动一步预测适合模拟业务里「每天能拿到新观测值」的场景。两者预测结果往往差不少先看代码# 方式一一次性多步预测 model ARIMA(series_train, orderorder) model_fit model.fit() pred model_fit.forecast(stepslen(series_test))# 方式二滚动一步预测 history list(series_train.values) pred_rolling [] for t in range(len(series_test)): model ARIMA(history, orderorder) model_fit model.fit() yhat model_fit.forecast().iloc[0] pred_rolling.append(yhat) history.append(series_test.iloc[t])滚动预测每个时间步都要重新估计参数训练开销大得多但数据有漂移时准确率通常比一次性外推高。我交付时会给两个版本业务方如果做月末下月预算用多步外推每日收盘后预测次日数值用滚动。另外注意predict(start, end)和forecast(stepsn)的区别前者可以回看训练集内的拟合值真正面向未来预测必须用forecast用错的话预测结果里会混入已观测值的拟合残差。5. ARIMA建模避坑记录五个高频问题与排查思路5.1 预测曲线变成水平直线完全看不出跟随性现象预测值是一条水平线后续所有点都落在同一个数值附近真实波动完全没体现出来。原因差分阶数 d 设大了把趋势和波动全部磨平模型学到的只剩均值另一种可能是过差分后 ACF 第 1 阶出现显著负相关模型被强制往均值回归。解决减小 d重新做 ADF 检验。差分后如果 ACF 第 1 阶自相关系数接近 -0.5基本可以断定是过差分。这时回退到上一阶差分并检查原序列是否有确定性趋势被过度剥离。5.2 整体误差不高但误差集中在某一段时间内现象MAE、RMSE 都好看但把预测和真实值按时间画出来误差明显堆在某个连续区间里。原因序列在该时段出现结构性断点比如价格跳变、活动冲击模型在训练期完全没见过这种模式。ARIMA 本身没有外生变量支持遇到断点只能被动承接。解决把异常区间标记出来分段建模如果周期固定加季节性参数如果断点来自已知事件把事件作为外生回归变量加入模型虽然 statsmodels 的 ARIMA 不直接支持外生变量但可以换用 ARIMAX 的SARIMAX接口。5.3 随机划分训练集导致预测结果虚高现象用train_test_split切完数据后预测误差小得离谱换自己的数据就崩。原因随机划分把未来数据混进了训练集模型提前看到了测试窗口的信息属于典型的数据泄露。解决严格按时间顺序划分并且要让测试集的起点严格等于训练集终点的下一时刻。我每次写完划分代码都会打印两端索引做断言防止索引错位。5.4 训练报错 Singular matrix 或模型不收敛现象model.fit()抛出LinAlgError: Singular matrix或者反复迭代但参数不更新。原因序列里有大段重复值或常量片段协方差矩阵不可逆也可能是索引有空洞数据没对齐。这问题在默认参数下很玄学通常不是算法问题而是数据问题。解决先series.value_counts()检查重复段对常量片段做平滑或插值再把索引重置为连续日期缺失日期补 NaN 后做填充。把这些处理完Singular matrix 基本不会再出现。5.5 auto_arima 搜索耗时极长跑十几分钟不出结果现象auto_arima卡死在搜索阶段日志一直在跑但迟迟收敛。原因max_p、max_q设置过大同时开了seasonalTrue搜索空间成倍膨胀。解决用stepwiseTrue限制为逐步搜索把max_p、max_q控制在 5 以内季节性周期 m 先通过周期图或业务常识确定不盲目开季节搜索。如果数据量超过五千个点先抽一段做定阶确定阶数后再全量训练比直接跑全量快得多。6. 让模型跟上数据更新walk-forward验证与自动重拟合walk-forward 验证的核心思想是把数据集按时间切成多段每段依次充当验证集模型每次都只用验证集之前的数据训练。这本质上模拟了模型上线后的真实运行方式跟单次划分相比它给出的是多个时间段误差的分布而不是一次预测的运气。n_splits 5 fold_size len(series_test) // n_splits mae_scores [] history_all list(series_train.values) for i in range(n_splits): start_idx len(history_all) end_idx min(start_idx fold_size, len(series)) val_y series.iloc[start_idx:end_idx].values model ARIMA(history_all, orderorder) model_fit model.fit() pred model_fit.forecast(stepslen(val_y)) mae_scores.append(mean_absolute_error(val_y, pred)) # 关键步骤本次验证段并入历史下一轮重拟合 history_all history_all list(val_y) print(fwalk-forward MAE: {np.mean(mae_scores):.2f} ± {np.std(mae_scores):.2f})每次验证结束历史窗口吞入新数据下一轮模型是重拟合过的。这个流程特别适合定期重训的生产环境。我上线后一般直接把它改造成每日定时任务晚上拿当天真实数据更新模型第二天预测时用的就是最新参数彻底避开「模型三个月没更新、预测值越飘越远」的问题。这套方法最早用在一个销量预测报表上。最初模型训练一次就上线跑了三周误差开始变大改成每日 walk-forward 重拟合之后MAE 降了大约三分之一。从那以后我每次交付时间序列项目都会强制把 walk-forward 验证写进交付清单而不是只给一份训练完的模型文件。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
go-toml v2 完全指南:在 Go 与 LinuxKit 中高效解析与生成 TOML 配置 操作系统云原生容器运行时 【免费下载链接】linuxkit A toolkit for building secure, portable and lean operating systems for containers 项目地址: https://gitcode.com/gh_mirrors/li/linuxkit 点击查看 免费下载 导读
本文围绕 LinuxKit 仓库中随 linuxkit… · 2026/9/27 23:39:38
OpenSSL 3.3.2预编译库VS2019接入与链接避坑指南 简介:这是一份已针对Windows 10和MSVC2019 x64环境编译完成的OpenSSL 3.3.2库压缩包,同时提供动态库与静态库两种形态,可避免开发者自行编译时在依赖库、工具链配置上耗费大量时间。面向需要在Windows平台进行C/C网络程序开发、需要集成SSL/T… · 2026/9/27 23:39:38
pixi 全局安装的 Trampoline 机制:架构、配置与运行原理深度解析 开发工具CLI包管理器任务调度 【免费下载链接】pixi Powerful system-level package manager for Linux, macOS and Windows written in Rust – building on top of the Conda ecosystem. 项目地址: https://gitcode.com/gh_mirrors/pi/pixi 点击查看 免费下载 导… · 2026/9/27 23:39:32
3个技巧搞定wordpress调用微博,附源码下载避坑指南 3个技巧搞定wordpress调用微博,附源码下载避坑指南 网站被黑挂马不知道怎么办?别慌,这往往不是代码问题,而是权限配置太松。很多站长一遇到后台异常登录、页面弹出赌博广告,第一反应是重装系统,其实 80% 的情况源于第三方插件的… · 2026/9/28 0:19:23
0代码做网站工作避坑指南:2024最新速查手册 0代码做网站工作避坑指南:2024最新速查手册 自己不会代码想做网站,这大概是过去三年我听得最多的一句话。很多老板、运营甚至刚入行的新人,拿着“我想做个官网”的需求找到我,眼神里透着焦虑:怕被坑、怕太贵、怕做出来不好看。今天我不讲虚的,直接… · 2026/9/28 0:19:23
新手入门gzip压缩网站:3个配置坑让加载快50% 新手入门gzip压缩网站:3个配置坑让加载快50% 改个需求建站公司拖一周,这种经历在行业里太常见了。很多刚入行的前端或运营新手,面对这种低效沟通往往感到无力。其实,除了沟通技巧,技术层面的优化才是硬道理。今天咱们聊的 gzip压缩网站… · 2026/9/28 0:19:04
3步搞定wordpress中文博客模板下载,告别等待的完整流程 3步搞定wordpress中文博客模板下载,告别等待的完整流程 改个需求建站公司拖一周,这种憋屈感谁懂?我做过10年建站,见过太多老板花几万块定制,结果改个颜色都要排队。其实想要个漂亮的中文博客,根本不用找外包。WordPress中文博客模… · 2026/9/28 0:18:10
2026最新网站查询访问域名避坑指南 2026最新网站查询访问域名避坑指南 备案流程一头雾水?别慌。很多新手刚接手网站项目,对着工信部备案系统发呆,分不清域名解析、服务器绑定和访问验证的区别,更不知道2026最新政策对“网站查询访问域名”有哪些硬性要求。… · 2026/9/28 0:17:58
娱乐彩票网站建设制作避坑指南:模板vs定制实战对比 娱乐彩票网站建设制作避坑指南:模板vs定制实战对比 别信那些“一键生成”的鬼话。上周一个客户拿着某知名模板站找我改,首页加载慢了8秒,后台数据全乱,看着就廉价。做娱乐彩票这类高敏感、高并发站点, 模板网站太丑不够用… · 2026/9/28 0:17:46
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
制作网页比较方便的软件怎么选?一文搞懂避坑指南 制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25