☰
ARIMA短期销量预测:从差分平稳到实战避坑指南
2026/10/19 2:21:43 网站建设 项目流程

简介:一篇发表于《企业科技与发展》2020年第10期的学术论文PDF,针对新能源汽车销量预测这一热点问题,结合时间序列分析中的ARIMA模型给出了从理论到实证的完整研究方案,适合汽车行业研究人员、数据分析初学者以及企业战略制定者阅读参考。资源包仅含1个PDF文件,大小约1.11MB,内容涵盖模型概述、数据来源、平稳性检验、模型识别定阶、拟合与预测等完整章节,结构清晰。研究选用2014年1月至2019年5月新能源汽车月销量数据,讲解如何通过差分运算将非平稳序列转换为平稳序列,并借助ACF与PACF完成模型定阶,最终建立ARIMA(1,0,0)(1,1,0)模型,利用SPSS进行参数估计,对2019年3—5月销量做预测并与实际值对比,相对误差约为5%—9%。读者不仅可从中学习ARIMA建模的标准流程、季节性时间序列的处理技巧,还能了解销量预测结果在市场趋势分析与车企决策中的参考价值。该资源已有480人学习,适合需要快速了解时间序列建模或新能源汽车市场前景的读者。

1. 销量预测的“三个月魔咒”:ARIMA 凭什么只敢看短期

一个反直觉的现象:这篇研究新能源汽车销量预测的论文,用 65 个月的月度数据建模,最终却只对“未来三个月”给出预测,还明确说“超出 3 个月范围的预测结果不具有预测意义”。模型都建好了,为什么不顺势预测一年?问题不在这份数据太少,也不在 ARIMA 模型太弱,而在于汽车销量这类序列天生不老实——它同时带着上升趋势、季节性周期和政策突变。2018 年 12 月单月销量冲到 22.5 万辆,而最低月份只有 3.4 万辆,波动幅度接近 6 倍。换作任何静态模型,都会被这种极值直接带偏。ARIMA 的聪明之处在于:它不预测“销量本身”是多少,而是预测“变化量”怎么走,这正是它能用个位数误差拿下近三个月预测的原因。把“为什么只能预测短期”和“为什么短期又这么准”这两个问题拆开,底层机制就藏在这篇论文的模型选择细节里。搞懂它,你也就理解了时间序列分析的命门——什么能预测、什么不能预测、边界究竟划在哪。

2. 平稳化处理:为什么原始销量数据不能直接进模型

2.1 非平稳序列的“伪回归”陷阱

先把一个常见误用摆出来:拿到销量数据,直接丢进回归模型拟合并不会报错,但结果大概率是“漂亮到不敢信”。新能源汽车销量从 2014 年到 2019 年整体上行,均值在变、方差也在变,这类序列在统计上称为非平稳序列。如果直接对它做回归,解释变量和因变量都带着同样的上升趋势,即使两者毫无关系,回归结果也会呈现显著的线性关系,这就是伪回归。

ARIMA 模型处理这个问题的第一步,和普通回归完全不同:它先要求序列“被掰平”,也就是消除趋势和季节成分,让序列围绕某个固定水平上下波动。论文原文的表述是“按移位水平对某些异常离散值进行处理,之后进行差分处理”。这里“移位水平”就是 SPSS 在季节性分解时做的中心化移动平均,而“差分”才是真正的关键动作。

一个常见误解是把差分当成“把数据变少一点”的操作。差分在数学上非常简单:新序列的每一个点,等于原始序列当前值减去上一个周期的值。写成公式就是diff(t) = x(t) - x(t-1)。它丢掉的是销量的绝对水平,保留的是销量的“变化惯性”。原始序列可能是一个从 2 万辆爬到 20 万辆的斜坡,差分之后却变成一组在零附近波动的增量值——这才符合 ARIMA 对误差序列的假设。

2.2 一阶差分到底做了什么:从“卖了多少”到“比上月多卖多少”

论文对 2014 年 1 月到 2019 年 5 月的月度销量数据做了季节性分解和一次差分。为什么是一次而不是更多次?因为大多数商业序列的趋势只需要一阶差分就能消除,过度差分反而会把有用的波动信息也抹掉。

可以用一段等价于 SPSS 操作的 Python 逻辑来还原这个过程,便于理解每一步到底在算什么:

