资讯动态

从预测到优化:供应链需求预测与库存决策的科学方法

发布时间:2026/10/24 6:01:25 来源:尧图企业网站定制
有没有遇到过这种场景销售说“下个月缺货赶紧加单”采购按经验多备了30%结果下个月需求没来库存却堆成了小山。或者是反过来预测模型说“销量平稳”结果突然爆单仓库直接断货。做供应链的人基本都在这两种状态之间反复横跳。我这些年折腾下来最大的感受是单纯堆机器学习模型并不能解决供应链问题真正管用的是把“预测”和“优化”串成一条线先用科学方法把不确定的需求描述出来再基于这个不确定性和成本结构算清楚“到底该备多少货”。这也就是“供应链预测科学”的核心内容——机器学习负责把需求分布预测准优化技术负责把决策做得稳。这篇东西我会从业务定义、数据、建模、优化到落地踩坑完整讲一遍思路和实操方法适合正在搭建需求预测体系、做库存优化、或者刚接手供应链数据项目的同行参考。1. 整体设计与思路拆解1.1 先别急着上模型把“预测”和“优化”分开看很多团队一上来就想用深度学习预测销量然后直接把预测值当成补货量这中间其实漏了一个关键环节预测是对未来的推断优化是基于推断做决策两者目标函数完全不一样。预测关心“误差小”优化关心“成本低”误差小不等于成本低尤其是在缺货损失和库存持有成本不对称的时候。举个最简单的例子某款饮料日均销售100瓶缺一瓶损失5元多存一瓶一天成本0.5元。如果预测误差是±20瓶一个完全“平均准确”的预测方案如果把均值100当作补货目标缺货概率仍然很高。但如果你把预测结果看成一条分布然后用成本函数去优化分位数结果往往不是均值而是偏向某个方向。这个就是报童模型的核心思想也是把预测和优化分开看的第一层意义。所以我在做这类项目时第一步永远是跟业务确认两件事第一你的决策是什么——补多少货、分配多少产能、发到哪个仓第二决策错了的代价是什么——缺货一分钟损失多少库存压一个月损失多少。这两件事没搞清楚后面任何模型都是空中楼阁。1.2 定义问题预测对象、层级和时间跨度供应链预测最容易被忽略的就是“预测什么”。同一套销售数据可以按SKU、按品类、按仓库、按渠道、按门店分别预测粒度不同难度天差地别。单品单仓日粒度预测噪声极大模型很难学出稳定信号而品类级全国月度预测信号相对平滑统计方法都够用。我自己一般的判断标准是越往执行层走颗粒度越细越要用模型做概率预测和优化决策越往计划层走颗粒度越粗重心越放在趋势判断和情景分析。层次也要跟业务衔接上——采购补货看SKU-仓库日粒度产能规划看品类-工厂周粒度年度预算看品牌-大区月粒度。时间跨度同样关键。快消品补货周期可能就一到两周备件备料可能需要提前三个月锁产能。跨度越长不确定性越大越不适合只输出一个单点预测值而应该输出完整的需求分布比如P10、P50、P90这些不同置信水平下的预测值供后续优化模块使用。1.3 为什么是“机器学习优化”而不是单靠一套模型如果只需要预测未来销量ARIMA、指数平滑也能干如果只是做库存控制也可以直接用安全库存公式手工算。但当业务同时面对几千个SKU、上百个仓库、动态变化的促销计划和供应约束时单靠传统统计量或者单个ML模型是不够的。机器学习的价值在于学习复杂非线性关系天气影响、促销弹性、新品生命周期、渠道异动这些因子放进梯度提升模型里预测精度提升通常很明显。优化技术的价值在于把预测变成决策需求分布进来了结合库存持有成本、缺货成本、服务水平目标、供应商lead time和最小起订量用优化算法算出每个SKU的最优补货量或安全库存水位。两者是接力关系预测模型输出概率分布优化模型吃分布、输出动作。以前很多项目失败就是只做了前半段预测结果一出来后面还是人工拍脑袋转化为补货量前面做得再精细后面一下子稀释掉了。2. 数据基础与特征工程2.1 能拿到的数据和你真正需要的数据做供应链预测理想数据源包括历史销售流水、库存流水、采购到货记录、退货记录、促销日历、价格变动记录、门店/仓库基础信息、商品主数据以及外部数据如天气、节假日、市场活动等。但实际情况是这些数据分散在不同系统里口径还不一致。我见过最常见的脏数据问题有三个一是销售和出库混着记电商订单按支付时间、线下按出库时间两套口径对不上二是缺货期间销量是0但真实需求不是0直接拿0去训练模型会把缺货期看淡学出一个低于真实需求的预测三是促销数据没标记或者标记了但没记录促销力度导致模型把促销拉升当成自然增长促销一停就开始高估。这些问题的通用解法先建立统一的事实表明确销售、出库、需求的定义。对缺货期间的销量有条件就手工补估没条件就做个标记让模型学到“这个时间段是censored data”而不是强行填一个0或平均值。2.2 时间序列特征与外部因子的构造特征工程上我的经验是分三层来构造。第一层是基础时间特征比如历史均值、移动平均、指数加权平均、上周同期、去年同周、环比、同比。第二层是日历特征比如星期几、是否月初、是否节假日、节假日前N天后N天、促销日前N天。第三层是外部特征比如温度、降雨量、当地是否有大型活动这些在大快消、啤酒饮料、冰淇淋行业非常有用。数据对应对某个SKU在仓库A的日销量我会构造滞后7、14、28天的销量均值滞后同期的促销标记以及该SKU近7天平均库存天数。这些特征分别代表短期趋势、周季节性和库存压迫效应。有一个常被忽视的特征是“在途库存和可用库存”因为它不是需求侧信息而是供给侧信息但它对销量有间接影响库存不足导致展示缺货销量自然下跌。如果不控制这个变量模型学到的“库存少→销量低”可能被误解为“需求弱”从而产生自我实现的错误预测。2.3 数据清洗与标签泄漏的坑标签泄漏在供应链预测里是个隐蔽大坑。最常见的泄漏是把未来的信息混进特征比如用当月的实际促销完成量预测当月销量、用未来的天气预测当前销量这在天气预报场景不算泄漏因为天气可预报但如果用了未来才能知道的事件就要小心、用当天的实际销量去预测当天的补货需求——这显然不合理。我整理了一个自查清单特征产生时间是否早于预测时间点如果要用t日数据预测t1日那么t日之前的信息可用t日当天的信息要看是上午还是下午。历史数据中是否包含了“事后才知道”的信息比如某SKU被下架这个标签是事后标记的训练时如果当作特征会出现前视偏差。目标值是否经过平滑或回填比如缺货补估的需求值如果用未来实际销售来补训练时看起来很准上线后模型根本拿不到这个信息。另一个容易犯的问题是全局归一化用全量数据的均值和标准差做标准化这会把未来的分布信息偷渡到训练集。正确做法是只用训练集的统计量或者干脆用相对值特征比如同比变化率。2.4 数据集切分与验证的独特之处供应链预测不能随机切分数据因为时间序列有强自相关性。如果随机打乱模型能从未来学到当前模式验证指标虚高但上线就崩。我用的是滚动时间窗口验证比如训练集取过去104周验证集取接下来4周然后窗口逐步往前滚模拟真实的“每周重训一次”的节奏。更严格一点的做法是“预测起点对比”也叫多个起点的回溯测试。假设每周一跑一次预测模型我会选取最近8到12个预测起点对每个起点预测未来4到8周然后统一计算不同提前期下的误差指标。这样一个模型评估下来误差的波动范围比单一切分更有参考价值也能看到预测提前期越长误差放大的速度。3. 预测模型选型与训练3.1 永远先跑一个简单基线不管后面用什么模型我一定先跑几个基线简单的移动平均、指数平滑、带季节性的Holt-Winters、上期同期值。基线的价值不是用来直接上线而是给后面的复杂模型定一个“性价比底线”。如果复杂模型在验证集上只比基线好5%那说明要么特征没做好要么业务本身的预测难度已经到头了这时与其继续折磨ML模型不如把精力放在优化决策端。如果复杂模型比基线好20%以上那说明数据里确实有可学习的信号值得继续投入。基线的预测结果我还会保留下来作为后续优化模型的“对照系”。跟业务汇报的时候我会说“新模型比移动平均法降低了多少库存成本”这样的口径更容易被理解也能避开抽象的技术指标争论。3.2 梯度提升树供应链预测的性价比之王在绝大多数SKU和仓库粒度的需求预测问题上我首选梯度提升树比如XGBoost或LightGBM。原因很简单一是对表格特征非常友好不用太精细的特征缩放二是能自动捕捉非线性关系和交互效应比如“节假日×促销×爆品”这种组合信号三是训练速度快几千个SKU的模型可以批量完成工程上容易落地。一些实用经验用LightGBM时对时序类特征我习惯先做一次分位提取比如近14天销量的最小值、中位数、最大值而不只是平均值这样模型能区别“平稳中位”和“忽高忽低”两种形态。特征里最好包含“距上次促销天数”“促销强度等级”这类变量比单纯一个促销哑变量信息量大得多。训练的时候别忘了按SKU分组避免同一个SKU的样本同时出现在训练和验证里。跨SKU的信息迁移可以带来泛化但如果SKU本身具有完全不同的销售模式强行共享参数也可能适得其反。折中方案是用全局模型加SKU嵌入特征把SKU标识作为categorical feature喂进去。3.3 深度学习与概率预测什么时候值得上深度学习在供应链预测中并不是银弹。纯时间序列的LSTM/Transformer在单SKU数据量不足时往往还不如梯度提升树。但在两类场景下值得考虑一是跨序列建模几千个SKU的数据合并在一起用序列模型学习共享模式二是多步预测要一次输出未来多天或未来多周的需求分布序列到序列结构更自然。不过真要上线深度学习建议先想清楚三点训练和推理的工程成本能不能接受可解释性能不能过业务这一关预测结果的不确定性能不能表达成可用的分布如果三点都满足再上不迟。否则LightGBM加一个分位回归也能输出P10、P50、P90。做概率预测时除了分位回归还可以用残差法先训练点预测模型再对残差拟合一个分布常用正态分布或学生t分布最后把点预测和残差分布叠加起来得到未来需求的分位数。这个方法简单、稳定、可解释很适合生产环境。3.4 评价指标业务视角比统计指标更重要预测模型常用的指标有MAE、MSE、MAPE、WAPE和分位数损失。但我一般不看单一指标而是按决策用途分开评估如果预测结果要用于补货决策我更关心“分位数校准质量”也就是P90预测区间是否真的覆盖了90%的实际需求偏了就是低估或高估库存风险。如果预测结果要用于产能规划我更关心WAPE加权绝对百分误差因为它避免被小SKU的高百分比误差带偏。如果预测结果要用于财务预算我才关注MAPE因为财务关心的是总量相对偏差。另外MSE对大偏差极度敏感一个SKU偶尔爆单可能把整体MSE拉得很高如果据此调模型容易被极端值带偏。更稳健的做法是用分位数损失或Huber损失它对离群点容忍度更高。4. 从预测到决策优化技术在库存中的应用4.1 报童模型理解“备多了”和“备少了”的不对称代价库存补货本质上是个报童问题。每天决定进多少货进货多了滞销、承担库存成本进货少了缺货、丢销售额和客户信任。传统做法是预测一个均值然后按安全库存往上加但这没有系统性地把成本参数引入决策。假设某SKU日需求的预测分布近似正态分布均值μ标准差σ单位采购成本c单位售价p缺一单的损失是利润加商誉损失记为u滞销一件的持有成本记为h。最优补货量Q应该满足累计概率P(需求≤Q) (u - c) / (u h)。这个分数也叫服务水平临界比。举个例子某商品成本10元、售价30元、缺货损失按40元估算、持有成本每天1元临界比是(40-10)/(401)≈0.73。也就是说应该备到预测分布的73分位左右而不是均值。73分位和均值之差就是科学计算出的“安全库存”。如果只看预测均值大概率会把服务水平定在50分位附近长期缺货率偏高。4.2 服务水平与安全库存把分位数变成补货水位实际系统中安全库存不是拍出来的而是从服务水平目标反推的。服务水平可以定义为“补货周期内需求不超过库存水位的概率”比如95%服务水平意味着100次补货周期里不允许缺货超过5次。如果需求分布已知95%服务水平对应的库存水位就是需求分布的95分位数。这个分位数减去预测均值就是安全库存。不同SKU的成本结构不同最优服务水平也不同。利润高的SKU值得承担更多库存利润薄、体积大的SKU则应该把服务水平降下来。一套可行的计算流程预测未来的需求分布 → 根据成本参数算每个SKU的最优服务水平 → 查分位数得到库存水位 → 结合当前库存和在途库存计算净补货量 → 再做最小起订量、整托盘约束的调整。这个流程把机器学习输出和运营参数整合成了一个可复用的决策框架。4.3 线性规划与混合整数规划处理多层级、多约束当库存优化扩展到多SKU、多仓库、多周期时报童模型就不够用了。这时候要用运筹优化常见形式是混合整数线性规划MILP。比如目标是“在满足服务水平约束的前提下最小化总成本”变量可以是每个SKU每个仓库每期的补货量约束包括仓库库容、供应商产能、运输车辆容量、最小订货量、保质期限制等。这类模型虽然数学上不难但规模一大就很考验工程能力。几千个SKU乘几十个仓库乘几十个周期变量数量动辄上百万直接让求解器硬算求解时间可能从分钟级变成小时级。我的经验是分阶段处理先用线性规划松弛去筛选候选SKU再对高成本SKU做精确求解或者按品类拆分子问题并行求解再合并。另外一个工程细节MILP求解器给出的“最优解”如果不加验证可能对数据错误非常敏感——某个SKU的库存数据出错求解器会莫名其妙给出一个天量补货建议。所以上线前必须加规则引擎做边界检查比如“单SKU单周补货量不超过历史峰值的3倍”“总补货金额不超过预算上限”这些规则能挡住大多数逻辑荒诞的解。4.4 模拟验证把决策放进历史场景里检验优化模型上线前一定要做“仿真回测”。把过去52周的真实数据重现出来用你设计的预测和优化逻辑每周算一次补货模拟运行一整年然后看最终的库存周转天数、服务水平、缺货次数、呆滞库存金额。我习惯的仿真框架是三段式需求生成器用历史真实需求数据或模型生成的需求样本→ 决策模块预测优化算法→ 环境模型库存更新、到货延迟、缺货记录。每次跑一个随机种子多跑几十次观察决策结果的分布而不是只看一次平均结果。模拟的价值在于能发现“交互式bug”比如某个SKU每周补货都卡在最小起订量上导致库存要么缺货要么超量又比如促销周预测上调了30%但供应商产能根本满足不了优化模型先给所有SKU同时补了高量结果产线挤压、普通SKU反而断货。这些问题不跑仿真根本发现不了。5. 实践中的问题与排查实录5.1 为什么模型预测很准但库存还是出问题最邪门的现象是预测误差指标很漂亮但业务就是不买账。后来我复盘发现预测指标和业务结果之间隔着一层决策漏斗预测准但补货不准常见原因有四个。第一预测误差分布不均匀整体WAPE很低但爆款SKU和尾部SKU的误差天差地别优化模型对所有SKU一刀切结果爆款断货、尾部滞销。对策是按SKU价值分层设定不同模型和不同服务水平。第二提前期内的需求变化没有重新预测。模型预测的是未来8周需求但补货系统用的是每周滚动预测中间需求变了补货计划没同步调整。对策是做滚动重优化每周更新预测并重新计算补货。第三优化模型用的是点预测而不是分布预测导致服务水平算偏。对策是给优化模块输入分位数。第四参数没校正。持有成本、缺货成本很多时候是拍脑袋估的参数偏了最优决策自然偏。对策是做敏感性分析看参数变化对结果的影响范围。5.2 促销和新品预测少数派却决定大局促销预测一直是供应链预测的难点。模型普遍的问题是把促销弹性当成一个固定倍数但同一个促销档位对爆款、长尾、新品的拉动完全不同。我现在的做法是把促销弹性拆成三层品类弹性、SKU基数和促销增量衰减系数。先算品类层面促销能带来多少整体增量再按SKU历史促销表现分配增量最后加入衰减项防止模型把促销力度无限线性外推。新品的预测是另一个痛点没有历史数据模型无从下手。我的实践是采用“相似品迁移”找出与该新品同品类、同价格带、同目标人群的成熟SKU用这些SKU的销售曲线做基准再按新品推广节奏调整前几周的爬坡系数。这个方法不能说很准但至少比拍脑袋有依据而且随着新品上市时间推移模型可以逐步过渡到真实数据驱动。5.3 数据突变让人措手不及如何设计鲁棒机制供应链数据经常有“惊喜”突发性舆情带来的抢购、极端天气导致的囤货、工厂临时检修带来的供应中断。这些事件是低频高影响的正常训练集里样本极少模型往往学不到。针对这类问题我的经验是“检测干预人工覆盖”三步走。检测环节用一个轻量级的异常检测模型监控预测结果和实际销量的偏差偏差超过阈值时触发告警。干预环节触发告警后自动启动应急预案比如将该SKU的服务水平临时上调或下调。人工覆盖环节给计划员留一个“调整因子”接口业务人员可以根据自己掌握的实时信息把模型输出的某个SKU预测乘上0.8或1.5。这样即使模型失灵人还不至于完全被动。这里有个反直觉的经验不要试图让机器学习完美识别所有异常事件那是奢侈品。更务实的做法是承认模型在极端情况下不可靠但要确保失效时系统有降级方案。这比提高2个点的预测精度更能保护业务。5.4 业务信任怎么建立可解释性与对比报告预测模型再好如果业务看不懂就不可能真正落地。我见过太多项目死在“算法黑箱”上。解决方法是给模型输出配上可解释性分析和可视化某个SKU预测上涨了120%模型认为是促销开始温度升高去年同期基数低三个因素共同作用配置一页简单归因表。具体做法是使用SHAP值对每个SKU的预测做归因分解然后按贡献度排序输出Top 3因子。业务看到这个通常就不会吵着“为什么不准”而是讨论“这个因子我认不认”。遇到不认的情况计划员可以手动修正因子权重这种“人机协同”模式比全自动黑箱更现实也更容易通过验收。每周要给业务发一份预测复盘报告核心内容不是一堆指标而是一张对比图上期预测vs实际销量vs基线预测差距最大的Top 10 SKU要单独列出归因和后续改进。报告持续发三个月业务对模型的信任度会有实质提升因为大家能看到问题出在哪、怎么改进。6. 工程化落地与持续迭代6.1 预测任务编排从手动跑模型到自动化流水线供应链预测的数据链路很长从拉数、清洗、特征计算、模型推理到结果写库每个环节都可能手工出错。我的建议是最少要把整个流程串成定时任务每天凌晨自动跑当天预测再校验结果是否在合理区间。别一开始就追求实时预测对大多数补货决策来说一天一次的预测节奏完全够用。流水线模块的划分要清晰数据同步、特征工程、模型训练周期性重训、模型推理日常预测、结果后处理四舍五入、最小起订量调整、数据落库与告警。模块之间用独立的数据接口连接任何一环挂了都能单独重跑不影响其他环节。版本管理容易被忽略但很重要。模型不是训一次就完了随着新数据进来需要定期重训。每次训练的参数、特征版本、训练数据范围、验证指标都要记录在案否则三个月后回看某个预测版本为什么表现差完全没有线索可查。6.2 与现有计划体系整合的三种做法第一种是“参考模式”预测结果输出到报表里计划员自己看、自己决定改动最小适合刚起步的团队。第二种是“建议模式”补货系统自动生成建议单计划员可以一键采纳或修改系统记录所有改动。第三种是“自动模式”预测优化结果直接传给下游订单系统自动生成采购申请只在异常时人工介入。不同成熟度的团队适合不同模式。我个人的推进路线是先走建议模式跑两到三个月积累一批业务人员调整的记录分析他们的调整规律再把这些规律反馈到模型和参数里。迭代几次之后再逐步提高自动化比例。一上来就全自动业务人员不放心系统也缺乏反馈机制翻车概率很高。6.3 持续迭代三个关键节奏供应链预测是一个需要持续运营的能力不是一次性交付物。我的建议是三个迭代节奏周节奏每周一重新训练短期预测模型、评估上周误差并更新监控指标月节奏每月做一次全面回测、检验库存服务水平目标的达成情况和呆滞库存变化季节奏每季度复盘一次整体策略包括模型选型、特征体系、优化目标权重看看业务方向是否变化、是否需要调整。有一次在做季度复盘时发现某品类引入了两个新渠道原有模型的渠道系数全部失效预测误差猛然上升。幸好是季度复盘发现了结构变化及时把渠道维度加进了特征体系否则到年底供应链计划可能全面失控。这种“结构性漂移”靠日常监控很难感知定期复盘必不可少。6.4 算力与成本控制本质是“够用就好”说到供应链预测很多人会下意识追求最大的模型、最多的特征、最长的训练时间其实完全没有必要。快消品日粒度预测LightGBM训练一个SKU组通常就几十秒几千个SKU分批训练整个模型集群一个多小时也能跑完。如果跑一次要花半天说明问题规模很大或者特征设计出了问题建议先做特征筛选而不是直接上更大的模型。推理成本同样可以优化。很多SKU的预测周期是周粒度完全可以在每周初一次性算完不需要每天重复推理。部分业务需要每日预测的也只更新变化最剧烈的SKU而不是全量重算。这些都做完之后一个区域几千SKU的预测体系一台普通的服务器就能扛住完全没必要为了“大数据”“大模型”去烧钱扩集群。-End / 经验小结做了几个预测优化项目之后我最大的体会是一个能落地的供应链预测系统30%是模型50%是数据和工程20%是跟业务的磨合。模型再强数据质量不行就白搭代码写得多漂亮业务人员不愿用也白搭。真正的增量来自把“预测”和“优化”接成一个闭环模型输出分布而不是孤零零一个数优化层把成本和约束都吃进去输出一个带解释的、可执行的决策这样供应链的计划水平才扎扎实实往上走。最后分享一个很实用的小技巧。每跑一轮模型把误差最大的Top 20 SKU单独拉出来看不要只盯着整体指标。这些SKU往往都是促销品、新品、季节性爆品它们虽然数量少但贡献了绝大多数库存风险。把你的调参精力先花在这20个SKU上比对全量数据做随机调参要有效得多。模型能别从头训练就别从头训练保留历史特征和参数做增量更新省时省力也更稳定。这个习惯我建议所有做供应链预测的同行都试着建立起来。

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

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

免费获取报价 →
↑