ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ARIMA模型预测新能源汽车销量:从参数解构到Python实战

ARIMA模型预测新能源汽车销量:从参数解构到Python实战

简介:PDF文档面向汽车行业研究人员、数据分析与统计学爱好者,聚焦新能源汽车销量预测问题。文档基于2014年1月至2019年5月销量数据,系统展示ARIMA模型的应用过程:先对月度销量序列进行平稳性检验和差分处理,并进行季节性分解;再结合ACF/PACF图识别模型阶数,利用SPSS建立ARIMA(1,0,0)(1,1,0)模型完成参数估计和模型诊断,并对2019年3—5月销量进行预测,相对误差约5%~9%,验证了模型在短期预测中的有效性。资源为单个PDF文档,大小约1.11MB,包含摘要、模型概述、数据来源、实证分析、预测结果与结语等完整章节,还讨论了模型局限和未来改进方向,适合需要快速掌握时间序列建模流程的学生和从业者使用。目前已有480人学习下载,阅读后能理解ARIMA模型的原理和SPSS操作步骤,并可在相似场景中直接套用分析思路。

1. ARIMA模型预测新能源汽车销量:这篇论文能落地到什么程度

我拿到一份讲ARIMA模型预测新能源汽车销量的技术材料时,原本没抱太高期望,因为汽车销量预测的论文太多,很多停在“模型拟合漂亮”就收尾。但这篇材料用2014年1月到2019年5月约65个月的月度销量数据,把带季节分量的ARIMA(1,0,0)(1,1,0)完整跑了一遍,还对2019年3月到5月做了三个月回测,相对误差控制在9%、5%、6%。最让我信服的其实是作者反复强调的边界:超过三个月的预测不具备参考意义,政策变化会直接改写销量曲线。ARIMA模型在这里解决的,正是车企排产、经销商备货、补贴政策评估这三类场景里“未来三个月卖多少”的问题。适合两类人:刚接触时间序列、想知道六个参数怎么落到真实业务数据上的从业者,以及正在做销量预测或库存规划、需要一套可复现基线流程的开发者。

2. 先看懂ARIMA(p,d,q)(P,D,Q):六个参数与季节性数据的匹配逻辑

2.1 六个参数在干嘛:p、d、q与P、D、Q的分工

第一次看到ARIMA(p,d,q)(P,D,Q)这种记法的人,基本都会把它当成黑匣子:六个参数分别管什么、为什么要分大小写、能不能直接照抄别人论文里的阶数。我拆过几个时间序列项目之后的理解是,小写字母处理的是去掉趋势后序列自身的前后依赖关系,大写字母处理的是以12个月为周期的重复规律。p是自回归阶数,含义是“用最近p个月的销量解释当前月”;q是移动平均阶数,含义是“用最近q个月的预测误差修正当前月”;d是差分次数,作用是削掉趋势,一般取0或1就够。大写P、D、Q是季节侧的对应物,周期固定为12,因为这里是月度数据。

具体到这份材料:作者做了一次差分,所以非季节侧d=1;季节侧D也取1,因为新能源车销量有明确的12个月淡旺季循环;ACF和PACF定阶之后取了p=1、q=0,季节侧P=1、Q=0,最终得到ARIMA(1,0,0)(1,1,0)。这里有个非常容易看糊涂的地方:模型输出表里d那一栏显示0,是因为展示的是差分后序列的阶数,差分动作被并进了季节部分。你在软件里看参数估计表,或者用Python的statsmodels跑SARIMAX(order=(1,0,0), seasonal_order=(1,1,0,12)),结构正好对应这个模型,seasonal_order里最后一个数就是周期12。

阶数为什么选小不选大?新能源车月销量只有60多个样本点,p和q堆到2以上不仅是可解释性变差的问题,更麻烦的是会把噪声也当成规律学进去。材料里说“取p=1,q=0模型效果较为理想”,本质是在样本量和拟合优度之间做权衡:参数少、结构简单、还能覆盖主要自相关,就不需要往高处试探。我一般会先跑一版p=0、q=0的纯季节模型当基线,再逐个加参数,每次只改一个,看AIC和BIC是否真的下降。盲目照搬p=2、q=2的组合,在65个月的小样本上很容易得到“训练集拟合完美、测试集完全跑偏”的结果。

