☰
基于ARIMA的新能源汽车销量预测:差分定阶与三个月滚动窗口
2026/10/31 2:57:57 网站建设 项目流程

简介:这份PDF面向经济统计、数据分析方向的高校学生与研究者,以及关注新能源汽车市场的行业从业者,围绕如何用时间序列方法预测月度销量这一问题展开。全文从ARIMA模型的原理讲起,说明差分运算如何把非平稳序列转换为平稳序列,以及如何通过自回归与移动平均的滞后项拟合来完成建模;随后以中国汽车工业协会等来源的2014年1月至2019年5月新能源汽车月销量为样本,完整呈现季节性分解、ADF单位根检验、ACF与PACF定阶、ARIMA(1,0,0)(1,1,0)参数估计与显著性检验等环节,并用2019年3月至5月数据做验证,相对误差约5%至9%,同时客观指出极值月份误差偏大、有效预测窗口约三个月等局限。压缩包为单一PDF文档,约1.11MB,一册即可读完整个建模流程与预测对比表格。目前已有480人学习,适合想快速掌握ARIMA实操框架、为课程论文或企业销量研判寻找可复用范例的读者参考。

1. 从一张误差 5% 的预测表说起

新能源汽车销量预测常被理解成宏观变量的组合题:补贴退坡、油价波动、充电桩密度、牌照供给。但把六年的月度数据拉成一条曲线,先做一次季节差分,再拟合一个非零系数只有两项的 ARIMA 模型,三个月滚动预测的相对误差就落在 5% 到 9% 之间。这个结果略带反直觉——销量序列里真正能被稳定预测的部分,不是外部变量,而是序列自己的惯性。这份《基于 ARIMA 模型的新能源汽车销量预测》值得细读的地方,也不在精度数字本身,而在于它把「什么时候该停手」写清楚了:超过三个月不给结果,极值月份主动认错。一个预测方法敢划出自己的失效边界,信息量比报喜的精度更大。下面把它一层层拆开:差分在消掉什么、六个参数各管哪一段、统计软件输出表里每个数字的来历,以及落地时最容易翻车的几处。

2. 差分与平稳化:为什么非要把序列「磨平」才肯动手

2.1 非平稳序列的两个明显问题

把 2014 年 1 月到 2019 年 5 月的月度销量画成折线,肉眼就能看到两件事:整体重心在持续抬高,同时每年 2 至 3 月有一个明显的凹陷、10 月到次年 1 月有一个凸起。这两件事对 ARIMA 来说都是障碍。

ARIMA 的整套推断建立在「序列的均值、方差、自协方差不随时间平移而改变」这个前提上。一旦均值随趋势漂移,模型用历史均值去估计未来就会系统性偏低;一旦季节波动幅度随规模放大,方差就不再是常数,参数估计的置信区间会失真。更麻烦的是自相关:在一条上升序列里,相邻两期天然高度相关,但这种相关来自共同的趋势,而不是「上一期卖得好导致这一期卖得好」的因果关系。直接拿这种伪相关去定阶,得到的 p 和 q 会大得离谱,模型看起来拟合得很好,一旦趋势转向就立刻崩掉。

所以预处理的目标不是把数据「洗干净」这种模糊说法,而是把一个带趋势和季节的序列,拆成「可被线性滞后结构描述的部分」加「近似白噪声的残差」。这一步做扎实了,后面的定阶才有意义;这一步糊弄过去,后面所有 R 方都是虚的。

2.2 一次差分到底把什么变成了什么

一阶差分的定义很朴素:用后一期减前一期,得到增量序列。它的作用是消掉常数级别的线性趋势——如果原序列每期平均增长 c,那么差分后每期的增量就在 c 附近波动,均值不再漂移。这份资料里,原始数据先做过异常离散点的移位处理,再做一次差分,然后序列才表现出平稳特征。

