资讯动态

季节性ARIMA新能源汽车月度销量预测:定阶、回测与三个月滚动预测

发布时间:2026/10/26 1:56:36 来源:尧图企业网站定制
简介这份PDF围绕ARIMA时间序列模型在新能源汽车月销量预测中的应用展开面向统计学、数据分析学习者及汽车产业研究与企业战略制定人员帮助其理解短期销量预测的建模思路与实证流程。资源包仅含1个PDF文件约1.11MB轻量便于查阅。正文从模型概述入手说明差分平稳化、滞后回归与随机误差建模并以2014年1月至2019年5月销量数据为例依次呈现季节性分解、ADF检验、ACF/PACF定阶、SPSS参数估计及ARIMA100110模型的拟合与三个月预测误差对比。文中还讨论淡旺季波动、极值误差和短期预测局限可为相关学者开展销量预测研究、汽车企业研判市场需求提供方法参考。已有480人学习。1. 先看清需求为什么新能源月度销量预测用ARIMA而不是一上来堆模型做新能源汽车销量预测很多同学第一反应是上LSTM或XGBoost但手里只有六十多个月度销量、没有价格、政策、竞品等解释变量时最有性价比的往往是ARIMA模型。这套方案要解决的不是“预测未来三年”而是把2014年1月至2019年5月的月度销量整理成可复现的时间序列用季节性ARIMA给出未来3个月的点预测和区间并用2019年3—5月做回测。它适合两类人正在做销量预测毕设/课设的学生以及要给产销计划做短期参考的从业者。需求先立住预测窗口短、数据口径稳、误差可解释比模型名字听起来高级更重要。2. 需求拆解与数据口径把“销量预测”落成可验收的六个月度序列任务很多方案一上来就写模型公式最后答辩被问“预测哪几个月、误差多少算合格”就答不上来。先把需求拆成可验收任务预测对象、时间粒度、预测窗口、误差门槛、更新方式。这个项目里对象是新能源汽车月度销量单位统一为万辆窗口3个月回测期2019年3—5月误差目标相对误差不超过10%。需求拆到这一步后面选ARIMA还是季节性ARIMA才有依据而不是为了套模型而套模型。2.1 把“预测销量”翻译成可验收的月度序列任务业务语言里的“预测销量”很模糊落到方案里要写成可检查的条目。预测对象是月度销量序列不是年度总量也不是周度订单时间粒度按月季节周期固定为12输出包括未来3个月的点预测、95%预测区间和回测误差表更新方式是按月追加新销量后重新拟合不把旧预测直接平移。这样定义之后验收时只需要对照三件事预测月份对不对、单位对不对、误差有没有超过门槛。任务项方案定义验收口径预测对象新能源汽车月度销量单位统一为万辆时间粒度月度序列月份连续不跳月季节周期12个月2—3月淡季、10月至次年1月旺季预测窗口未来3个月超过3个月只作趋势参考回测期2019年3—5月与训练期不重叠误差门槛相对误差≤10%单月最大误差也单独列出这张表的作用不是摆样子而是把“我觉得预测得还行”变成“每个月误差多少、最大误差出现在哪”。原文给出的回测结果是2019年3月实际12.6万辆、预测11.5万辆4月实际9.7万辆、预测9.2万辆5月实际10.1万辆、预测9.5万辆相对误差分别为9%、5%、6%。这个误差水平放在3个月短期预测里是可解释的答辩时也能说清楚边界不是所有月份都能压到5%以内极值月要单独说明。从从业者角度看预测任务还要写清楚使用场景。车企产销计划通常关心未来一个季度的备货和排产3个月窗口刚好覆盖一个滚动周期学生做毕设/课设则要在这个窗口里完成数据清洗、平稳性检验、定阶、回测和误差分析。两类人的共同点是样本不长、解释变量少、需要可复现。把任务定义写成上面这种颗粒度后面即使换数据也能按同一套验收口径改。2.2 数据口径与清洗规则销量、月份、异常值三件事时间序列项目最容易翻车的地方不是模型而是数据口径。月度销量可能来自行业协会统计、公开汽车资讯站点、企业公告口径可能是批发销量、零售销量、上险量单位可能是辆、万辆、千辆。这个方案里统一用“月度销量、万辆、同一统计口径”并且在数据表里保留来源备注。不要小看这一列备注后面答辩被问“为什么2018年12月突然高到22.5万辆”有没有备注决定了你能不能解释清楚。字段含义规则month月份统一为YYYY-MM按月排序sales月销量单位万辆保留一位小数source_note来源备注记录统计口径和更新时间is_outlier异常标记0/1极值月标记但不直接删除used_for_fit是否入模0/1回测月设为0清洗规则我一般会写成四步。第一步统一月份把“2014年1月”“2014-01”“201401”这类格式全部转成标准月份缺月要补成空值并标记不能直接跳过。第二步统一单位把辆换算成万辆避免后面预测值12.6和12.6万辆混在一起。第三步处理异常离散值原文提到按移位水平对某些异常离散值进行处理通常的做法是先画原始序列把明显由统计口径变化或一次性因素造成的点标记出来再用相邻月份的水平做修正而不是一删了之。第四步锁定训练集和回测集回测月份不参与拟合否则误差会虚低。注意异常值不是越多删越好。新能源汽车销量本身有淡旺季2—3月低、10月至次年1月高是季节规律不是异常。把旺季当异常删掉模型会学不到季节项。清洗完的数据要能画出一张干净的月度曲线2014年到2019年整体上升趋势明显同时每年有季节波动。原文的季节性分解图就是把趋势和季节因子拆开看季节因子序列在0附近波动说明12个月周期是成立的。这个判断很关键如果季节因子不明显硬上季节差分D1就会过度差分后面避坑章会细讲。数据表里保留is_outlier和used_for_fit两列回测时能快速复现“哪几个月进了训练、哪几个月只做验证”。2.3 训练/验证切分与预测窗口边界切分方式直接决定回测结果可不可信。原文选取2014年1月至2019年5月的数据用2019年3—5月做模型验证。落到可复现方案里通常把2014年1月至2019年2月作为训练集2019年3—5月作为留出回测集模型拟合时只看训练集预测时一次输出3个月再和留出集对照。这样切分的好处是回测月完全不在训练样本里误差表不会因为“模型见过答案”而偏乐观。如果要做滚动回测可以每次追加一个月真实值再重估模型但那属于进阶验证不影响第一次交付。数据段时间范围用途训练集2014-01至2019-02平稳性检验、定阶、参数估计回测集2019-03至2019-05计算相对误差、画预测对照图更新数据2019-06以后按月追加重新拟合预测窗口为什么定3个月而不是6个月或12个月方案里要写理由。时间序列有“近大远小”效应越远的预测越依赖历史模式而新能源汽车销量受政策节奏、补贴退坡、新车上市影响外生变量一变化长窗口的误差会迅速放大。原文也明确说超过3个月范围的预测结果意义有限主要是通过更新数据来更新预测。这个边界写进方案答辩时反而显得严谨不是模型不能跑更远而是业务上不承诺更远。还有一点容易被忽略预测值要和实际值在同一口径上比较。回测表里实际销量12.6、9.7、10.1预测值11.5、9.2、9.5单位都是万辆相对误差按“绝对误差/实际值”算。如果实际值是零售口径、预测值按批发口径训练误差表再漂亮也没有意义。把切分、单位、口径三件事写在同一节里后面模型部分才有稳定的输入。3. 总体方案设计差分、季节项与(p,d,q)(P,D,Q)六参数的职责划分ARIMA不是把数据丢进软件点一下“自动预测”就完事。这个项目的序列有上升趋势又有12个月季节波动方案要把非平稳性处理、季节差分、定阶和检验拆成可解释的步骤。总体设计可以概括为先看原始序列和季节分解判断趋势与季节成分再用ADF检验和差分把序列变平稳然后用ACF、PACF定出(p,d,q)(P,D,Q)最后用参数显著性、残差检验和回测误差确认模型可用。每一步都要留下图表或表格答辩时能顺着讲。3.1 平稳性判断ADF、差分与季节差分原始月度销量从2014年到2019年整体上升不能直接假设平稳。平稳性判断通常看三样时序图有没有明显趋势、季节分解后趋势项和季节项是否显著、ADF单位根检验的p值。原文用SPSS做季节性分解看到序列随季节波动再按移位水平处理异常离散值做一次差分后逐渐表现出平稳特征ADF检验符合要求。这里的“一次差分”要结合最终模型理解模型是ARIMA(1,0,0)(1,1,0)非季节差分d0季节差分D1说明主要处理的是12个月周期上的季节非平稳而不是每个相邻月都做一阶差分。差分策略要避免两个极端。一个是完全不做差分序列带趋势和季节ACF衰减很慢定阶会失真另一个是d和D都设1甚至反复差分序列被“差没了”预测出来几乎是一条水平线。这个项目里季节周期明确为12先做季节差分D1是合理的非季节差分d0是因为趋势在季节差分后已经大幅削弱再用一阶差分容易过度。ADF检验在这里的角色是辅助确认不是唯一标准最终还要看ACF/PACF和回测误差。检查项看什么本项目处理时序图趋势、季节、极值上升趋势明显12个月周期季节分解趋势项、季节因子季节因子在0附近波动ADF检验p值是否小于0.05差分后满足平稳要求差分选择d和D是否过度d0D1季节周期12异常值极值月是否扭曲差分标记后做水平修正不直接删提示差分次数不是越多越稳。每多差一次样本就少一个解释难度也上一档。能在D1解决季节非平稳就不要顺手把d也设1。3.2 六参数含义与定阶p,d,q,P,D,Q分别管什么ARIMA(p,d,q)(P,D,Q)里小写字母管非季节部分大写字母管季节部分。p是自回归阶数表示用过去几个月的销量滞后值来拟合当前值d是非季节差分次数q是移动平均阶数表示用过去几个月的预测误差来修正P、D、Q分别是季节自回归、季节差分、季节移动平均季节周期s12。原文最终取p1、q0建立ARIMA(1,0,0)(1,1,0)意思是非季节部分用1阶自回归不做非季节差分不用移动平均季节部分用1阶季节自回归做1次季节差分不用季节移动平均。参数含义本项目取值判断依据p非季节自回归阶数1PACF在1阶后截尾d非季节差分次数0季节差分后趋势已削弱q非季节移动平均阶数0ACF未显示明显MA结构P季节自回归阶数1季节ACF/PACF支持1阶D季节差分次数112个月周期明显Q季节移动平均阶数0季节MA项不显著s季节周期12月度数据定阶不能只看软件自动推荐。原文用ACF和PACF分析原理做拟合最后取p1、q0并用SPSS对AR(1)做参数估计Sig小于0.05说明参数有统计学意义平稳R方0.538考虑季节变动的整体R方0.932。这里要解释清楚两个R方的差别平稳R方看的是差分后序列的拟合整体R方看的是原始水平上的拟合后者高不代表样本外预测一定准。定阶时我一般会准备一个小候选集比如p取0到2、q取0到1、P取0到1、Q取0到1在固定训练集上比较AIC、参数显著性和回测误差最后选一个解释得清楚、误差稳定的而不是AIC最小就无脑上。3.3 模型检验与拟合优度别把R方当唯一成绩模型跑出来以后至少看四件事。第一看参数显著性AR(1)和季节AR(1)的Sig是否小于0.05第二看残差是不是白噪声残差ACF不应有明显尖峰Ljung-Box检验p值通常希望大于0.05第三看拟合图预测曲线和实际曲线的趋势是否一致极值月偏差有多大第四看样本外回测误差2019年3—5月的相对误差是否在10%以内。原文的拟合图显示整体趋势基本一致但2018年12月销量高达22.5万辆、最低月份3.4万辆极值处误差偏大这个现象要在方案里主动写出来而不是藏起来。拟合优度指标要配合场景解释。整体R方0.932说明模型对历史月度销量的水平拟合不错平稳R方0.538说明差分后序列还有波动没被完全解释这两个数放在一起看比单独报一个0.932更可信。回测相对误差9%、5%、6%平均约6.7%说明3个月短期预测可用但不能拿这个误差去承诺全年每个月都准。模型检验的产出通常包括参数估计表、残差ACF图、拟合对照图和回测误差表这四样也是答辩时最容易被追问的材料。4. 落地实现从数据清洗到ARIMA(1,0,0)(1,1,0)拟合与三个月滚动预测实现部分要能复现不能只写“用SPSS跑了一个ARIMA”。原文使用SPSS完成季节性分解、ADF检验和ARIMA拟合方案落地时可以用Python的statsmodels做同样的模型结构也可以用SPSS时间序列建模器对照。关键是参数要对上order(1,0,0)seasonal_order(1,1,0,12)训练集到2019年2月回测2019年3—5月。下面给一套可复现的Python流程代码里的字段名和参数都可以直接替换成自己的数据。4.1 数据表结构与预处理脚本数据文件建议保持长表结构一行一个月字段至少包含month、sales、source_note、is_outlier、used_for_fit。读取后先按月份排序、设成索引、检查缺月再画原始序列。下面这段代码负责读数据、切训练集和回测集、做ADF检验。ADF检验在这里不是走过场而是把“序列是否平稳”变成一个可记录的p值后面写报告时直接引用。import pandas as pd import numpy as np import statsmodels.api as sm from statsmodels.tsa.stattools import adfuller # 读取月度销量表month为YYYY-MMsales单位为万辆 df pd.read_csv(nev_monthly_sales.csv, parse_dates[month]) df df.sort_values(month).set_index(month) # 只保留入模数据回测月used_for_fit0 y df.loc[df[used_for_fit] 1, sales].astype(float) # 训练集到2019-02回测集为2019-03至2019-05 train y.loc[:2019-02-01] test y.loc[2019-03-01:2019-05-01] # ADF检验p值小于0.05通常认为平稳 adf_stat, adf_p, used_lag, nobs, crit, _ adfuller(train, autolagAIC) print(ADF statistic:, round(adf_stat, 3)) print(ADF p-value:, round(adf_p, 4)) print(critical values:, crit)这段代码的关键参数是used_for_fit和切分日期。used_for_fit0的月份只做回测不进入拟合避免数据泄漏切分日期按项目实际数据改但训练集和回测集不能重叠。ADF的autolagAIC表示自动选滞后阶数报告里要写清楚检验的是原始训练序列还是差分后序列。如果原始序列ADF p值很大不要急着下结论先看季节分解和差分后的结果因为月度销量带季节项时原始序列不平稳是正常的。4.2 用statsmodels复现ARIMA(1,0,0)(1,1,0)模型结构要和原文对上非季节order(1,0,0)季节seasonal_order(1,1,0,12)。statsmodels的SARIMAX会自动做季节差分D1所以输入仍然是原始训练序列不需要手动先差一次再建模。trendn表示不额外加线性趋势项因为季节差分已经处理了主要趋势enforce_stationarity和enforce_invertibility设为False是为了让参数估计更接近统计软件的输出避免强行约束导致拟合失败。from statsmodels.tsa.statespace.sarimax import SARIMAX # ARIMA(1,0,0)(1,1,0,12)p1,d0,q0; P1,D1,Q0,s12 model SARIMAX( train, order(1, 0, 0), seasonal_order(1, 1, 0, 12), trendn, enforce_stationarityFalse, enforce_invertibilityFalse ) res model.fit(dispFalse) print(res.summary()) # 输出未来3个月点预测和95%预测区间 forecast res.get_forecast(steps3) pred forecast.predicted_mean ci forecast.conf_int(alpha0.05) print(预测值) print(pred.round(2)) print(95%预测区间) print(ci.round(2))代码里的order和seasonal_order是方案的核心参数不能随手改。p1对应非季节自回归1阶D1对应12个月季节差分P1对应季节自回归1阶q0和Q0表示不用移动平均项。res.summary()里重点看ar.L1和ar.S.L12的系数、标准误和P|z|如果季节AR项不显著就要回到定阶步骤重新比较候选模型。预测区间用alpha0.05得到95%区间报告里不要只写点预测极值月附近区间会明显变宽这正好说明模型的不确定性。注意不同软件对季节差分的写法不一样。SPSS里指定(1,0,0)(1,1,0)和statsmodels里seasonal_order(1,1,0,12)表达的是同一个结构报告里要统一写成ARIMA(1,0,0)(1,1,0)并注明季节周期12。4.3 回测与三个月预测结果回测不是把预测值画出来就完事要逐月算相对误差。下面代码把预测值、实际值、绝对误差、相对误差放在一张表里最后算平均绝对百分比误差。原文的回测结果可以直接作为对照2019年3月实际12.6、预测11.54月实际9.7、预测9.25月实际10.1、预测9.5相对误差9%、5%、6%。如果自己跑出来的结果差很多先检查单位、切分日期和季节周期再怀疑模型。# 把预测结果和实际值对齐 out pd.DataFrame({ month: test.index.strftime(%Y-%m), actual: test.values, pred: pred.values }) out[abs_err] (out[actual] - out[pred]).abs() out[rel_err] out[abs_err] / out[actual] print(out.round(3)) print(MAPE:, round(out[rel_err].mean() * 100, 2), %)月份实际销量万辆ARIMA预测值万辆相对误差2019-0312.611.59%2019-049.79.25%2019-0510.19.56%这张表是验收时最硬的材料。平均误差约6.7%单月最大9%说明3个月短期预测可用但2018年12月22.5万辆这种极值月模型误差会放大报告里要单独说明“极值月受一次性因素影响点预测偏保守”。滚动预测的做法是每个月拿到真实销量后把新数据追加进训练集重新拟合再预测下三个月而不是把上一次的三个预测值顺延。这样虽然计算量增加但能跟上政策节奏和市场变化。4.4 SPSS对应操作与结果核对原文使用SPSS完成季节性分解、ADF和ARIMA拟合复现时可以在时间序列建模器里选择“专家建模器”或手动指定ARIMA。手动指定时结构写(1,0,0)(1,1,0)季节周期12保存预测值和置信区间输出参数估计表和拟合图。核对结果看三个地方AR(1)和季节AR(1)的Sig是否小于0.05平稳R方和整体R方是否接近原文的0.538和0.932回测三个月的相对误差是否在9%、5%、6%附近。软件只是计算器参数结构和数据切分对不上换什么软件都复现不出来。如果SPSS输出和Python结果有小数差异通常是参数估计方法、初始化方式或是否包含趋势项不同不必强行调成完全一样。报告里写清楚“使用ARIMA(1,0,0)(1,1,0)季节周期12训练集2014-01至2019-02回测2019-03至2019-05”读者就能判断差异来源。对毕设/课设来说能解释参数、能复现回测表、能说清误差边界比追求小数点后两位更重要。5. 避坑与排查销量预测项目里最容易翻车的五件事ARIMA项目的坑大多不在公式而在数据口径、差分策略和结果解释。下面五条是带做销量预测毕设/课设时最常遇到的问题每条按“现象—原因—解决”写照着排查能省不少返工。5.1 数据口径混用批发量和零售量拼在一张表里现象是预测曲线在某个月突然跳变回测误差集中在一个月但模型参数看起来都显著。原因通常是数据来源换了口径前半段用批发销量后半段用零售销量或者单位从辆改成万辆却没统一。解决方法是固定一个统计口径在source_note里记录来源和更新时间把单位统一成万辆对口径切换的月份做标记能修正就修正不能修正就在报告里说明。数据口径这一列看着不起眼答辩时被问“为什么2018年12月是22.5万辆”就靠它解释。5.2 差分过度d和D都设1序列被“差没了”现象是ACF很快截断预测出来几乎是一条水平线R方还不低。原因是趋势和季节成分被重复处理已经做了季节差分D1又做一阶差分d1序列剩下的信息太少。解决方法是先画原始序列和季节分解图确认季节周期12是否明显用ADF检验辅助判断但不要只看p值在d0和d1、D0和D1之间做小范围比较选回测误差稳定、残差没有明显结构的组合。这个项目最终用d0、D1不是拍脑袋而是季节差分后趋势已经削弱再加非季节差分容易过度。5.3 定阶只信软件自动推荐现象是换一段训练集软件推荐的阶数就变答辩时说不清为什么选这个模型。原因是自动定阶通常按AIC或BIC搜索小样本下不稳定候选模型之间AIC差一点不代表预测能力差很多。解决方法是限定一个小候选集比如p取0到2、q取0到1、P取0到1、Q取0到1在固定训练集上比较参数显著性、残差白噪声和回测误差最后选一个参数都能解释、回测不崩的模型。软件推荐可以作为起点但不能代替判断。5.4 把预测区间当承诺忽略政策和极值现象是点预测看着还行但某个月实际销量远超区间或者极值月误差明显放大。原因是ARIMA只学历史序列的自相关和季节结构不解释补贴退坡、新车上市、统计口径变化这些外生因素原文也提到政策改变会造成销量改变所以主要靠更新数据来更新预测。解决方法是把预测窗口限定在3个月输出95%区间而不是只报点预测对极值月单独标注建立人工修正规则比如政策发布后追加新数据重估而不是硬扛旧模型。把边界写进报告比强行承诺“全年误差5%”更可信。5.5 只报R方不报回测误差现象是整体R方0.932很好看但答辩被问“未来三个月误差多少”就卡住。原因是拟合优度衡量的是历史样本内的解释程度样本外预测能力要看留出回测。解决方法是固定训练集和回测集逐月算相对误差和MAPE最好再加一个季节朴素基线做对比报告里同时写平稳R方、整体R方和回测误差别只挑好看的那个。我见过不少方案在这里翻车图表很漂亮一问回测就发现训练集和验证集混在一起这种后悔药只能靠提前切分来吃。6. 验收与答辩用回测误差、置信区间和业务解释把方案讲圆6.1 答辩只讲三张图第一张讲原始月度序列和季节分解2014年至2019年整体上升2—3月淡季、10月至次年1月旺季季节周期12成立。第二张讲ACF/PACF和定阶为什么d0、D1为什么p1、q0、P1、Q0参数Sig小于0.05。第三张讲回测2019年3—5月实际与预测对照相对误差9%、5%、6%平均约6.7%并说明极值月误差会放大。三张图讲完模型结构、数据切分和误差边界就都覆盖了不需要堆公式。6.2 验收清单验收项合格标准材料数据口径单位万辆、来源可追溯数据字段表切分方式训练集与回测集不重叠切分表平稳性ADF和差分策略能解释时序图、ADF结果参数显著性关键参数Sig0.05参数估计表残差检验残差无明显结构残差ACF图回测误差相对误差≤10%三个月对照表预测边界只承诺3个月输出区间预测区间表6.3 一个具体技巧把“误差最大的月份”提前写进答辩稿答辩时最怕被问“哪个月预测最差”。与其等老师追问不如提前把误差最大的月份和原因写进稿子极值月销量波动大ARIMA对一次性因素反应慢所以点预测偏保守但区间覆盖了实际值后续通过按月更新数据和人工修正来处理。这样做不是暴露缺点而是证明你知道模型边界。从那以后我每次带做预测类毕设都强制让同学先交一页数据口径和回测表再谈模型这套PDF里的图表和参数表可以当对照模板需要按这份结构直接改课设/毕设的可以从文末入口取完整资料把数据换成本地口径即可。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