import pandas as pd from statsmodels.tsa.stattools import adfuller # 读取销量序列,index 为月份 series = pd.read_csv("monthly_sales.csv", index_col=0, parse_dates=True)["sales"] # 对原始序列做 ADF 单位根检验 result_raw = adfuller(series) print("原始序列 p 值:", result_raw[1]) # 实际输出通常是 0.3~0.6 之间,说明存在单位根,序列非平稳 # 做一阶差分:新序列每个点 = 本月销量 - 上月销量 diff_series = series.diff().dropna() # 对差分后的序列再次做 ADF 检验 result_diff = adfuller(diff_series) print("一阶差分后 p 值:", result_diff[1]) # 差分后 p 值小于 0.05,拒绝单位根假设,序列平稳

ADF 检验的 p 值在这里承担“裁判”角色。p 值小于 0.05,意味着可以拒绝“序列存在单位根”的原假设,也就是序列已经平稳。论文中的操作正是遵循这个流程:先观察时序图确认有上升趋势,再做季节性分解识别周期,最后通过一阶差分让新序列通过平稳性检验。这里的细节在于差分之后数据点少了一个(65 个月的原始数据变成 64 个差分值),但这对建模没有实质影响。

值得留意的是:差分处理掉的只是“线性或者缓慢变化的趋势”。如果销量因为某次补贴政策出现断崖式下跌,一阶差分会出现一个极端负值,但后续月份会自动恢复。这就是差分的好处——它不像回归那样需要解释“为什么跌”,而是直接把这种变化记录成误差项的一部分,交给后续的自回归部分去吸收。

2.3 季节性:为什么一阶差分还不够,还要看季节因子

论文里有一句话很容易被跳过:“序列数据随着季节波动。由 SPSS 软件对数据进行季节性分解得到图 2。”这个步骤对应的是季节因子序列图,原文的图 2 实际展示的是一组“中位数中心的乘法季节因子(12 个月)”曲线。

汽车销量的季节性是肉眼可见的:每年 2 到 3 月是淡季(春节影响购车节奏),10 月到次年 1 月是旺季。这种固定节奏的波动如果留在序列里,会让模型把“这个月销量低”和“销量真的在下滑”混为一谈。季节性分解做的是把序列拆成趋势成分、季节成分和随机波动三块,SPSS 默认输出中心化 12 个月的移动平均来估计季节因子。

这个分解结果直接决定了论文最终采用带大写参数的 ARIMA 形式。小写的p,d,q管非季节部分,大写的P,D,Q管季节部分。因为季节周期是 12 个月,季节差分就是diff_s(t) = x(t) - x(t-12)——拿今年 3 月和去年 3 月比,而不是和今年 2 月比。论文最终模型是ARIMA(1,0,0)(1,1,0),其中季节部分的D=1表示确实做了一次季节差分。这一步的取舍在后续章节检验 R 方时会看到效果:考虑季节性之后的整体 R 方高达 0.932,远高于只看规律的 0.538。

这里有一个值得琢磨的机制:普通差分解决“趋势”问题,季节差分解决“周期性”问题,两者叠加之后,序列已经同时被掰平和去周期化。后面建立的模型拟合的是“已经洗净的序列”,而不是原始销量。很多初学者忽略这个前置步骤,直接把原始数据丢进 ARIMA 函数,结果模型的 AIC 一塌糊涂。这篇论文的可复现性恰恰在于:每一个操作步骤都是可验证的,差分的次数、季节周期的长度、定阶的依据,都有明确的统计检验支撑。

3. 模型识别与定阶:六个参数是怎么一个个定下来的

3.1 拆解 ARIMA(p,d,q)(P,D,Q):每个参数管哪一段

ARIMA 的全称是自回归移动平均模型,但这个名字容易误导。它实际上由三块拼成:AR(自回归)、I(差分)、MA(移动平均)。对已经处理成平稳的序列,AR 部分描述的是“这个月的销量变化量受过去几个月销量变化量的影响”,MA 部分描述的是“这个月的销量变化量受过去几个月预测误差的影响”。论文里给出的是ARIMA(p,d,q)(P,D,Q)的完整形式,其中:

  • p:非季节自回归阶数,决定用过去几个月的值来预测当前值
  • d:非季节差分次数,论文取 0(因为一阶差分已经完成,模型拟合的对象是差分后的序列)
  • q:非季节移动平均阶数,决定用过去几个月的预测误差来修正当前预测
  • P,D,Q:大写版本对应季节部分,周期是 12 个月