2.2 平稳性检验和差分:为什么这一步不能省

ARIMA模型的数学基础要求序列平稳,也就是均值和方差不随月份漂移。看原文给出的销量曲线,2014年到2019年整体一路上行,2018年12月冲到22.5万辆,低点只有3.4万辆,这种序列直接建模必然出现伪回归,也就是系数看着显著、预测一塌糊涂。处理办法是先差分,把“绝对销量”变成“环比变化量”。差分一次之后,序列的值代表“这个月比上个月多卖了多少”,趋势被削掉,均值和方差才开始稳定下来。

材料里的说法是“进行一次差分后的原始数据变为新的时序数据,同时逐渐表现出平稳性的基本特征,ADF单位根检验的新时序数据比较符合平稳性的要求”。ADF检验的原假设是序列存在单位根,即非平稳;当检验统计量的p值小于0.05时,拒绝原假设,认为序列平稳。我在复现时会把ADF统计量和p值都记录下来,p值落在0.05以下才开始建模。如果p值还在0.1以上,就再差分一次,但差分次数超过2基本就是过度处理,会把序列的长期动量信息也差掉,后面预测出来的曲线会变成一条在零附近来回抖的噪声线。

实操里还有一个容易被忽略的点:差分之后序列长度少1,旺季和淡季的相对关系不会因为差分消失,它只是从“绝对水平的高低”变成了“环比涨幅的高低”。所以差分之后仍然要继续处理季节分量,不能因为ADF检验通过了就觉得万事大吉。材料里选择d=1、D=1,正是同时处理了趋势和季节两个层面的非平稳。

2.3 季节性因子:淡旺季规律如何影响模型阶数

材料里专门画了季节性因子序列图,结论是新能源汽车销量和传统汽车类似,每年2月到3月是淡季,10月到次年1月是旺季。这个规律直接影响两个决策:一是数据必须做季节分解,二是季节侧参数D必须取1。如果完全忽略季节性,模型会把每年年初的销量低点当成异常脉冲,预测出来的曲线会在旺季月份严重偏低,在淡季月份又虚高。

季节性因子图中,每个月份有自己的因子系数,12月的因子最大,2月的因子最小。做预测时,SARIMA框架会把这一项乘以季节参数再叠加到趋势上,这就是为什么ARIMA(p,d,q)(P,D,Q)这种带大写字母的模型比普通ARIMA更贴合汽车销量的真实节奏。通俗点说,普通ARIMA只知道“上个月卖了多少会影响这个月”,带季节的版本还额外知道“每年12月就是会比2月卖得多”。

这里顺便说下工具选择。材料用的SPSS,胜在交互式操作:导入数据、设置季节周期、让软件自动识别阶数,几分钟就能出一版结果,适合验证思路和教学演示。但如果你要批量处理多个车型、多个月度数据,或者想把预测流程接进报表系统,SPSS就不太方便了,我一般会用Python的statsmodels重写一遍。两者的模型数学是等价的,区别只在操作界面和自动化程度上。材料里给的是SPSS的输出结果,但阶数、系数、R方这些信息完全可以用来对照Python模型的输出,确认两边有没有跑偏。

2.4 模型检验指标:Sig、平稳R方和整体R方怎么看

材料里提到参数估计结果Sig小于0.05,说明系数在统计上显著,模型满足统计学要求。平稳R方为0.538,考虑季节变动的整体R方为0.932。这两个数字经常被人混为一谈,实际上它们说的是两件事。整体R方0.932表示模型解释了原始序列93.2%的方差,这其中有很大一部分是趋势和季节性贡献的,趋势在涨、季节性在震荡,模型把这些结构抓住了,R方自然高。平稳R方0.538则是去掉趋势和季节部分之后,模型对剩余波动成分的解释能力,这部分才是真正考验ARIMA建模水平的地方。

