9 种模型同台竞技——一个供应链预测系统的模型设计哲学
这是“天枢系统”系列博客的第三篇。前两篇分别从系统设计原则和数据清洗的角度,回答了“数据从哪来、如何变干净”;这一篇进入预测的核心,聊聊为什么需要 9 种模型、它们如何“模拟考试”,以及那个最重要的铁律:一个好预测必须同时满足准确度高和没有系统性偏差。
0. 为什么预测是有用的?
在进入模型之前,先回答一个更根本的问题:预测到底有什么用?
答案可以从以下几个层面来理解。
0.1 决策的前提:没有预测,就没有理性选择
任何面向未来的行动,都隐含着一个对未来的判断。
你决定今天出门带不带伞,是基于对下雨可能性的预测;企业决定扩大生产,是基于对市场需求的预测;政府决定加息,是基于对通胀走势的预测。
即使你说“我不做预测”,你实际上也在默认“未来会跟现在差不多”——这本身就是一种预测,只是比较粗糙。
所以,预测的有用性首先在于:它是所有理性决策的起点。没有预测,决策就只能是碰运气。
0.2 将不确定性转化为可管理的风险
未来是不确定的,但不确定不等于完全不可知。预测的作用,就是把“不知道会发生什么”变成“知道各种结果的可能性有多大”。
一旦不确定性被量化,我们就可以评估风险、制定应对方案、选择期望收益最大的行动。预测的价值不在于消除风险,而在于让我们有能力管理风险。
0.3 创造时间差:提前行动,占据主动
预测让我们能够提前采取行动,而不是等到事情发生后才被动反应。
台风预测让居民提前转移;销量预测让工厂提前备料;流行病预测让政府提前储备医疗资源。时间差本身就是巨大的优势。在商业、军事、公共安全等领域,谁预测得更早、更准,谁就拥有主动权。
这一点在供应链上体现得尤其具体:采购需要提前下订单,生产需要提前排产,仓库需要提前备料。如果不知道未来卖多少,就只能等订单来了再行动——这在竞争激烈的市场里,往往意味着错失机会。
0.4 反馈循环:预测是学习与适应的核心机制
预测不仅用于行动,还用于检验和改进我们的认知。
当我们做出预测后,实际结果会给我们反馈:如果预测准确,说明模型捕捉到了真实规律;如果预测错误,说明模型有缺陷,需要修正。这种“预测—反馈—修正”的循环,是人类学习和科学进步的基本方式。
在天枢系统的设计里,这个循环被直接落地为模型竞赛机制:每个模型都要先在验证集上接受检验,表现好的留下,表现差的淘汰。预测系统本身也在通过反馈不断进化。
0.5 适应性的生存优势
预测能力是生物进化的产物。动物必须预测猎物的移动、天敌的出现、季节的变化,才能生存和繁衍。人类将这种能力发展到极致——我们预测天气、市场、社会趋势,甚至预测他人的行为,从而协调合作。
拥有更好预测能力的个体、组织或社会,往往更能适应环境变化,获得竞争优势。企业也是如此:预测更准的企业,库存可以压得更低,响应可以更快,资金效率更高。
0.6 落到供应链:拿信息换库存
说了这么多,回到我们的主题。预测在供应链管理中的核心作用,可以概括为一句话:拿信息换库存。
库存本质上是为了应对不确定性而存在的。预测越准,需要备的安全库存就越少,资金占用就越低。信息越充分,库存越可以压得低;信息越缺乏,库存就得备得越多。
所以,预测不是为了预测而预测,而是为了让供应链的每一个环节都能提前行动,用更低的成本满足客户需求。预测不一定准确,但有预测的决策质量,通常优于没有预测的决策质量。这就是预测最根本的用处。
1. 为什么需要 9 种模型?
很多预测系统的做法是:选一个“看起来不错”的模型,比如移动平均或指数平滑,然后对所有产品一视同仁。
但天枢系统的设计逻辑正好相反:没有一种预测方法能通吃所有产品。爆款和长尾的需求模式完全不同,成熟品和新品的规律也不一样。如果用一个模型硬套,结果要么是爆款预测偏低,要么是长尾预测虚高。
所以我们引入了 9 种预测模型,分成五个模型族:
- 移动平均系:看近期均值,抹平波动
- 指数平滑系:越近的数据权重越大
- 季节模型系:记住以周为主的周期性规律
- 间歇性需求系:专治偶尔卖一次
- 朴素基线系:最简单的参照
每次预测时,系统会根据物料分层的结果,让该产品所在层级开放的所有模型同时上阵,用最近 30 天的实际销量做一场“模拟考试”,选出其中表现最好的一个,作为它本次的“专属预测师”。
具体哪些模型有资格参赛,由下一小节的物料分层规则决定。
1.1 物料分层:谁有资格参赛
9 种模型是候选池,但并不是每个产品都开放全部模型。物料分层的核心逻辑是:数据质量决定模型复杂度,模型复杂度决定预测可靠性。
不同产品的历史数据质量天差地别:
- 爆款(A):天天有销量,数据密集、稳定,足以支撑复杂模型。
- 腰部(B):偶有间断,数据一般,只够支撑中等复杂度的模型。
- 稀疏(C):历史太短,数据点很少,模型没有足够样本学规律。
- 长尾(I):大量零值,偶发非零,需求间歇性强,复杂模型容易把偶然噪声当成规律。
所以物料分层做的是匹配:数据质量高,开放复杂模型;数据质量低,只用简单模型兜底。
物料分层为什么值得做?不做分层,用同一种模型预测所有产品,会出现两种典型问题:
- 对数据充分的产品:简单模型(如保底-月均法)预测太粗糙,浪费了数据里蕴含的丰富规律,导致预测准确度偏低、库存偏高。
- 对数据稀疏的产品:复杂模型(如 Holt-Winters)在稀疏数据上容易过拟合,把偶然波动当成趋势,导致预测忽高忽低,计划员不敢用。
分层之后,每个产品都能用上“数据质量撑得起的最高级模型”:
| 好处 | 说明 |
|---|---|
| 防止一刀切 | 避免用错误模型预测错误产品 |
| 提高预测可靠性 | 数据质量与模型复杂度匹配,减少过拟合和欠拟合 |
| 降低计算成本 | 不是所有产品都跑 9 种模型,数据稀疏的只跑基础模型 |
| 保证长尾特殊处理 | 间歇性需求用 Croston 系列,不被常规模型拖累 |
一句话:分层让爆款充分挖掘规律,让长尾不被复杂模型误导,让稀疏不因数据少而硬撑。
系统从清洗后的 SalesClean 表中,为每个产品计算三个指标。三个指标统一基于最近 365 天的取数窗口统计,保证可操作、可复现:
- 数据天数:最近 365 天窗口内,从物料主数据中的上市日期到统计日的天数(不足 365 天按实际天数,超过则截断)。它反映产品在市场上存活了多久,与是否有销售无关。若产品上市日期缺失,系统会提示补全,否则无法正确分层。
- 零值占比:零值天数 ÷ 数据天数。它反映在“上市后的有效窗口内”,需求是连续还是间歇。超过 40% 时,产品被标记为间歇性需求(I 级)。
- 变异系数(CV):最近 365 天内,标准差与均值的比值,衡量需求的“稳定程度”。CV 越小,需求越稳定;CV 越大,波动越剧烈。
其中,CV 作为分层后的修正因子,默认规则如下:
- CV ≤ 1.0:需求稳定,不触发降级。
- 1.0 < CV ≤ 3.0:需求有一定波动,维持原层级。
- CV > 3.0:需求波动剧烈,在零值占比和数据天数判定的基础上降一级(A→B,B→C)。C 级不再降级,I 级由零值占比单独决定,与 CV 无关。
CV 阈值(1.0 和 3.0)是系统默认值,可在配置中调整。CV 修正放在零值占比和数据天数判定之后执行。
三个指标共同决定产品的层级,判定顺序为:先看零值占比,再看数据天数,最后用 CV 修正。具体划分规则如下:
| 层级 | 划分规则 | 开放模型池 |
|---|---|---|
| A 级(爆款) | 零值占比 ≤ 40%,且数据天数 ≥ 180 天且跨度 ≥ 270 天 | SMA、WMA、EMA、Holt、Holt-Winters、Croston、Croston-SBA、保底-上周同天、保底-月均法(全部 9 种) |
| B 级(腰部) | 零值占比 ≤ 40%,且数据天数 ≥ 60 天,但未达 A 级标准 | SMA、WMA、EMA、Holt、Holt-Winters、保底-上周同天、保底-月均法(7 种) |
| C 级(稀疏) | 零值占比 ≤ 40%,但数据天数不足 60 天 | SMA、WMA、保底-上周同天、保底-月均法(4 种) |
| I 级(长尾) | 零值占比 > 40% | Croston、Croston-SBA、保底-月均法(3 种) |
“稀疏”与“长尾”的区别:稀疏(C 级)是因为上市时间短、数据量少,但需求本身是连续的(零值占比不高);长尾(I 级)是因为需求本身间歇,大量日子没有销量(零值占比高)。两者维度不同,判定优先级为先看零值占比,再看数据天数,因此不会混淆。
物料分层只处理“正常在售”的物料。对于计划下市的物料,系统会在分层之前根据物料主数据中的生命周期状态单独标记,不参与常规模型竞赛,改用衰退策略或直接按订单执行。否则,下市物料因销量下滑、零值增多,可能被误判为间歇性需求,用错模型。
这样分层的结果是:数据越充分,模型池越大,竞争越激烈;数据越稀疏,策略越保守,宁可降级也不强行用复杂模型。物料分层是数据清洗之后、模型竞赛之前的独立计算步骤。
关于“9 种模型”的说明:这里的“9 种”指的是算法层面。每种算法内部还包含若干参数变体(如 SMA 有 3/7/14 三种窗口,EMA 有 0.1~0.7 四档 α)。在模型竞赛中,每种算法会先在内部调参,选出自己的最优参数配置,然后以该最优配置作为唯一代表与其他算法竞赛。因此,最终参赛的仍是 9 个算法代表,而不是全部参数组合。架构图中列出的参数范围,只是内部调参时的尝试选项,并非独立参赛选手。
2. 时间序列的系统性维度与随机波动
在正式介绍模型之前,先建立一个基本的分析框架:任何一条需求历史,都可以从三个系统性维度来理解,剩下的部分则是随机波动。
| 维度 | 特征 | 性质 |
|---|---|---|
| 水平 | 需求忽高忽低,但没有明显的趋势和季节性 | ✅ 系统性,可预测 |
| 趋势 | 随时间推移,需求呈现增长或降低 | ✅ 系统性,可预测 |
| 周期性(季节性) | 需求呈现交替性的高峰和低谷,有规可循 | ✅ 系统性,可预测 |
| 随机波动 | 除掉前三者之后的“剩余物” | ❌ 非系统性,不可预测 |
这个分解有着极其重要的实践意义:大部分变动其实是可知的,只有一小部分是真正不可知的。预测模型的任务,就是把“可知的系统性部分”尽量准确地提炼出来,把“不可知的随机波动”留给安全库存去应对。
3. 五个模型族,九种武器
3.1 移动平均系——“看近期均值”
| 模型 | 原理 | 适用场景 | 参数 |
|---|---|---|---|
| 简单移动平均 (SMA) | 过去 N 天平均卖多少,明天大概也卖这么多 | 销量稳定的成熟产品 | 窗口大小 N(3/7/14) |
| 加权移动平均 (WMA) | 还是近 7 天,但昨天比上周更重要 | 需求有惯性的产品 | 权重方案(线性递减) |
注意:SMA 的窗口只设了 3/7/14 三档,没有 30 天。因为 SMA(30) 与朴素基线系的“保底-月均法”在数学上完全等价,如果同时保留,竞赛中就会出现重复选手。因此,让 SMA 专注短期窗口,月均法作为基准线独立存在,各司其职。SMA(14) 与月均法只是窗口长度不同,并非重复,因此可以保留。
3.2 指数平滑系——“越近记得越牢”
| 模型 | 原理 | 适用场景 | 参数 |
|---|---|---|---|
| 一次指数平滑 (EMA) | 今天预测 = 昨天预测 + α × 昨天误差 | 无趋势的平稳需求 | 平滑系数 α(0.1~0.7) |
| 双参数指数平滑 (Holt) | 增加趋势项 β,能跟踪上涨或下跌 | 新品爬坡、老品衰退 | α(水平)、β(趋势) |
3.3 季节模型系——“记住以周为主的周期性规律”
| 模型 | 原理 | 适用场景 | 参数 |
|---|---|---|---|
| 温特斯法 (Holt-Winters) | 同时学习水平、趋势、季节指数 | 有明显周规律或淡旺季的产品 | α、β、γ(季节) + 季节周期长度 p |
关于季节周期:天枢系统的日粒度数据默认采用 周周期(p=7),因为日常消费品最普遍的是“周一高、周末低”的周规律。如果要捕捉年度淡旺季(如冬装/夏装),需要更长的历史数据和更长的验证窗口——这是当前版本的一个已知局限,暂以周周期为主。
3.4 间歇性需求系——“专治偶尔卖一次”
| 模型 | 原理 | 适用场景 | 参数 |
|---|---|---|---|
| Croston 方法 | 只关注非零需求量和间隔天数 | 长尾冷门产品 | 平滑系数 α(约0.1) |
| SBA 修正法 | Croston 的去偏版本 | 同上,但更准、更不偏 | α(约0.1)+ 修正系数 |
3.5 朴素基线系——“最简单的参照”
| 模型 | 原理 | 适用场景 | 参数 |
|---|---|---|---|
| 保底-上周同天法 | 直接取上周同天的销量 | 周规律极强的产品 | 无 |
| 保底-月均法 | 近 30 天均值 | 数据极稀疏时的兜底方案 | 无 |
朴素基线系为什么存在? 因为它们是所有复杂模型的“及格线”。如果一个复杂模型的表现连“上周同天”都比不过,那它就没有存在的价值。
4. 模型竞赛机制:训练集 vs 验证集
模型不是靠感觉选的,而是靠一场严格的“模拟考试”。
为什么验证集必须是最近 30 天?
- 最近的数据最像未来:上个月的销售模式,比去年同期的模式更接近下周的真实情况。
- 防止“过拟合”:如果一个模型只在前几个月准,最近不准,说明它没能跟上最新的变化。这就像学生死记硬背了模拟题,考试题目一变就不会了。
- 公平比较:所有模型用同一套“考卷”,谁分数高谁胜出。
5. 双标准择优:准确度高 + 无系统性偏差
到这里,问题还没有结束。即使有了独立的验证集,也不能简单地“谁误差最小就选谁”。
如果只把一堆数据填进去,让软件根据预测误差最小来自动选模型,很容易造成过拟合——模型在验证集上表现不错,一到真实世界就原形毕露。一个模型的优劣,最终取决于实际案例的测试,而不是拟合度。
所以,天枢系统的模型竞赛,不是简单的“谁 MAPE 小就选谁”,而是必须同时通过两道关卡。
| 标准 | 指标 | 含义 |
|---|---|---|
| 准确度高 | MAPE(平均绝对百分比误差) | 预测值和实际值平均差百分之多少?越小越好。 |
| 无系统性偏差 | ME(平均误差) | 是总是偏高,还是总是偏低?好的模型应该不偏不倚。 |
为什么“无系统性偏差”和“准确度高”同等重要?
设想一个模型,预测值总是比实际值高 5%。它的 MAPE 可能是 5%——看起来很准。但长期下来,库存会多备 5%,资金占用就多了 5%。这个模型虽然“准”,却是有害的。
相反,一个模型有时高估 10%,有时低估 10%,MAPE 也是 10%,但它的平均误差接近零。长期来看,库存不多不少,反而更健康。
两个标准冲突时怎么办?天枢系统采用先后的优先级:第一轮先筛 ME——平均误差偏离零超过容忍阈值的模型直接淘汰,不管 MAPE 多漂亮;第二轮在通过 ME 检验的模型中,选 MAPE 最小的。默认容忍阈值设为该产品平均销量的 ±5%,具体可在系统配置中调整。
所以,一个模型即使 MAPE 再低,如果存在系统性偏差,也不能用。这两条标准,是天枢系统“模型竞赛”的铁律。
6. 预测区间:比“置信度”更诚实的表达
单点预测值给人虚假的确定感。天枢系统不显示抽象的“置信度”,而是给出 80% 预测区间。
怎么理解预测区间?
物料 M1024 预测明天销量:85.3 件 80% 预测区间:74 ~ 96 件
意思是:根据历史表现,未来实际销量有 80% 的概率落在 74 到 96 件之间。区间越窄,说明历史销量越稳,预测越靠谱;区间越宽,说明波动越大,越需要人工介入。
预测区间不是系统“有多自信”,而是历史数据告诉我们的客观波动幅度。它和安全库存的计算直接相关——安全库存本质上就是为预测区间里的“坏运气”准备的缓冲垫。
7. 当所有模型都不准时:降级原则
如果 9 种模型对一个产品的预测全都差强人意——MAPE 全超 25%,或者预测区间下限为负——系统不会假装很准,而是会主动“认输”并请求人工介入。
| 动作 | 做法 |
|---|---|
| 临时降级 | 暂时用“保底-月均法”给出一个粗糙但稳定的均值 |
| 明确标记 | 标注“波动过大——建议人工判断”,高亮提醒计划员 |
| 保留决策权 | 计划员可手动修改预测值,或将该产品改为按单采购 |
关于降级时使用“保底-月均法”的说明:此刻的月均法不再以“竞赛选手”的身份参与评估,而是作为固定的兜底规则被调用。降级时,系统不再依据验证集表现来评判它,只把它当成一个稳定基准,为计划员提供参考;真正负责决策的是人,待人工调整后再替换。这样,“降级”不是“从九个模型里选了一个差的”,而是“明确承认九个模型都不行,先给一个粗糙的底线,然后交给人”。
核心原则是:宁可用一个粗糙但稳定的平均数,也不要一个看起来很精确但实际已经跑偏的算法结果。
8. 模型选择的三个实用原则
总结天枢系统在模型选择上遵循的三个原则:
- 方法简单,容易理解。复杂的模型往往不如简单的,你不懂的模型往往不如你懂的好。可解释性是推广的前提。
- 关系简单,容易理解。模型内部各个参数之间的关系要清晰,能说清楚每个参数在做什么。
- 决策简单,容易理解。从模型输出到补货建议的逻辑要透明,让计划员知道“为什么建议订这么多”。
对于大多数企业来说,用好基本模型,配以组织流程措施,远比追求复杂精致的模型重要。预测的最终目的不是模型本身,而是让库存更低、服务水平更高。
9. 天枢系统模型竞赛架构
10. 总结
这一篇讲了天枢系统的预测模型设计哲学:
- 9 种模型,作为候选池,覆盖平稳、趋势、季节、间歇性四类需求模式。
- 物料分层,基于数据天数、零值占比和变异系数,决定每个产品开放候选池里的哪些模型参赛。
- 训练集和验证集,用模拟考试选出最近 30 天里最准的模型。
- 双标准择优,先筛 ME 无系统性偏差,再比 MAPE 准确度。
- 预测区间,比置信度更诚实,为安全库存提供计算依据。
- 降级机制,当所有模型都不准时,主动示弱,请求人工介入。
在下一篇博客中,我们将进入预测的下游——库存计划的设计逻辑。安全库存公式怎么推导?订货点为什么不是拍脑袋?长尾产品的库存策略又该怎么定?敬请期待。
天枢系统,是一个基于 SQL Server 的销售预测与库存计划引擎。它从金蝶 ERP 取数,经过数据清洗、物料分层、九模型竞赛择优,输出未来 7 天的销量预测和库存建议。项目尚未上线,正在持续迭代中。