季节差分是同一套思路,只是间隔从 1 期换成了 12 期。用今年某月减去去年同月,得到的是「同比增量」,这一减直接把「每年 2 月都低、每年 12 月都高」这种固定形态从序列里扣掉了,因为同一个月份在两个年份里被同时减去。对于月度数据,季节周期 s 取 12 是默认动作;对于季度数据取 4,对于周数据取 52,取错周期等于没做。

import numpy as np # y: 月度销量序列,按时间升序排列,索引 0..n-1 # 第一步:季节差分(s=12),做的是"今年这个月比去年同月多卖了多少" y_season = y[12:] - y[:-12] # 第二步:一阶差分,把季节差分后残余的线性趋势再压一遍 y_d = np.diff(y_season) # 注意:这一步之后序列长度变成 n-13 # 差分是有代价的,每差一次损失 s 个观测,样本本来就短时尤其要算清楚

这段代码的价值在于让你看清长度代价。原始样本 65 个月(2014 年 1 月至 2019 年 5 月),做一次季节差分就只剩 53 个点,再做一阶差分只剩 52 个。样本量掉到 50 出头时,季节项的参数估计已经不算宽裕了,这也是原文把预测窗口压在三个月的原因之一:模型不是越复杂越好,参数一多,样本一薄,估计方差就上来了。

差分还有一个容易被忽略的性质——它改变了「残差」的含义。差分后拟合出的残差,是原序列在扣除趋势和季节之后的意外成分;模型预测出来的值,也必须经过逆差分才能还原成「万辆」这个业务单位。逆差分的过程就是把增量和季节增量一层层加回去,漏掉任何一层,输出就会变成增量而不是销量。

2.3 ADF 检验:判断「磨平」到什么程度才算够

差分次数不能凭感觉。d 取 1 还是取 2,直接决定模型的稳定性和预测区间的宽度。这份资料用的是 ADF 单位根检验作为判据:检验的原假设是「序列存在单位根,即不平稳」,如果检验统计量落在拒绝域、p 值小于 0.05,就拒绝原假设,认为序列已经平稳,可以停止差分。

判断逻辑可以概括成一句话:差分的目的是让检验通过,不是让曲线看起来更平。常见的误操作是不断差分直到序列「看起来」没有趋势,结果 d 取到 2 甚至 3,序列变成高频噪声,方差被放大,自相关结构反而被破坏,最后拟合出的模型预测能力极差。

ADF 检验还有三个容易出问题的地方。其一是检验形式:是否带常数项、是否带趋势项,选择不同结论可能相反,实践中一般先带常数项与趋势项跑一次,不显著再退到只带常数项。其二是检验的势:样本只有 50 多个点时,ADF 检验对接近单位根的序列分辨力不强,容易把弱平稳误判成不平稳。其三是季节单位根:ADF 只检验常规单位根,对季节单位根无能为力,需要用到季节差分检验(如 HEGY 检验)。这份资料里季节差分 D 直接取 1,是基于月度序列常年呈现的固定季节形态做的先验判断,而不是被某个检验严格推出来的。

提示:ADF 通过不等于模型可用。它只说明序列的均值和自协方差大致稳定,不说明残差是白噪声。残差还有自相关的话,说明定阶没做对,这一步必须回头看 ACF 图。

做完这一整套,序列才具备被 ARIMA 处理的资格。这个过程听起来繁琐,但它本质上是把「先验假设」变成了「可检验的中间结论」——每一步都能被证伪,而不是凭经验拍脑袋。这大概是时间序列方法里最像工程的一部分。

3. 六个参数的来历:ARIMA(p,d,q)(P,D,Q) 每一格在管什么

3.1 小写 p、d、q:非季节部分的三个旋钮

ARIMA 的小写参数管的是「相邻两期之间」的关系,不涉及跨年。

p 是自回归阶数,意思是当前值用过去几个值来线性解释。p=1 表示只用上一期;p=2 表示用上两期,以此类推。自回归项捕捉的是序列的「惯性」——这个月卖得多,下个月大概率还是多。p 定得过大,模型会把噪声当成信号学进去,样本外表现会差,这就是所谓的过拟合。