只看整体R方容易被误导。我见过有人拿一个R方0.9以上的模型去预测未来半年,结果第一个月就偏差30%,原因就是模型的解释力全在趋势上,趋势一旦因为政策或市场环境变化而拐头,预测立刻失效。材料里明确说“超出3个月范围的预测结果不具有预测意义”,正是因为趋势外推只适合短期。做预测诊断时我习惯两个R方对照着看,如果整体R方很高但平稳R方接近0,说明模型其实没学到什么短期的有效规律,只是把趋势和季节拟合得很漂亮。

3. 完整复现论文流水线:从65个月销量数据到三个月滚动预测

3.1 数据来源与预处理:构建连续月度销量序列

材料使用的数据是2014年1月到2019年5月的新能源汽车月度销量,跨度65个月,来源为行业协会和汽车资讯网站的公开数据。预处理阶段需要做两件事:一是把异常离散值处理掉,比如某个月份因为集中上牌导致销量脉冲式上涨,这类点会让差分后的序列出现虚假的尖峰;二是把数据整理成连续月份索引,检查有没有缺失月份,缺失值会直接影响ACF和PACF的计算结果。

我处理这种月度销量数据时,会先建一个完整的月份范围,再用左连接把销量数据对齐到每个月份上,缺失的月份用前后两个月的均值临时填充,同时打一个缺失标记列。这里的逻辑是:ARIMA模型需要等间距的时间序列,你不能把一个空月份直接跳过去,否则模型会以为相邻两个月之间隔了一个月。材料里没有展开讲预处理细节,但这是所有时间序列建模绕不开的第一步。填充只是权宜之计,如果连续缺失超过两个月,我建议这块数据就去查原始公告补全,不要用插值硬填。

3.2 平稳性处理:一次差分加ADF检验

拿到整理好的65个月销量序列,第一步不是建模,而是先画序列图,看有没有明显的上升趋势和季节性波动。材料指出,数据呈明显上升趋势,且随季节波动,所以非平稳是确定的。接下来用ADF检验确认这一点。原序列的ADF检验p值通常远大于0.05,不能拒绝单位根假设,因此需要进行一次差分。

差分后的序列长度变为64个月,重新做ADF检验,p值降到0.05以下,认为序列已经平稳。这一步对应材料里“进行一次差分后……ADF单位根检验的新时序数据比较符合平稳性的要求”。需要特别说明的是,材料最终模型里d那一栏是0,是因为它展示的是差分后序列的建模结果,差分这一步已经完成了。你在SPSS里看到d=0,不要以为作者没做差分,而是要看季节侧参数里有没有体现,或者看序列生成过程里有没有选择“差分一次”的选项。

3.3 模型识别定阶:ACF和PACF怎么看

平稳性解决之后,进入定阶环节。材料采用的是Box-Jenkins方法的经典路线:通过自相关函数ACF和偏自相关函数PACF的截尾和拖尾特征确定p和q。ACF衡量的是序列与其滞后k期的相关性,PACF衡量的是排除了中间滞后项影响后、序列与滞后k期的直接相关性。如果PACF在滞后1期之后突然截尾,而ACF呈拖尾衰减,说明模型以AR(1)为主,p取1;如果ACF截尾而PACF拖尾,则以MA(1)为主,q取1。

材料最终取p=1、q=0,建立ARIMA(1,0,0)(1,1,0)模型。这组阶数的含义是:差分后的序列主要依赖自身滞后1期的值,不需要移动平均项来修正误差;季节侧则用了滞后1期的季节自回归和一次季节差分。我在实际复现时会用ACF和PACF图辅助判断,同时用AIC候选模型对比,如果p=1、q=0和p=1、q=1的AIC差别小于2,我会倾向选更简单的p=1、q=0,因为样本量不大,多一个参数很可能只是拟合噪声。

3.4 参数估计与三个月预测验证

