简介这份PDF文档围绕ARIMA时间序列模型在新能源汽车月销量预测中的应用展开面向统计学、数据分析及汽车产业研究方向的初学者与实务人员帮助其理解从数据平稳化处理到模型定阶、拟合与短期预测的完整思路。压缩包内仅含1个PDF文件大小约1.11MB篇幅集中便于快速查阅。文档以2014年1月至2019年5月的销量数据为例梳理季节性分解、差分处理、ADF单位根检验、ACF与PACF定阶、SPSS参数估计及ARIMA1,0,01,1,0模型验证等环节并给出2019年3月至5月的预测结果与相对误差对比同时讨论极值波动对预测精度的影响及三个月短期预测的适用边界。已有480人学习适合需要了解时间序列预测流程、撰写相关课程论文或搭建销量预测思路的读者参考。1. 销量能不能算出来ARIMA 模型到底在预测什么先看一个常见场景车企销售部门每个月都要回答同一个问题——下个月大概能卖多少台。新能源这条赛道上这个问题尤其难答市场新、基数小、政策一变曲线就抖。ARIMA 模型就是为这类“有历史、有节奏、但不好解释成因”的数字准备的工具。一句话定义它拿一条按时间排好的序列先靠差分把趋势压平再用过去若干期的值做回归往前推几步。打个比方就像看一个人连续几年的作息表来猜他下个月哪天犯困——不需要知道他为什么熬夜只要习惯足够稳定猜个大概就够了。搞懂它你就能判断一份销量预测是真推出来的还是先有结论再凑数字。2. 一条销量曲线里到底裹了什么时间序列的四层结构2.1 趋势、季节、波动、异常四种东西混在一条线上把 2014 年 1 月到 2019 年 5 月的月度销量画成折线第一眼看到的是整体往上爬这条斜线就是趋势。凑近看每年 2 到 3 月明显塌下去一块10 月到次年 1 月又鼓起来这是季节。再凑近某个月多个几千台少个几千台找不到明显规律这是随机波动。最后还有几个特别扎眼的点比如 2018 年 12 月冲到 22.5 万辆而最低的月份只有 3.4 万辆相差近七倍这属于异常值。这四层混在一起直接拿去建模就像把盐糖味精倒进一个罐子再想分出来没法弄。ARIMA 的整套动作本质就是把它们一层层剥开差分负责消趋势季节项负责管周期自回归和移动平均负责收拾剩下的波动异常值要么单独标记要么容忍误差。明白了这一层拆解后面那些 p、d、q 就不像玄学了。2.2 为什么一定要先做差分把上坡路压成平地时间序列模型有个硬性前提叫平稳性。通俗解释是这条曲线的平均水平、上下摆动的幅度、还有“这个月和上个月有多像”这种关系不能随时间的推移而漂移。一条持续爬坡的销量曲线显然不满足——2014 年的月均和 2018 年的月均差着量级模型没法用同一套参数去描述两端。解决办法是差分。一次差分就是拿本月减上月Δy_t y_t − y_{t−1}打个比方原来的曲线是“海拔高度”一路往上升差分之后变成“每天爬升了多少米”围绕一个数上下晃上坡路就被压平了。原始序列如果还带着年复一年的季节模式就得再做一次季节差分——拿本月减去年同月间隔 12 期。做完差分再跑 ADF 单位根检验看检验统计量是不是落进拒绝域落进去了才敢说“平稳性基本达标”。注意差分不是做得越多越好。每多做一次就少一个数据点信息量在缩水差分过头还会把本来就有的规律当噪声磨掉模型变得过度敏感。2.3 为什么让序列“自己预测自己”不找原因只找惯性常规的回归思路是找一堆解释变量补贴金额、油价、充电桩数量、竞品价格然后拟合。听起来很合理实操起来麻烦一堆。这些变量的月度数据未必拿得到拿到了也未必准就算准你还得先把它们自己预测一遍——预测里套预测误差层层放大。ARIMA 换了个思路不解释为什么只承认惯性。它假设下一期的值主要由前几期的值决定。写成最简形式就是y_t c φ₁·y_{t−1} φ₂·y_{t−2} … ε_t这就是自回归。再加上一部分“过去几期的预测误差”作为修正项就是移动平均。两部分一拼就是 ARIMA 名字的来历自回归AR 差分I 移动平均MA。这么做的好处是干净只要一条序列不需要任何外部数据源短样本也能跑跑出来的结果还能当基线——后面再上复杂模型时拿它当尺子量一量到底提升了多少。2.4 为什么只敢预测最近三个月近大远小序列模型有个绕不开的特性原文说得很直白叫“近大远小”效应。往前推一期误差可控推三期误差开始累积推到十二期置信区间宽得能装下任何结果等于没预测。原因有两层。第一层是数学上的每一期的预测值都会被下一期当作输入误差是往上传的步数越多滚得越大。第二层是现实上的政策一变、补贴一退坡销量曲线当场改道而模型只认历史历史里没有的东西它学不会。所以这份研究把预测窗口卡在三个月用 2019 年 3 到 5 月的数据做验证超出范围的结果明确说不具预测意义。这个克制是必要的不然很容易得出“五年后销量多少万辆”这种听着唬人、实际没用的数字。3. ARIMA(p,d,q)(P,D,Q) 六个字母拆开看每个参数在管什么3.1 p 和 P往前看几期自己小写 p 是普通自回归阶数回答的是“往前看几期历史值”。p1 就是只用上一期p3 就是连着用前三期。阶数不是越大越好p 太大等于给模型塞了一堆互相高度相关的输入参数估计会变得不稳。大写 P 是季节自回归阶数回答的是“往前看几个同月的历史值”。月度数据里P1 就意味着模型去参考去年同月的情况。这会用到跨 12 期的那种相似性——今年 3 月和去年 3 月、前年 3 月往往有共同点P 就是把这条线接上。这份研究最后定下来 p1、P1意思是既参考上个月也参考去年同月。听上去简单但对一条只有六十几期的月度序列来说这种“简单”反而是稳妥的。3.2 d 和 D差分要做几次d 是普通差分次数管趋势D 是季节差分次数管周期。这里有个容易看花眼的地方模型写成 (1,0,0)(1,1,0)括号里第一个 d 是 0第二个 D 是 1。意思是——不做逐期差分只做一次跨年同月的季节差分。因为这条序列的主要干扰来自年复一年的季节波动跨期差分做完之后趋势那部分已经被顺带处理掉一部分再强行加一次普通差分反而可能过度处理。d 取 0 不是“漏做”而是一个明确的取舍。3.3 q 和 Q用过去几次的预测失误来修正移动平均项和自回归项经常被搞混。自回归看的是过去的值移动平均看的是过去的误差。打个比方自回归像看这个人前几天的作息来猜他今天几点睡移动平均像翻出前几次猜错的记录来修正这次的判断。q 是普通移动平均阶数Q 是季节移动平均阶数。这份研究取 q0、Q0也就是完全没用误差修正项。很多人以为模型必须六项俱全才专业实际上不是。当自回归部分已经把结构抓得差不多硬加移动平均项只会增加参数、增加不确定性效果还可能更差。3.4 定阶靠什么ACF 和 PACF 两张图定阶不是凭感觉靠的是两张图。ACF 是自相关函数看的是“当前值和 k 期之前的值有多像”PACF 是偏自相关函数看的是“把中间那些期的影响剔掉之后当前值和 k 期前还剩多少直接关系”。判断有个粗略的经验规则PACF 在第 p 期之后突然掉到零附近截尾说明自回归阶数大概取 pACF 慢慢衰减拖尾通常配合着看。反过来如果 ACF 在第 q 期截尾而 PACF 拖尾那多半是移动平均的阶数在起作用。季节部分同理只是要把横轴按 12 的倍数去看。观察到的图形特征通常的解读PACF 前 p 期有明显尖峰后突然截断取自回归阶数 pACF 前 q 期截断、PACF 缓慢衰减取移动平均阶数 q两个函数都缓慢衰减可能需要先差分或取混合阶数在 12、24、36 期位置重复出现尖峰存在季节成分考虑加 P 或 Q差分后仍能看到明显趋势差分次数可能不够图只是参考最后还得靠拟合指标和残差检验回去验证。有个细节SPSS 之类的工具会自动给出推荐阶数但推荐结果要跟 ACF/PACF 的实际形态对得上对不上就得多试几组。3.5 把参数写进代码一份能跑的最小骨架概念讲完落到实际写法上其实很短。下面这段只是骨架真正要调整的是 sales 那条序列和括号里的数字。# sales 是一条按月份排好序、没有缺口的销量序列 # order 管非季节部分 (p, d, q) # seasonal_order 管季节部分 (P, D, Q, m)m 是季节周期月度数据通常填 12 from statsmodels.tsa.statespace.sarimax import SARIMAX model SARIMAX( sales, order(1, 0, 0), # p1, d0, q0 seasonal_order(1, 1, 0, 12), # P1, D1, Q0, 周期 12 个月 enforce_stationarityFalse, enforce_invertibilityFalse, ) fit model.fit(dispFalse) print(fit.summary()) # 看参数显著性、平稳 R 方等指标 result fit.get_forecast(steps3) # 只往前推 3 期别贪多 print(result.predicted_mean) # 点预测 print(result.conf_int()) # 上下置信限几个参数的含义值得单独说清楚。order里的三个数字对应 p、d、qseasonal_order里的四个数字对应 P、D、Q 和季节周期 m月度数据填 12季度数据填 4。两个enforce_*开关设成 False是允许算法在数值上不去死磕平稳性和可逆性的严格约束——毕竟现实数据没那么理想卡太死会直接报错跑不出来。get_forecast(steps3)只要三期不是技术限制是前面说的近大远小。4. 预测结果如何判断可信三个数字与一条置信带4.1 相对误差把预测值摆回真实值旁边最直观的检验方式是留出最近几期不让模型看见跑完再拿出来对。月份实际销量万辆预测值万辆相对误差2019 年 3 月12.611.59%2019 年 4 月9.79.25%2019 年 5 月10.19.56%相对误差的算法很简单拿预测减实际、取绝对值、再除以实际。三期都在 5% 到 9% 之间量级上都落在正确区间内。但光看这几个百分比还不够。真正有意义的比较是跟基线比如果直接把上个月的销量当作下个月的预测误差是多少如果把去年同月的销量当预测误差又是多少只有模型的误差明显低于这两个朴素基线才说明它的复杂度是值得的。这一点常被跳过很多人拿着 6% 的误差就觉得模型很好其实可能跟“照抄上个月”的效果差不多。4.2 两个 R 方0.932 和 0.538 哪个才是真实水平模型输出里有两个决定系数一个叫整体 R 方数值 0.932一个叫平稳 R 方数值 0.538。乍一看前者漂亮得多但真正反映模型本事的往往是后者。打个比方一张卷子里有 60 分是送分题。整体 R 方相当于总分 93 分看着耀眼可其中有很大一块是季节差分提前“送”的——因为差分已经把年复一年的规律性拿走了剩下的部分自然好拟合。平稳 R 方相当于去掉送分题之后的得分率0.538 才是模型在真正的难点上拿到的分数。这不是说模型差。对一条波动这么大的销量序列能在剥离季节成分后解释一半以上的变异已经算过得去。但它提醒一件事看拟合优度时要看清分母是什么别被大数字骗了。4.3 Sig 值与置信带误差不是一个点是一段区间参数估计表里会有一列 Sig。这个值小于 0.05说明对应参数显著不为零这个项留在模型里有统计意义。反过来如果某个参数 Sig 很大说明它跟零没区别加进去只是徒增复杂度该删。拟合图上通常画着两条虚线标着 LCL 和 UCL分别是置信下限和上限。它的作用是告诉你预测不是一个确定的数字而是一段区间。往前走得越远这两条线张得越开形状像喇叭口。看到喇叭口迅速张开的模型就该知道它的远期为预测已经没什么参考价值了。提示给别人看预测结果时只报点预测是最容易误导的做法。把区间一起报出去对方才知道这个数字有多“硬”。4.4 极值月份总是翻车线性模型的固有短板回看拟合曲线会发现一个规律大部分月份贴得挺紧但个别月份偏差明显变大尤其是 2018 年 12 月这种冲到 22.5 万辆的高点。原因是 ARIMA 本质上是线性的。它把未来理解成过去的加权组合权重是固定的。遇到促销集中、补贴退坡前的抢购、新车型上市这种突发推动历史里没有可类比的模式模型只能按平均路径去猜自然猜低。同样跌到 3.4 万辆的月份也会被猜高——它总是往中间拉。这不是调参能彻底解决的是方法本身的性质。承认这个短板比硬把它包装成全能预测器要诚实得多。5. 常见误区与易混概念ARIMA 不是万能预测器5.1 易混一ARIMA 和 SARIMA 到底是不是一回事易混点很多材料一会儿写 ARIMA一会儿写 SARIMA参数一会儿三组一会儿六组看得人头晕。为什么混因为这两个名字在软件里经常共用一个入口。SARIMA 就是 Seasonal ARIMA加了季节成分的版本本质上是 ARIMA 的扩展不是另起炉灶的算法。上面那份模型写成 (1,0,0)(1,1,0)后面那组括号就是季节部分所以它实际上是个 SARIMA。怎么区分看有没有季节周期。只写 (p,d,q)、不需要指定周期长度的是纯 ARIMA写成 (p,d,q)(P,D,Q)m 并且要填 m 的是 SARIMA。判断数据里有没有年复一年的重复模式——有就老老实实用季节版没有就别硬加加了反而多几个没用的参数。5.2 易混二差分和“去掉趋势”是一回事易混点都听说要先处理趋势于是把“差分”和“去趋势”当成同义词。为什么混两者确实都能让曲线变平效果看起来像。怎么区分差分是拿相邻两期相减算的是变化量去趋势是先拟合一条直线或曲线再把这条线从原序列里减掉留下的是围绕趋势的偏离。前者的结果单位变了从“辆”变成“辆/月”后者的单位还是“辆”。另外取对数再差分近似于算增长率又是另一种处理。选哪种取决于你想保留什么信息别混着用。5.3 易混三R 方高就等于预测准易混点看到 0.932 就觉得模型很靠谱。为什么混拟合和预测用的是两套数据。R 方是在模型见过的样本内算出来的模型对这些点已经“背过答案”。怎么区分看样本外的误差。把最后几期切出来当考场模型训练时完全不碰跑完再比对这一步才叫验证。样本内 R 方再高样本外一塌糊涂的模型在真实场景里一文不值。上面那 9%、5%、6% 的相对误差价值远高于任何样本内的拟合指标。5.4 易混四能预测三个月就能预测三年易混点模型既然能算把步数调大一点不就完了。为什么混代码里改个数字的事技术上没有任何阻碍。怎么区分看置信带的宽度。推到第三期时区间还收得住推到第十二期往往宽到失去意义。再叠加现实变量——政策调整、竞品上市、补贴变化——这些都不在历史数据里。三个月是个经验边界不是硬规定判断标准是区间宽度有没有超出业务能接受的范围。5.5 易混五ARIMA 和回归、机器学习是一类东西易混点都是“预测模型”拿来对比优劣。为什么混目标一致都是给未来一个数。怎么区分输入不同。ARIMA 只用序列自己的历史属于单变量方法回归要外生变量能回答“补贴每降一千块销量掉多少”这种因果方向的问题机器学习通常要大量特征和更长样本短序列上容易过拟合。它们不是替代关系常见做法是拿 ARIMA 当基线再看好一点的方法能不能稳定超过它。6. 什么时候该用它、什么时候别用一份判断清单判断能不能上 ARIMA我习惯先过三道门。第一道数据够不够。至少要有两三年连续的月度记录中间不能有大段缺口。序列太短季节项根本估不出来模型只能拟合噪声。第二道节奏稳不稳。如果每年淡旺季的形态大致相似季节项就有用武之地如果形态年年变季节参数就是在追一个跑掉的目标。第三道需求是什么。要的是“下个季度大概什么量级”它合适要的是“为什么涨、涨在哪”它答不了。场景适不适合原因有三年以上月度记录、季节规律稳定适合趋势和周期都能被拆出来只需要未来 1 到 3 期的量级判断适合误差还在可控范围作为基线衡量新模型有没有真提升适合只用一条序列成本极低序列只有几个月刚上市不适合参数估不准等于拟合噪声期间有政策断点、统计口径变化不适合历史规律被切断模型学的是过时模式需要解释销量涨跌的成因不适合单变量方法给不出因果需要一年以上的长期数字不适合置信区间宽到没有决策价值还有一种情况容易被忽略数据里有个别极端月份。别急着把它当噪声删掉先问一句它是怎么来的。如果是一次性事件标记出来单独处理如果它反映的是结构变化那整条序列可能都得重新审视因为断点前后的规律已经不是同一套了。我吃过一次亏。有一年拿到一条只有十几期的月度序列直接塞进模型拟合图画得漂漂亮亮几乎贴着每一个点当时还挺得意。结果下一期实际值出来误差接近三成。回头一查问题全在开头序列太短季节项被估成了一个巨大的数把整条曲线都带偏了而且最后两个月正好赶上一次口径调整模型完全不知情。从那以后我每次拿到一条时间序列都强制走三步先画图把异常点和断点圈出来再做差分跑一次平稳性检验确认最后留出最近三期当考场绝不让模型在训练时见过它们。这三步花不了十分钟但能挡掉大半的翻车。那份资料把这些环节都摊开了——从 2014 年 1 月到 2019 年 5 月的月度数据怎么整理、差分前后序列形态怎么变、ACF 和 PACF 长什么样、最后为什么定成 (1,0,0)(1,1,0)、三期验证的误差表怎么算一条线走下来是完整的。想照着把自己的数据跑一遍看那份 PDF 里的图和表比看文字描述直观得多需要的话直接下载就行。希望帮到你。本文还有配套的精品资源点击获取