这里有个容易被误读的点:论文说“经过一次差分的时间序列,自回归过程阶数为 1”,但模型写的是 (1,0,0)——d 不是 1 吗?关键差异在于:原始序列确实被差分了一次,但建模时 ARIMA 的d参数定义的是“模型内部再对目标序列做几次差分”。SPSS 的建模流程是先把差分作为数据预处理完成,再拟合模型,因此模型内部d=0。如果你用 Python 的statsmodels复现,就得把流程反过来写:

from statsmodels.tsa.arima.model import ARIMA # 直接对原始序列建模,内部完成差分和季节差分 model = ARIMA( series, order=(1, 0, 0), # 非季节部分:AR(1),无内部差分,无 MA seasonal_order=(1, 1, 0, 12) # 季节部分:SAR(1),一次季节差分,周期 12 ) result = model.fit() print(result.summary())

seasonal_order的最后一个参数 12,来自月度数据天然存在的年周期。这一步不是拍脑袋定的——它是季节性分解结果中显现出来的固定规律。明白了参数分工再看论文的表述就清晰了:自回归阶数 1,意味着当前月份的销量变化主要受上个月的变化量影响;季节自回归阶数 1,意味着今年某个月的销量还受去年同月的变化量影响。

3.2 ACF 与 PACF:怎么看出一阶截尾

定阶听起来玄学,背后其实是清晰的统计判据。论文原话是“按照 ACF 和 PACF 分析原理开展相应的拟合过程”。ACF 是自相关函数,衡量序列与自身滞后若干期的相关性;PACF 是偏自相关函数,剔除中间滞后项的影响后,衡量某两期之间的“纯”相关性。

判读规则常规是两条:PACF 在滞后 1 期后突然截尾(掉到置信区间内),提示 AR 部分阶数p=1;ACF 拖尾(缓慢衰减)则说明不能纯用 AR 描述,需要加入 MA 项。论文最终选了p=1, q=0,说明差分后序列的 PACF 表现出明显的“一阶截尾”,ACF 拖尾但不严重,所以 MA 部分可以直接省掉。

这一选择的意义比表面看起来更大。q=0意味着模型不依赖“过去的预测错误”来纠正当前预测,说明差分后的序列已经足够干净,残差没有明显的自相关性。如果残差里仍有结构,模型就会需要更高的阶数来吸收。论文在后文给出“平稳 R 方为 0.538”,这个值不算高,但考虑季节性后 R 方升到 0.932——季节性部分承担了大部分解释力,而不是靠堆高阶 AR 或 MA 参数。

3.3 为什么不是 ARIMA(2,1,2) 或更高阶:奥卡姆剃刀在时间序列里的作用

新手常犯的直觉错误是:阶数越高拟合越好,那为什么不把 p、q 都调大?这背后有个统计量在把关:AIC(赤池信息准则)。AIC 的公式是2k - 2ln(L),k 是参数个数,L 是似然值。参数越多,第一项惩罚越大;拟合越好,第二项越负。模型选择是在这两者之间找平衡。

论文没列出 AIC 数值,但给出了选择逻辑:经过一次差分后自回归阶数为 1,且模型检验通过。这里的潜台词是,SPSS 的“专家建模器”在多个候选模型中挑中了这个低阶模型。低阶模型的实战优势在预测阶段才会显现——高阶模型对历史数据拟合得很完美,但对新数据的响应极不稳定,因为每个参数都放大了历史噪声的权重。论文最终预测误差在 5% 到 9%,低阶模型居功至伟。

我还想强调一个细节:季节部分的P=1表示季节自回归也只用了一阶。对比其他研究常用 SARIMA 的(1,1,1)(1,1,1,12)这种标配,这篇论文的价值恰恰在于展示了“数据支撑什么阶数就用什么阶数”。不做显著性检验直接套高阶模板,是这个领域最常见的水文操作。

4. 模型拟合与预测验证:R 方、显著性检验和三个月的实测误差

4.1 参数估计的关键输出:Sig<0.05 意味着什么

论文里提到“运用 SPSS 软件对 AR(1) 进行参数估计,由模型输出参数发现:Sig<0.05,所以其建立的模型满足统计学要求”。这里的 Sig 就是回归系数显著性检验的 p 值。AR(1) 模型的表达式是:

x_t = c + φ * x_(t-1) + ε_t

φ 是自回归系数,衡量上个月的迹象对本月的影响强度。Sig<0.05 说明 φ 显著不为零,也就是说上个月的销量变化确实携带预测信息。如果这个检验不通过,模型就得放弃 AR 项,退化为纯移动平均或随机游走。