d 是非季节差分次数,就是上一章讲的那个。d=0 表示原序列已经平稳,直接建模;d=1 表示差分一次。原文最终取 d=0,因为在季节差分这一步里已经把趋势处理掉了,再差分一次属于过度处理。

q 是移动平均阶数,意思是当前值用过去几个「预测误差」来解释。它和 p 的直觉差别在于:p 看的是过去的观测值,q 看的是过去的意外。q=1 表示模型会把上一期预测偏掉的那部分残差,按一定比例补到这一期的预测里。原文取 q=0,也就是完全没有移动平均项,模型结构极其精简。

把 (p,d,q) 理解成「用过去的观测、过去的意外,加上差分的次数,去解释现在」,比背定义有用得多。它本质上是一个带差分预处理的线性回归,只不过回归的自变量是序列自己的历史。

3.2 大写 P、D、Q:季节项怎么和小写项叠在一起

大写参数的作用对象不是「上一期」,而是「上一个周期的同一相位」。月度数据里,那就是 12 期之前。

P 是季节自回归阶数,用去年同月的值来解释今年同月的值;D 是季节差分次数;Q 是季节移动平均阶数,用去年同月的预测误差来修正今年同月。原文取 (P,D,Q)=(1,1,0),意味着用去年同月一个滞后项、做一次季节差分、不用季节移动平均。

关键在于这两组参数不是简单相加,而是相乘。模型的完整形式是把非季节自回归多项式和季节自回归多项式乘在一起,再作用到差分后的序列上:

# (1,0,0)(1,1,0)_12 的展开形式,B 为滞后算子,B*y_t = y_{t-1} # (1 - phi*B) * (1 - Phi*B**12) * (1 - B**12) * y_t = e_t # # 逐层展开: # 第一层 (1 - B**12) : 季节差分,扣掉"每年重复的形态" # 第二层 (1 - phi*B) : 相邻两期的惯性修正 # 第三层 (1 - Phi*B**12) : 跨年同月之间的惯性修正 # # 乘开之后会出现一个 B**13 的交叉项,系数为 phi*Phi # 这一项的含义是:去年同月的"增量惯性"会以衰减形式影响本月

这个乘法结构解释了为什么 ARIMA 能用很少的参数描述相当复杂的形态。原文模型只有两个自由系数(φ 和 Φ),却同时处理了相邻惯性、跨年惯性、季节形态和趋势漂移。参数少带来的好处是稳定性:样本只有 50 多个点时,两个系数的估计方差远小于十个系数,预测区间也就更窄、更可信。

代价是表达力受限。乘法结构假设季节形态的幅度随整体规模成比例变化(这也是图 2 里季节因子以乘法方式提取的含义),如果实际业务里季节波动的绝对幅度基本固定、不随销量增长而放大,这个假设就偏了,残差里会留下结构。

3.3 从 ACF/PACF 到 p=1、q=0 的定阶路径

定阶靠两张图:自相关函数 ACF 和偏自相关函数 PACF。读法可以压缩成一张判据表。

图形表现指向的结构对应参数
ACF 拖尾、PACF 在 1 阶后截尾自回归结构p=1
ACF 在 1 阶后截尾、PACF 拖尾移动平均结构q=1
ACF 与 PACF 均拖尾混合结构p、q 同时非零
PACF 在 lag 12 处出现显著尖峰季节自回归P=1
ACF 在 lag 12 处出现显著尖峰季节移动平均Q=1

原文的定阶结果是 p=1、q=0、P=1、Q=0,即 (1,0,0)(1,1,0)。翻译过来就是:差分后的序列,PACF 在第 1 阶之后基本落在置信带内,说明相邻惯性只需要一期;ACF 没有在第 1 阶后陡峭截断,说明不需要移动平均项;在 lag 12 附近的 PACF 上有一个孤立尖峰,对应季节自回归的一阶。