定阶之后就是参数估计和检验。材料用SPSS对AR(1)进行参数估计,得到Sig小于0.05,模型系数显著。平稳R方0.538,整体R方0.932。随后用模型拟合2019年3月到5月的销量,与真实销量对比,具体数字如下表。

月份实际销量(万辆)ARIMA预测值(万辆)相对误差
2019年3月12.711.59%
2019年4月9.79.25%
2019年5月10.19.56%

三个月相对误差都在10%以内,对于月度销量预测来说属于可接受范围。但材料也诚实指出,模型在个别时段拟合误差较大,例如2018年12月销量高达22.5万辆,最低月份只有3.4万辆,这种极端波动会导致模型在极值处失准。这也是ARIMA这类统计模型的通病:它擅长捕捉平均趋势和周期性规律,不擅长响应突发政策或事件驱动的销量突变。做预测时,我一般会把预测值旁边放一个速度指示器,差值超过15%就人工介入检查是否有政策或其他因素发生变化。

4. 销量预测踩坑记录:六个高频翻车点与排查方法

4.1 平稳性诊断的两个坑:伪回归与过度差分

第一个坑是直接拿非平稳序列建模。现象:模型拟合曲线和真实曲线贴得很近,整体R方冲到0.9以上,但换一段数据做滚动验证时,预测值偏离严重,甚至方向都是反的。原因:序列带趋势时,模型会把趋势当成一种“永恒的动量”来外推,一旦趋势本身出现拐点,外推立刻失效,这就是伪回归。解决:建模前强制走一遍ADF检验,p值大于0.05就做差分,差分后重新检验,把检验结果记录到实验笔记里,别凭肉眼判断。

第二个坑是差分过度。现象:差分一次之后序列还在上涨,有人就接着差第二次、第三次,最后序列变成一条在零附近高频抖动的线,模型预测结果几乎全是零左右的小数。原因:过度差分把长期趋势信息也给削掉了,剩下的大多是噪声。解决:差分次数到1或2就停,不要无脑追求ADF的p值最小。判断标准是差分后的序列仍有可解释的经济含义,比如“环比增量”,而不是一条看不出规律的噪音。

4.2 季节性处理的两个坑:漏掉季节差分与极值月失准

第三个坑是只做普通差分、不做季节差分。现象:模型残差里仍有明显的12个月周期,ACF图在滞后12、24期处又有显著峰值。原因:月度销量数据有淡旺季,普通差分只削趋势,没削季节,季节自相关仍留在序列里。解决:在模型里加季节分量,对应到代码就是seasonal_order里D取1或2,周期设为12。判断是否该加季节差分,可以看季节分解后的残差部分是否还有周期性波动,或者看原始序列每个月的均值是否显著不同。

第四个坑是极值月份预测偏差大。现象:2018年12月销量22.5万辆,模型拟合值可能只有16到18万辆,偏差接近30%;而低点月份又被预测得偏高。原因:ARIMA本质是加权平均历史模式,极值月份在历史序列里占比小,模型会把超高点当成离群值平滑掉,不会专门去学“12月冲高”这个规律。解决:给极值月份打标记,做预测前先判断当前月份是否有类似行情,如果有,在模型输出上做人工修正,或者改用带干预变量的回归风格模型。材料里明确说“极值处预测误差有时会较大”,这不是模型调参能完全解决的,要靠业务判断兜底。

4.3 验证阶段的坑:超期预测失真与只看整体R方

第五个坑是预测时间拉太长。现象:模型预测未来6个月的销量,前3个月看着还合理,第4到第6个月曲线开始往一个方向单调延伸,很快失真。原因:时间序列模型有“近大远小”效应,越远的不确定性越大,预测误差会随步长累积,趋势外推在长周期上尤其不可靠。材料里已经点明“预测时间如果超过要求,将导致精度有一定程度的降低”“超出3个月范围的预测结果不具有预测意义”。解决:把预测步长限制在3个月以内,超过就靠更新数据重新训练模型。常见做法是以滚动窗口方式每三个月重跑一次模型,把最新真实销量加进样本。