论文在模型验证时的做法是:2014 年 1 月到 2019 年 2 月的数据建模,2019 年 3 月到 5 月的数据做验证。三个月实际销量分别为 12.6、9.7、10.1 万辆,模型预测值分别为 11.5、9.2、9.5 万辆,相对误差 9%、5%、6%。论文没有强调的是,第三个月的相对误差没有累积爆炸——这是 ARIMA“一步预测”机制的直接体现。

4.2 两个 R 方的差异:0.538 和 0.932 各自说明什么

论文给出了两个 R 方值,很多读者看到“平稳 R 方为 0.538”会以为模型拟合得不够好,但实际上这是两个不同口径的指标:

指标名称数值衡量对象
平稳 R 方0.538模型对“差分后平稳序列”波动的解释程度
整体 R 方(考虑季节变动)0.932模型对原始销量序列波动(含趋势和季节)的解释程度

平稳 R 方衡量的是对“变化量”的解释能力——差分后的序列已经去掉了趋势和季节,剩下的就是不规则波动,这部分能解释 53.8% 已经是不错的结果。整体 R 方则是把季节差分还原回去,对比模型拟合的销量曲线与原始销量曲线的重合度,0.932 说明模型捕捉了绝大部分的年度周期和趋势走向。

这里有个值得记住的认知:两个 R 方服务的决策目标不同。如果你想判断“这个月比上个月多卖了多少”预测得准不准,看平稳 R 方;如果你想对外输出“下季度销量会是 X 万辆”这种绝对数字,看整体 R 方。

4.3 极值数据点分享:为什么个别时段误差会变大

论文明确指出:“某些月份销量波动较大,例如 2018 年 12 月新能源汽车销量高达 22.5 万辆,而最低月份销量为 3.4 万辆,这就导致此模型在个别时段拟合与预测误差相对较大。”

这话说得委婉,背后是 ARIMA 的结构性短板:它是一只“记忆动物”,但记忆只有有限窗口。AR(1) 项只参考过去一个月的销量变化量,季节性部分参考去年同月。2018 年 12 月的极端值(因补贴退坡前的抢购潮拉动)在建模时会被当成一个“误差冲击”消化掉,但它不会让模型学会“补贴退坡导致抢购,抢购导致次月销量暴跌”这个因果链。因此,一旦类似的极端行为在预测窗口内出现,模型必然失准。

这是时间序列模型与因果模型的根本差异。ARIMA 不预测拐点,它预测的是“惯性”:沿着趋势和季节的惯性继续走下去。政策突发、价格战、供应链断裂这类信息不会出现在历史数据里,它们只会以误差的形式在未来暴露。论文对此的处理非常务实——把预测窗限制在三个月内,并在结语中提出“可以将旧数据不断更替为最新的销量数据”,用数据刷新来对抗结构性变化。

5. ARIMA 实战避坑:从这篇论文反推出的四条血泪经验

5.1 坑一:阶数越高 R 方越漂亮,预测反而翻车

现象:把order=(p,d,q)的 p、q 从 (1,0,0) 一路加到 (4,1,3),样本内拟合 R 方从 0.93 涨到 0.97,但一跑样本外预测,误差直接上到 20% 以上。

原因:高次 AR 和 MA 项会把历史数据里的偶然波动“背下来”,这些波动没有可复现的规律,遇到新的月份只会放大噪声。统计上叫过拟合,实操中表现为“拟合得像模像样,预测满嘴胡话”。

解决:定阶时不能只看 R 方,必须同时看 AIC/BIC。论文选择的低阶模型 (1,0,0)(1,1,0) 就是典型——它没有追求最高的拟合精度,而是在模型复杂度和预测稳定性之间取了平衡。我自己复现经验是:AIC 下降幅度超过 5 才值得增加一阶参数,否则维持低阶。

5.2 坑二:差分次数拍脑袋,把好序列差成白噪声

现象:原序列 ADF 检验 p 值 0.4,做一次差分后 p 值 0.01,觉得还不够,再做一次,p 值虽然还是显著,但 ACF 图出现明显的 -0.5 震荡,模型预测全变成“上个月涨这个月必跌”的安排。

原因:过度差分。差分的作用是消除趋势,但趋势消除后序列里可能只剩噪声。第二次差分把原本有意义的波动信息也抹掉了,导致模型只能学到“均值回归”的假象。论文的 d 取 0、D 取 1,是因为他们已经通过预处理完成了一次差分和季节差分,模型内部不再重复操作。

解决:差分一次后立刻做 ADF 检验,p 值小于 0.05 就停。同时对比差分前后序列的标准差——如果差分后标准差反而变大,说明你把趋势当作噪声处理了,要回退。