这张表只是入门判据,实际操作里 ACF/PACF 的截尾往往不干净,尤其是样本量只有 50 出头时,置信带本身就宽,两三个滞后项都可能擦边。这时通常不靠肉眼硬看,而是用信息准则兜底:把候选的几组 (p,q)(P,Q) 都拟合一遍,比较 AIC 或 BIC,取最小的一组,同时要求所有系数显著、残差通过白噪声检验。原文提到「取 p=1、q=0 建立模型效果较为理想」,措辞是「较为理想」而不是「最优」,这个谨慎是对的——50 多个点的样本上比较 AIC,差距在 2 以内基本没有区分力。

还有一点容易被跳过:定阶必须在差分之后做。拿原始未差分的序列去看 ACF,会看到衰减极慢的长尾,那是趋势造成的伪相关,据此定出的 p 会虚高。正确顺序永远是先定 d 和 D,再在差分后的序列上看 ACF/PACF 定 p、q、P、Q,顺序错了后面全是无用功。

4. 拟合与预测:输出表里每个数字在说什么

4.1 参数估计与显著性:Sig 小于 0.05 意味着什么

统计软件对 AR(1) 项的估计会输出系数值、标准误、t 值和 Sig。原文给出的结论是 Sig<0.05,模型满足统计学要求。

这句话的确切含义是:在「该系数真实值为 0」这个原假设下,观测到当前估计值(或更极端值)的概率小于 5%,因此拒绝原假设,认为自回归系数不为零。换句话说,去年同月的销量对今年同月的销量确实有解释力,不是巧合。

但显著不等于有用。系数显著只能说明「这个变量有信息」,不能说明「这个模型预测得准」。样本量一大,哪怕系数只有 0.05,也会显著。反过来,样本只有 50 多个点时,一个真实有效的系数也可能因为标准误过大而不显著,这是统计功效不足,不是模型错了。看到一个不显著的系数就删掉它,在短样本上是很危险的动作。

真正需要盯的是系数的取值区间。AR(1) 系数 φ 的绝对值必须小于 1,否则序列会发散,预测值会指数级放大。季节 AR 系数 Φ 同理。统计软件一般不会主动拦住你,它会把 1.02 这样的系数照常输出,然后预测曲线在几步之后冲天而起。这是新手最容易踩的坑之一,后面还会展开。

4.2 两个 R 方:0.538 与 0.932 的落差从哪来

输出里同时给了两个拟合优度:平稳 R 方 0.538,整体 R 方 0.932。这两个数差了一倍,很多人看到会以为软件算错了,其实是两个不同的分母。

整体 R 方比较的是「预测值 vs 原始观测值」,分母是原始序列的总变异。由于原始序列本身有巨大的趋势和季节波动,而模型通过季节差分把这两块几乎完整地复制了出来,所以整体 R 方自然很高——0.932 里有相当大一部分是差分的功劳,不是模型的功劳。

平稳 R 方比较的是「差分后序列的预测值 vs 实际值」,分母是剔除趋势和季节之后剩下的变异。这部分才是模型真正要解释的东西,0.538 说明它解释了约一半的残差波动,剩下一半归因于随机因素和模型没捕捉到的结构。

这个落差本身就是一条重要信息:模型的主要贡献在于正确地刻画了趋势和季节形态,而不在于精准预测每一期的偏离。理解了这一点,就不会对「R 方 0.93 却还是有 9% 误差」感到困惑——那 9% 恰恰落在平稳 R 方覆盖不了的那一半里。

4.3 三个月窗口与相对误差的读法

原文用 2019 年 3 月至 5 月的数据做验证,结果如下。

时间实际销量(万辆)预测值(万辆)相对误差误差绝对值
2019 年 3 月12.611.59%1.1
2019 年 4 月9.79.25%0.5
2019 年 5 月10.19.56%0.6

三个月的误差分别是 9%、5%、6%,绝对误差在 0.5 到 1.1 万辆之间。这个精度对月度产销计划的调整是有用的,对单车级别的排产决策就不够。判断一个预测模型能不能用,关键看误差量级和决策颗粒度的匹配,而不是看百分比好不好看。