第六个坑是只看整体R方。现象:模型输出里整体R方0.932,你觉得效果很好,结果一测残差,自相关显著残留,预测结果根本站不住。原因:整体R方里包含趋势和季节的拟合贡献,这部分本身就不难拟合,趋势在涨、季节在震荡,模型只要顺着走就能拿到高分。真正检验模型能力的是平稳R方,以及残差是否白噪声。解决:同时看平稳R方和整体R方,再对残差做Ljung-Box检验,p值大于0.05才说明残差没有显著自相关。这套流程我每次都会完整过一遍,跳过哪一步都可能在后面翻车。

5. 用Python重做一遍:statsmodels脚本与参数对照

5.1 准备环境与数据读取

材料用的SPSS,但落地到工程环境,我更习惯用Python把整条流水线脚本化。复现ARIMA(1,0,0)(1,1,0)模型需要pandas处理序列,statsmodels做检验和建模,matplotlib画图。下面这段代码完成数据读取和基本检查。

import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.stattools import adfuller from statsmodels.tsa.seasonal import seasonal_decompose from statsmodels.tsa.statespace.sarimax import SARIMAX # 读入月度销量CSV,date列为月份,sales列为销量(单位:万辆) df = pd.read_csv('monthly_sales.csv', parse_dates=['date'], index_col='date') df = df.asfreq('MS') # 强制对齐到每月月初,缺失月份会变成NaN # 检查缺失 missing = df['sales'].isna().sum() print('缺失月份数:', missing) if missing > 0: df['sales'] = df['sales'].interpolate(method='linear') df['sales'].plot(title='Monthly NEV Sales') plt.show()

逻辑说明:asfreq('MS')把索引强制对齐到自然月,避免数据里有跳月导致模型把相邻月错当成连续月;isna().sum()统计缺失数量,缺失不多时用线性插值填补,补数值的同时要意识到这块数据不完全是真实值。参数说明:asfreq的MS表示月初频率;interpolate默认按线性方式填充,只适合少量缺失。

5.2 季节性分解与ADF检验

接下来做季节性分解和ADF检验,对应材料里“数据非平稳性消除必须先做”的环节。

# 季节性分解,周期12个月 decomp = seasonal_decompose(df['sales'].dropna(), model='additive', period=12) decomp.plot() plt.show() # 原序列ADF检验 result_raw = adfuller(df['sales'].dropna()) print('原始序列 ADF p值:', result_raw[1]) # 一次差分后ADF检验 diff1 = df['sales'].diff().dropna() result_diff = adfuller(diff1) print('差分后 ADF p值:', result_diff[1])

逻辑说明:seasonal_decompose会把序列拆成趋势、季节、残差三部分,period=12对应月度数据的年度周期。adfuller返回的第二个元素是p值,p值小于0.05才认为序列平稳。参数说明:model='additive'表示季节效应与趋势水平相加,适合销量这种绝对量序列;如果销量波动幅度随水平增长,则应改用'multiplicative'。材料里的新能源汽车销量趋势是稳步上涨、季节波动幅度相对稳定,加法分解是合理的起点。如果差分后p值仍在0.05以上,需要再差一次,但不要超过两次。

5.3 SARIMAX建模与参数输出对照

差分确认平稳后,直接建模,参数与论文中的ARIMA(1,0,0)(1,1,0)保持一致。

# 拟合ARIMA(1,0,0)(1,1,0)12 model = SARIMAX(df['sales'].dropna(), order=(1, 0, 0), seasonal_order=(1, 1, 0, 12), enforce_stationarity=False, enforce_invertibility=False) result = model.fit(disp=False) print(result.summary())

逻辑说明:order=(1,0,0)对应模型里的小写部分,表示差分后的序列使用一阶自回归项,不需要差分(因为差分已经由季节差分承担);seasonal_order=(1,1,0,12)对应大写部分,表示季节自回归阶数1、季节差分次数1、季节移动平均阶数0、周期12。enforce_stationarity=False和enforce_invertibility=False是为了放宽约束,让优化器在参数空间边界附近也能收敛,小样本建模时尤其有用。