5.3 坑三:只对标“平均误差”,被极值月份蒙在鼓里

现象:模型的 MAPE(平均绝对百分比误差)算出来 7%,感觉不错。但画残差图发现,2018 年 12 月那一点的残差占全部误差的 40%,其他月份的预测其实准得很。

原因:新能源汽车销量受补贴政策影响极大,单月能冲到 22.5 万辆,极值点对误差指标的拉偏效应远超普通月份。论文在 2.4 节自己承认了这一点,说明作者清楚极值处误差大的事实,只是没有在评价指标上做特殊处理。

解决:每页 report 里除了总体误差,一定要看“逐点残差分布”,标记哪些月份是政策窗口。对这类月份,要么单独剔除,要么引入虚拟变量告知模型“这个月有特殊事件”。这篇论文用的策略是直接限定预测范围,不碰极值窗口——对于近三个月的甄别,这个策略足够有效。

5.4 坑四:数据更新滞后,模型越跑越偏

现象:模型上线后,每个月都预测,但六个月后误差持续扩大,从 6% 涨到 18%。

原因:时间序列模型有“近大远小”效应——序列越近的数据,携带的当前市场信息越多。论文的建模数据从 2014 年 1 月起,到 2019 年 5 月止,预测 2019 年 3 到 5 月。但到了 2020 年,如果还用 2019 年的模型预测,等于让模型用老眼光看新市场。

解决:论文在结语里说的策略是“将旧数据不断更替为最新的销量数据”。实操上就是滚动窗口:每月新数据进来,剔除最早的一批,重新估计参数。我见过生产环境的做法是:每季度重跑一次定阶流程,而不是只更新数据不更新阶数——因为市场结构变了,原来的 (1,0,0)(1,1,0) 可能已经不再是最优配置。

6. 设计取舍:为什么 ARIMA 预测短期是“便宜好用的后悔药”,长期则是“刻舟求剑”

把这篇论文从方法论上看,它其实给出了一个关于预测模型选型的清晰示范:在数据量受限(只有六年的月度数据)、波动剧烈(极值相差 6 倍)、政策干预频繁的领域,与其追求“一步预测未来一年”,不如把精度压在“最近三个月”。这不是模型能力的上限,而是时间序列本身的边际效应递减——越往远处走,误差的累积就越不可控。

论文的取舍逻辑可以拆成三个层次来看。第一层,数据量约束。2014 年到 2019 年只有 65 个月,季节差分一次后,用于估计参数的季节周期实际上只有 4 到 5 个。这点数据量支撑不了复杂模型,低阶数不是偷懒,而是统计上的自我保护。第二层,预测时效约束。销量预测的决策场景通常是产能爬坡和库存管理,三个月刚好是车企调整生产计划的自然周期。预测窗口与决策窗口对齐,比模型精度更关键。第三层,模型形式约束。在选择q=0和Q=0的参数配置时,论文实质上承认了:汽车销量受外部冲击的影响,超出了移动平均项能够描述的“误差记忆”范围——与其建模误差的延续,不如把冲击留给下一轮数据更新。

如果你要在这个方向上继续深入,更务实的进阶路径不是换更复杂的模型,而是做简单组合:ARIMA 负责“趋势和季节的惯性预测”,再用一个监督学习模型(比如带外部变量的回归或者树模型)处理“补贴退坡、油价波动、新车型发布”这类 ARIMA 无法感知的突变因素。两个模型的预测取加权,权重按最近六个月的误差表现动态调整——这是我在实际项目里配置过的最稳定方案。别急着上 LSTM,月度销量数据量太稀疏,深度模型反而不如结构简单的组合体好用。

回头说这篇论文,它给我留下最深的一个习惯是:每次拿到一份销量预测报告,先问三个问题——模型预测的是“水平”还是“变化”?预测窗口对齐没有?极值月份是怎么处理的?如果这三个问题答不清楚,报告里的任何 R 方数字都是浮云。我也曾在一次项目里直接套用高阶 SARIMA 模型,跑出来拟合 R 方 0.96,结果生产环境第一个月误差就打了脸。从那以后,我每次做时间序列建模都强制自己先跑一遍 ADF,先画 ACF/PACF,先用手头的样本做三个月滚动验证,全都过关了才给业务方汇报。这种做法不能保证模型一定正确,但它能让你在预测失败的时候,知道自己死在哪个步骤——这本身就是成本最低的后悔药。希望这篇推演,能帮你在下一次建模时少踩几个我已经替你踩过的坑。

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

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

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

立即咨询