更有信息量的是误差的方向:三个月全部低估。这不是随机波动,而是系统性偏差,说明模型的趋势项略偏保守,可能的原因是训练窗口末端(2018 年底)有一个销量高点,季节差分把这个高点带进了参数估计,使得后续的基准水平被压低。系统性偏差比随机误差更值得处理,因为它可以通过一个简单的偏移校正消掉,而随机误差不能。

还有一处必须点明:预测区间。图 3 里除了实测和拟合线,还有 UCL 和 LCL 两条上下界,随着预测步长增加呈喇叭口张开。这是 ARIMA 的必然性质——h 步向前预测的方差是残差方差与系数平方的累积和,步长越大,可用的真实观测越少,不确定性单调上升。三个月处的区间宽度和六个月处完全不是一个量级,任何引用预测值做决策的场景,都必须把区间一起看,只报点预测等于隐藏风险。

5. 常见问题与排查:落地时最容易翻车的五处

5.1 极值月份误差突然放大

现象:整体拟合曲线贴合得很好,但 2018 年 12 月这种销量冲到 22.5 万辆的月份,预测值明显偏低,残差是一个巨大的负值;而最低谷的 3.4 万辆月份又明显偏高。

原因:ARIMA 是线性模型,它学到的是「平均意义上的惯性」,对超出历史波动范围的点没有外推能力。季节差分把极值点变成了一个异常大的季节增量,这个增量会作为一个观测进入参数估计,把系数往极端方向拉一点,但对极值本身仍然是低估——因为模型不相信这种量级会重复出现。

解决:把极值月份单独标注出来,用干预分析(intervention analysis)加一个虚拟变量,或者用稳健估计降低单点权重。更工程化的做法是保留模型不变,但在输出端对残差绝对值超过两倍标准差的月份打标记,让使用方知道这个月的预测不可信。原文在结语里承认「在极值处的预测误差有时会较大」,这是诚实,也是这类模型的固有限制。

5.2 差分过度导致预测区间爆炸

现象:模型跑通了,系数也显著,但预测曲线在几步之后上下界张开得离谱,几乎失去参考价值。

原因:d 或 D 取得过大。很多人把「序列看起来不平稳」当成继续差分的理由,差到二阶、三阶,序列确实变平了,但每一阶差分都会放大方差,同时让 MA 多项式趋近不可逆,残差的自相关结构被破坏。最终模型对残差的建模是错的,误差累积速度远超预期。

解决:先用 ADF 检验确定最小必要的差分次数,通过即停。同时检查差分后序列的方差是不是明显大于差分前,如果差一次后方差翻了几倍,说明这一阶差分大概率多余。季节差分同理,D 一般不超过 1,取 2 的情况极少。

5.3 定阶靠眼缘,忽略残差检验

现象:ACF/PACF 图上挑了一组看起来最「干净」的阶数,拟合完成,R 方也不低,但样本外预测一塌糊涂。

原因:只看图形定阶,没做残差白噪声检验。图形判据在小样本上非常模糊,两三个滞后都可能落在置信带边缘,肉眼选出来的组合未必是信息准则支持的那个。更关键的是,如果残差里还残留自相关,说明模型没把结构抽干净,此时的 R 方是虚高的。

解决:定阶必须三件事一起做——图形初判、信息准则(AIC/BIC)比选、残差 Ljung-Box 检验。三者冲突时以残差检验为准:残差不是白噪声,模型就不能用,回去重新定阶或者换结构。这一步是硬门槛,不能跳。

5.4 把预测窗口拉到一年以上

现象:有人拿同一个模型预测未来 12 个月,画出来的曲线平滑漂亮,直接拿去做了年度规划。

原因:忽略了时间序列的「近大远小」效应。ARIMA 的 h 步预测最终会收敛到序列的均值(对差分序列则是收敛到某个线性趋势),也就是说步长足够大时,模型的输出和「历史平均值」没有本质区别,它不再携带任何当期信息。月度销量受政策、竞品、补贴节奏影响极大,一年之内发生结构性变化的概率很高,模型对此毫无感知。