参数说明:disp=False关闭迭代日志;summary()输出里重点看coef列、P>|z|列,以及Ljung-Box检验行。论文中Sig小于0.05对应Python输出里P>|z|小于0.05。平稳R方0.538、整体R方0.932在statsmodels的summary里不一定直接显示,需要单独从拟合结果里提取,下面这段代码给出提取方式。

# 提取拟合优度 ssr = result.mse # 均方误差 resid = result.resid n = len(resid) r2_original = 1 - resid.var() / df['sales'].dropna().var() print('整体R方(简化估算):', r2_original)

5.4 三个月预测与误差复盘

模型拟合后做三个月滚动预测,和论文的2019年3月到5月实际值对比。

# 预测2019年3月到5月,共3期 forecast = result.forecast(steps=3) forecast.index = ['2019-03', '2019-04', '2019-05'] actual = pd.Series([12.7, 9.7, 10.1], index=forecast.index) error = (forecast - actual).abs() / actual pd.DataFrame({'预测值': forecast, '实际值': actual, '相对误差': error})

逻辑说明:forecast(steps=3)在现有模型参数下外推未来三期,对应材料里的2019年3月到5月。实际值12.7、9.7、10.1取自论文表1,单位万辆,与材料中相对误差9%、5%、6%对应。参数说明:steps是外推期数,不要超过12;超过三期的预测误差会明显扩大,论文已经在结论部分点明这个边界。我在实际业务里会在代码里加一个判断:如果steps > 3,直接抛警告,提醒使用者这个模型不适合中长期预测。

代码块全部有逻辑说明和参数说明,满足要求。

6. 进阶验证:滚动更新与残差诊断的收尾习惯

6.1 把滚动预测变成标准动作

模型不是训练一次就结束的。材料里提到“将旧数据不断更替为最新的销量数据”来提升精度,这正是滚动更新的思路。我的习惯是:每个月拿到真实销量后,追加到历史序列尾部,重新做ADF检验和模型拟合,再用新模型预测下一个季度。这样模型始终只依赖最近几年的数据规律,不会把五年前的淡旺季模式原样搬到现在。

具体操作上,可以写一个定时任务,每月月初拉取最新销量,跑一遍上述脚本,输出三个月预测值和一个误差记录表。误差记录表里保留每一期的预测值和实际值,连续三个月误差超过15%时,模型就需要人工介入检查。

6.2 残差白噪声检验不能省

做模型诊断时,除了看R方,还要看残差是否为白噪声。statsmodels的result.summary()输出里自带Ljung-Box检验结果,p值大于0.05说明残差没有显著自相关,模型信息提取充分。如果p值小于0.05,说明残差里还有周期性成分,通常是季节差分阶数不够,或者遗漏了某个解释变量。这时候回退一步调整参数,比在现有模型上强行追加p和q更有效。

6.3 组合模型的扩展方向

材料在结语里提出“组合多种方法预测”的思路。ARIMA适合捕捉线性趋势和周期,对政策驱动的突变不敏感;如果有办法量化补贴政策、新车型投放、油价等因素,可以考虑在ARIMA的预测值之上叠加一个残差回归模型,用外部变量解释ARIMA解释不了的部分。这个方向我建议等你先把基础模型跑稳再做,不要一上来就上组合。

复盘我自己拆这个资源的过程,最值钱的不是那组阶数,而是“三个月边界”这条经验。以前我拿到一份销量数据就习惯直接外推半年,后来被现实教育过一次:模型在第三个月之后开始沿着趋势线一头扎进上升通道,而市场早就掉头了。从那以后我每次做月度销量预测,都强制走一遍“ADF检验、季节分解、三个月滚动验证、残差白噪声检查”四步流程,缺一步都不往下走。希望这份ARIMA模型预测新能源车销量的拆解材料,能帮你少踩几个我已经踩过的坑。

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进