ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

新能源车销量预测组合模型拆解:二次平滑+灰色预测+IOWA动态加权

新能源车销量预测组合模型拆解:二次平滑+灰色预测+IOWA动态加权 简介《新能源电动车销量预测模型的应用》是一篇面向能源政策研究者、汽车行业分析师及高校相关专业师生的学术文献聚焦新能源乘用车销量预测问题。资源为单文件PDF大小1.07MB已有148人学习/浏览。文献以2012—2015年16个季度全国乘用车销量数据为基础系统介绍了二次指数平滑法、融入季节变动指数的改进灰色GM(1,1)模型以及基于IOWA算子的组合预测模型并给出模型公式、参数估计与2016年分季度预测实例。通过对比验证组合模型能依据不同时点预测精度动态调整权重有效提升预测准确性。读者可直接获取三种预测方法的完整推导、季节指数计算过程及实例仿真结果可用于课程设计、课题研究或企业销量分析参考。1. 一份 2016 年的销量预测模型凭什么现在还能照着用做新能源车销量预测的人手头最不缺的就是模型——LSTM、Prophet、XGBoost 回归预测模型随便抓一把但真到上线时往往连“预测模型该先解决趋势还是先解决季节波动”都没理清。这份 PDF 是 2016 年发在《辽宁科技大学学报》上的论文数据只有 16 个季度方法也老二次指数平滑、改进灰色预测、IOWA 组合预测。可它把一件事讲透了单一模型为什么不准、组合模型怎么把误差从 74.72% 压到 20.46%。对今天做销量预测、库存计划、产能规划的分析师来说它的价值不在算法新旧而在“小样本 强季节波动”场景下的完整推演过程。适合谁读刚接手新能源销量预测、被数据量不足折磨的人以及想给现有 ML 模型加一层动态加权的进阶玩家。2. 二次指数平滑模型很简单参数选择才是分水岭2.1 先看懂它为什么适合短期预测指数平滑本质是加权平均的变体离当前时点越近的观测值权重越大越远的权重越小。论文里给出的通式是S(1)t α·yt (1-α)·S(1)t-1其中 α 是平滑系数取值范围 (0,1)。α 越大模型越相信最近一期的真实值α 越小模型越倾向于维持历史平均水平。一次指数平滑只适合趋势稳定的序列但新能源车销量从 2012 年到 2015 年整体是向上的只是中间有剧烈抖动所以论文选了二次指数平滑——在一次平滑结果上再做一次平滑用两次平滑值的差来估计线性趋势。二次平滑的递推式是S(2)t α·S(1)t (1-α)·S(2)t-1预测模型为ŷ(tT) at bt·T其中at 2·S(1)t - S(2)tbt [α/(1-α)]·(S(1)t - S(2)t)这个结构的直观含义是at 相当于“当前的基准水平”bt 相当于“当前估计出的每期增量”。论文用 2012 到 2015 年 16 个季度的数据建模取 α0.6 时拟合精度最高然后用这个模型外推 2016 年四个季度。2.2 用 Python 复现二次指数平滑我在本地跑了一遍论文的流程代码大概长这样import numpy as np def double_exp_smoothing(series, alpha, forecast_horizon4): # 一次、二次平滑值都从第一个观测值开始初始化 s1 [series[0]] s2 [series[0]] for t in range(1, len(series)): s1.append(alpha * series[t] (1 - alpha) * s1[t-1]) s2.append(alpha * s1[t] (1 - alpha) * s2[t-1]) a_t 2 * s1[-1] - s2[-1] b_t (alpha / (1 - alpha)) * (s1[-1] - s2[-1]) # 外推 forecast_horizon 个季度 forecast [a_t b_t * T for T in range(1, forecast_horizon 1)] return forecast # 2012Q1~2015Q4 全国新能源乘用车销量辆 sales [1614, 1468, 1337, 5485, 2518, 2291, 2104, 8093, 12254, 9150, 8192, 28952, 26300, 25104, 45177, 80046] pred double_exp_smoothing(sales, alpha0.6, forecast_horizon4) print(pred)这段代码里的初始化方式很关键s1 和 s2 都取第一个观测值这是指数平滑的常见做法因为递推式里没有 t0 的值可依赖。α0.6 是论文里经过网格搜索得到的“局部最优”换成其他数据集时这个值大概率要重调。2.3 α 怎么调才靠谱论文没有展开讲 α 的搜索过程只说了 0.6 时精度最高。我自己习惯的做法是把 0.05 到 0.95 按步长 0.05 扫一遍对每个 α 做样本内拟合计算平均绝对百分比误差MAPE选误差最小的那个。但要小心两点。第一α 只能在给定数据集上“最优”不代表未来也最优。销量数据存在结构性突变——2014 年第四季度销量从 8192 辆跳到 28952 辆这种跳跃会让模型在突变点附近误差剧增。第二二次指数平滑假设趋势是线性的而新能源车销量早期接近指数增长所以论文里二次指数平滑的平均相对误差高达 74.72% 并不意外。它适合的是“短期、趋势平稳”的场景给 2016 年做年度外推已经是它的能力边界。3. 改进的灰色预测把季节变动指数叠进 GM(1,1)思路比公式值钱3.1 灰色预测在卖什么药灰色 GM(1,1) 模型的核心假设是系统行为虽然看起来杂乱但背后有一条指数规律可循。建模时先对原始序列做一次累加生成1-AGO把波动较大的原始序列变成单调递增序列再用一阶微分方程去拟合这条增长曲线最后累减还原。论文中的白化方程是dx(1)/dt a·x(1) p参数 a 和 p 用最小二乘估计公式为[a, p]ᵀ (BᵀB)⁻¹BᵀYn其中 B 是紧邻均值生成矩阵Yn 是原始序列从第二项开始的列向量。论文用 16 个季度的数据跑下来得到 a -0.3217p -1279.1时间响应式为x̂(1)(k1) 2036.0297·e^(0.32165t) 4836.1584注意这里 a 是负的说明指数项是增长的符合销量上行的大趋势。但问题也出在这标准的 GM(1,1) 只认“指数增长”这一种形状完全看不见“每年四季度冲高、一季度回落”的节律。所以论文做了一个很实用的改进——把季节变动指数乘到灰色预测值上。3.2 季节变动指数怎么算为什么是“除法”季节变动指数的计算分三步第一步算每个季度的多年平均值。比如第一季度取 2012Q1、2013Q1、2014Q1、2015Q1 的平均值记为 A₁第二季度取四年的 Q2 平均值记为 A₂以此类推。第二步算全部 16 个季度的总平均值记为 B̄。第三步用每个季度的均值除以总均值得到季节指数 Ci Aᵢ / B̄。如果某个季度的 Ci 大于 1说明这个季度是旺季小于 1 则是淡季。把灰色预测的基准值乘上 Ci就相当于给“指数增长曲线”叠加了一层季节性外壳。用 Python 实现这一步很简单import numpy as np sales np.array([1614, 1468, 1337, 5485, 2518, 2291, 2104, 8093, 12254, 9150, 8192, 28952, 26300, 25104, 45177, 80046]) # 按季度位置 0~3 分组算多年均值 season_avg np.array([sales[i::4].mean() for i in range(4)]) grand_avg sales.mean() season_index season_avg / grand_avg print(各季度季节指数:, season_index)我跑出来的结果是第四季度季节指数明显大于 1第一季度小于 1——这和新能源车年末冲量、年初回落的真实节奏吻合。这里有一个容易被忽略的细节季节指数用的是“各年同季均值与总均值之比”不是“各年同季值与上季值之比”。前者衡量的是绝对水平差异后者衡量的是环比波动两者含义完全不同混用会导致预测值系统性偏移。3.3 改进后的灰色预测为什么还是不够好论文中改进灰色预测的平均相对误差是 44.26%比二次指数平滑的 74.72% 好很多但仍然不算理想。原因有两层。第一灰色模型的指数内核和销量数据并不完全匹配。2015 年第四季度销量达到 80046 辆而模型预测值只有 150895 辆——如果对照论文表 1改进灰色预测在 2016 年四个季度的值分别为 63,168、77,594、159,966、476,082可以看出它把 2015Q4 的真实值 80,046 预测成 150,895误差几乎翻倍。这不是季节指数能救回来的因为季节指数是多年平均的“形状”而 2015Q4 的暴增是政策驱动的“脉冲”灰色模型一视同仁地把所有增长都归因到指数曲线上。第二GM(1,1) 对数据量极其敏感。16 个样本算两个参数自由度并不宽裕如果原始序列里有极端值最小二乘估计会被拉偏。论文中 a 和 p 的值是在这 16 个点下估计的换成另一组数据参数可能完全不同。所以改进灰色预测真正适合的场景是数据量小、整体呈指数增长、季节波动稳定可重复。用于新能源车这种政策扰动频繁的市场必须再叠一层机制来修正误差——这正是接下来要说的 IOWA 组合预测的切入点。4. 基于 IOWA 算子的组合预测动态加权才是这套模型的灵魂4.1 普通加权平均和诱导有序加权平均差在哪常见的组合预测是给每种方法固定一个权重比如指数平滑占 0.6、灰色预测占 0.4然后对所有时点一视同仁地加权。问题在于2012 年可能是指数平滑更准2015 年也许是灰色预测更好。固定权重无法反映“各方法在不用时点的表现差异”。IOWA 算子诱导有序加权平均解决这个问题的方式很直接每个时点上先看哪种方法的预测精度更高把更高的排在前面然后按排序结果分配权重。论文中把“预测精度”定义为ait 1 - |(xt - xit) / xt|当 |(xt - xit) / xt| 1ait 0当 |(xt - xit) / xt| ≥ 1注意这里的精度不是平均精度而是“第 i 种方法在第 t 时刻”的瞬时精度。每个时点 t 都有两种方法的两个精度值和两个预测值组成二维数组 [ait, xit]。把精度从大到小排序对应预测值的位置也随之重排再与权重向量 w 做加权求和就得到该时点的组合预测值。用大白话说哪个方法在这个季度表现好就把更大的权重分给它。这就是“诱导有序”的含义——排序由预测精度诱导产生而不是预先指定的固定顺序。4.2 最优权系数怎么求目标函数和约束条件论文把权重的求解写成最优化问题。设两种单项方法的预测误差分别为 e1t 和 e2t排序后对应误差的平方和为min S(ω1, ω2) Σₜ (误差排序加权值)²约束条件是 ω1 ω2 1且 ωi ≥ 0。论文代入 16 个季度的数据后得到最优化模型min S(ω1, ω2) 792,944,854·ω1² - 1,630,258,056·ω1·ω2 7,156,651,702·ω2²用 MATLAB 最优化工具箱求解最优权系数为 ω1 0.83ω2 0.17。这里 ω1 对应的是“在大多时点精度排名靠前”的方法——从论文表 2 的误差对比看改进灰色预测在多数季度误差更小所以它拿到了 0.83 的权重。我自己用 Python 复现时把优化问题写成了更通用的形式import numpy as np from scipy.optimize import minimize def optimize_iowa_weights(err1, err2): err1, err2: 两种单项方法在各时点的绝对误差数组 返回最优 w1w2 1 - w1 n len(err1) def objective(w): w1 w[0] w2 1 - w1 total 0 for t in range(n): # 精度高误差小的方法排在前面对应权重 w1 # 精度低的方法排在后面对应权重 w2 if err1[t] err2[t]: total (w1 * err1[t] w2 * err2[t]) ** 2 else: total (w2 * err1[t] w1 * err2[t]) ** 2 return total res minimize(objective, x0[0.5], bounds[(0, 1)]) return res.x[0]代码里的排序逻辑和论文公式是对应的当第 t 时点方法 1 误差更小它在排序后占据“精度高”的位置获得权重 w1反之则方法 2 占据这个位置权重互换。由于论文里两种方法的误差量级差异巨大直接用误差平方做目标函数优化器会天然把权重压向误差更小的那个方法——这正是组合预测能改善精度的原因。4.3 外推预测时权重怎么从“历史”搬到“未来”组合模型的难点不在拟合而在外推。论文的处理方式是基于“预测连贯性”原则用最近 k 期的平均预测精度来代表未来 k 期的精度水平公式是āi(T) (1/T)·Σt0..T-1 ai(N-t)也就是说要预测 2016 年第一季度就取两种方法在 2015 年最近几个季度的平均精度按这个顺序决定权重分配。论文最终给出 2016 年全年销量预测为 57.1926 万辆比 2015 年增长超过 200%。这个数字本身是否准确不重要——重要的是它演示了“滚动更新权重”的操作范式。真正上线时每来一个新季度就要把窗口向后滑动一个季度重新计算各方法的近期平均精度再对下一季度做加权外推。固定权重只适合方法表现稳定的场景而新能源销量受补贴政策、新车型上市等因素影响各方法在不同时期的优劣排序会变滚动权重才有生命力。论文表 2 的对比结果是二次指数平滑平均相对误差 74.72%改进灰色预测 44.26%IOWA 组合预测 20.46%。误差下降了不止一半说明“动态加权”确实比“固定加权”更能捕捉两种方法的优势区间。5. 避坑与常见问题从参数估计到季节口径的五条踩坑记录5.1 季节变动指数算出来把预测值怼上了天现象用改进灰色预测外推 2016 年第四季度销量得到 47.6 万辆明显不合理——即使当年新能源车暴涨单季度也不可能有这个量级。原因季节指数是“多年同季均值 / 总均值”但新能源车销量本身就呈指数增长早期低基数季度和后期高基数季度混在一起算均值会严重抬高季节指数。第四季度的“季节性”里其实混入了长期趋势导致乘法修正被放大。解决先对序列做趋势分离再用去趋势后的残差算季节指数。常见做法是先用一次指数平滑或移动平均提取趋势项把原始序列除以趋势项得到季节-不规则成分再按季度平均。直接拿原始数据算季节指数只能在趋势平缓时用。5.2 灰色预测参数在数据剧烈波动时直接变成“玄学”现象GM(1,1) 的 a 和 p 依赖最小二乘估计当序列里有异常大值比如 2015Q4 的 80046时间响应式的指数项会被拉得极陡后续预测值迅速膨胀。原因灰色模型本质是用指数曲线拟合累加序列数据的一次累加会放大尾部权重极端值对曲线形状的影响比普通回归更大。16 个样本里一个极端值就能改变 a 的符号和量级。解决建模前先做 outlier 处理或者对原始序列做对数变换再进灰色模型。如果销售低谷期出现过“零销量”或“退坡前抢购”这类特殊数据点千万别直接丢进 GM(1,1)。5.3 α 在样本内调到 0.6不代表换一段数据还是它现象论文里 α0.6 是 2012~2015 年样本内拟合的最优值但把模型滚动到 2016 年后预测误差可能远大于样本内表现。原因样本内调参天然过拟合。α 选择的是“哪条平滑曲线更贴合历史”但贴合历史不等于贴合未来尤其在政策驱动型市场里结构突变随时发生。解决把数据集按时间切成训练集和验证集。比如用前 12 个季度调 α后 4 个季度做样本外验证选验证集误差最小的 α 而不是训练集误差最小的。时间序列数据不能随机切分必须按时间顺序保持连续性。5.4 把样本内拟合误差当成“预测精度”宣传现象论文表 2 列出三种模型的平均相对误差分别是 74.72%、44.26%、20.46%这些数字容易让人误以为“未来预测误差也在 20% 左右”。原因这是样本内拟合误差——模型见过这些真实值是用真实值反向估算出来的误差。对 2016 年做外推时模型没有任何真实值可以参考误差大概率更高。解决做真正的样本外滚动验证。做法是用 2012Q1~2014Q4 训练模型预测 2015 年四个季度再扩展到 2015 年前三季度预测 2015Q4每次向前滚一步记录真实误差。这样得到的误差才有参考价值。5.5 IOWA 在小样本下权重容易被“偶然误差”绑架现象两种单项方法在 16 个时点上各有胜负IOWA 权重算出来是 0.83/0.17但如果换掉某一个季度的数据权重可能变成 0.6/0.4。原因样本量太少少数几个时点的误差排序就决定了目标函数形状权重解不稳定。论文里 2013Q2 的指数平滑误差高达 0.79这一个大点就足以把权重推向灰色预测。解决给权重加约束比如限制 ωi ∈ [0.2, 0.8]防止权重极端偏向一边或者用 Bootstrap 抽样重算权重观察权重分布。如果分布跨度很大说明两种方法在该数据集上没有稳定的优劣关系组合模型的意义就要重新考虑了。6. 把论文模型搬到生产环境的一个落地技巧滚动精度加权与三层验证这套模型真正能落地的部分不是 GM(1,1)也不是二次平滑而是“按近期精度动态分配权重”这个框架。我一般会把 IOWA 这层壳换到更强的基模型上——比如把改进灰色预测换成 XGBoost 回归预测模型把二次平滑换成长短时记忆网络LSTM然后依然用 IOWA 思路做动态集成。基模型负责捕捉非线性IOWA 层负责在多个模型之间按近期表现切换权重。具体做法是每季度末计算每个基模型在最近 4 个季度的平均绝对百分比误差MAPE按误差从小到大排序误差最小的模型拿到最大权重。这里不需要重新训练模型只需更新权重计算成本几乎为零。验证方法要分三层走不能只盯一个指标。第一层是样本内拟合误差用来检查模型有没有实现失误第二层是滚动样本外误差用训练集和测试集切分记录每步真实误差第三层是方向一致性——如果预测值和真实值都涨了 50%虽然数值误差不小但方向判断正确对产能规划也有参考价值。只有三层都通过模型才值得推到业务侧。从拿到这份 PDF 到现在我养成的习惯是每次做新能源销量预测先在 Excel 里看一遍季度曲线判断趋势和季节节律是否清晰然后再决定要不要上灰色模型或 IOWA 集成。论文可以老但方法骨架一旦吃透换数据、换基模型都只是换皮的事。希望这篇拆解能让你少走几圈弯路。本文还有配套的精品资源点击获取
返回列表