解决:明确写下预测的有效期,原文给的是三个月,超过就不给结果。工程上可以把有效期做成参数,超出窗口的请求直接返回「不可靠」而不是硬算一个数。同时用滚动更新维持时效性:每进一个月新数据,就把最老的一个月挤出去,重新估计参数。样本窗口固定、内容滑动,这是让模型跟得上结构变化最省事的办法。

5.5 政策或口径变化造成的断点

现象:模型在某个月之后突然系统性高估或低估,误差不再是随机分布,而是一律偏一个方向。

原因:外部规则变了。补贴退坡、统计口径调整、车型分类变化,都会让序列的生成机制发生跳变。ARIMA 假设数据生成过程在整个样本期内是同质的,一旦有断点,它会把断点前后当成同一个过程拟合,结果两头都不准。

解决:先做断点检验(Chow 检验或结构变化检验),确认断点位置,然后在模型里加虚拟变量,或者干脆只用断点之后的数据重新建模。如果断点刚发生、后续样本还不够,正确做法是承认模型失效,等样本积累,而不是硬拟合。这一点上原文的表述很实在:政策改变必然造成销量改变,主要通过更新数据来更新预测结果。

6. 边界、组合与滚动:这套方法的取舍在哪里

ARIMA 在这份资料里表现出的取舍,可以浓缩成一句话:用极少的参数换取稳定性,代价是丧失对结构突变的响应能力。

两个自由系数、一个季节差分,构成了一个几乎不可能过拟合的模型。它在正常月份能给出 5% 到 9% 的误差,在极值月份会明显失准,在政策断点处会彻底失效。这个能力边界非常清晰,而清晰的边界本身就是一种工程价值——你知道什么时候可以信它,什么时候必须换方法。

如果要把这套东西往前推一步,有三条路值得试。第一条是组合预测:把 ARIMA 的输出和一个基于外部变量的回归模型(补贴额度、竞品上市节奏、充电桩增量)做加权平均,权重用历史误差的倒数来定。时间序列擅长捕捉惯性,回归擅长捕捉外生冲击,两者的失效场景不重叠,组合后的误差方差通常小于任一单模型。第二条是换季节结构:如果验证发现季节波动的绝对幅度不随规模增长,就该从乘法季节模型换到加法形式,或者用 SARIMA 的变体。第三条是滚动重估:固定 36 个月的窗口,每进一个月重新拟合一次,让参数跟着结构慢慢漂移,而不是一次性定死。

策略改动点适用场景主要代价
单模型 + 短窗口无结构稳定、样本短遇断点即失效
滚动重估窗口固定、逐月滑动结构缓慢漂移每月重算,参数不稳定
组合预测加权融合外生变量模型有可靠外部指标需要额外数据和权重标定
干预 + ARIMA加虚拟变量已知断点位置断点后样本不足时不可用

有一个判断我后来反复验证过:预测精度的提升,八成来自数据窗口和更新频率的调整,只有两成来自模型结构的复杂化。把 (1,0,0)(1,1,0) 换成 (2,1,1)(1,1,1),在 50 多个点的样本上,样本外误差通常不降反升,因为多出来的参数在拟合噪声。真正该花的力气在于:确认差分次数没多、确认残差是白噪声、确认预测窗口没超出时效。

从那以后我每次碰时间序列预测,都会强制走一遍「差分必要性 → 残差白噪声 → 窗口时效」这三道检查,参数复杂度放在最后考虑。见过太多次 R 方 0.95 的模型在样本外翻车,也见过结构简单到只有两个系数的模型稳稳当当跑了两年。这份资料的克制之处正在于此:它没有把 ARIMA 包装成万能解,而是老实交代了极值误差、三个月上限、政策敏感性,还留了一句「组合多种方法效果可能更理想」的口子。想照着复现一遍差分、定阶、验证的完整流程,或者想看看那两个 R 方在真实输出里长什么样,把这份 PDF 拿下来对着表 1 和图 3 慢慢比,会比只看结论有收获得多。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询