FEATURED · 精选文章

需求预测与库存优化建模实战:从时序模型到库存策略的成本最优解

发布时间 / 2026/8/22 5:35:41
来源 / 创域科博编辑部
栏目 / 资讯中心
需求预测与库存优化建模实战:从时序模型到库存策略的成本最优解 1. 从竞赛题目到实战项目一次完整的需求预测与库存优化建模复盘去年带队参加MathorCup大数据竞赛B题的经历现在回想起来依然觉得是一次非常扎实的“实战演练”。题目聚焦在电商零售商家的需求预测与库存优化上这几乎是所有电商、零售、供应链从业者每天都要面对的核心问题。比赛虽然结束了但其中涉及的建模思路、数据处理技巧和方案评估逻辑完全可以复用到真实的业务场景中。今天我就以这道赛题为蓝本结合我们团队的解题过程和一些赛后思考拆解一下如何系统性地解决这类问题。无论你是正在备赛的学生还是对数据驱动决策感兴趣的从业者希望这篇复盘能给你带来一些直接的启发。我们不会空谈理论而是会深入到数据怎么洗、模型怎么选、目标函数怎么设、结果怎么评这些“硬核”环节把一次竞赛解题变成一次可复用的项目实战指南。2. 赛题核心与业务逻辑拆解我们到底要优化什么拿到赛题第一步永远是理解问题本质而不是急着跑代码。2023年MathorCup B题给出的背景是典型的电商零售场景商家销售多种商品拥有历史销售数据、库存信息目标是预测未来需求并制定库存补货策略以最小化总成本包括订货成本、库存持有成本和缺货损失。2.1 问题定义的三个关键层次这道题看似是“预测优化”两个步骤但实际上隐含着三个必须理清的层次需求预测层这是优化的基础。给定历史销售数据我们需要预测未来一段时间比如未来4周每种商品SKU的每周需求量。这里的关键在于销售数据不等于需求数据。如果发生缺货历史销售记录会低于真实需求这被称为“需求审查”Censored Demand。直接使用销售数据训练预测模型会系统性低估未来需求。因此数据处理的第一步就是识别并修正历史缺货期的影响。库存策略优化层在获得需求预测后我们需要决定“什么时候订”和“订多少”。经典的库存模型如(s, S)策略当库存水平低于s时补货至S或定期盘点策略(R, S)策略每R期盘点补货至S是常见的选择。赛题通常要求你设计或选择一种策略并确定其最优参数如s,S。成本评估与仿真层任何策略的好坏必须在一个模拟的真实环境中检验。我们需要构建一个多期、多SKU的库存系统仿真模型。在这个仿真中根据预测的需求和制定的补货策略进行模拟运营累计计算实际发生的订货成本、库存持有成本和缺货成本。最终以仿真得到的总成本作为评价策略优劣的唯一标准。注意很多新手会犯一个错误——用预测模型的准确度如MAPE来直接评价整个方案的优劣。这是不对的。预测准只是手段最终目标是成本最低。一个预测误差稍大但更稳定避免极端缺货的方案其最终成本可能远低于一个预测很准但偶尔严重失准的方案。2.2 数据层面的挑战与应对思路赛题提供的数据通常包括历史销售数据商品ID、日期、销售量。商品信息商品ID、可能有的类别、成本、售价等。库存初始状态期初库存水平。成本参数单次订货固定成本、单位商品每周持有成本、单位商品缺货损失成本。核心数据处理挑战在于需求修正。一个实用的方法是“反向推算”在已知库存记录的情况下如果某天销售后库存直接清零并且后续几天销售为0直到下一次补货后才有销售那么清零的那几天很可能发生了缺货。我们可以假设缺货期间的需求服从某种分布如泊松分布或采用更简单实用的方法将缺货期间“丢失”的需求按比例分摊到有货的相邻时段或利用同类商品同期销售趋势进行插补。我们的做法是首先根据库存和销售序列标记出潜在的缺货区间然后使用指数平滑模型对完整序列包含估计的缺货需求进行拟合反过来修正历史数据得到一个尽可能接近真实需求的时间序列。3. 需求预测模型的选择与融合策略预测部分是数据科学家的主战场。对于电商SKU级别的预测没有银弹模型融合才是王道。3.1 经典时序模型稳健的基线我们首先为每个SKU建立独立的预测模型。为什么不用一个全局模型因为SKU间的差异可能巨大爆品 vs 长尾品独立建模更能捕捉个体特性。SARIMA (季节性自回归整合移动平均模型)这是处理带有明显趋势和季节性的序列的经典方法。对于周度数据季节性周期通常为52一年。SARIMA的优势在于理论完备能提供预测区间。但它的缺点也很明显对数据平稳性要求高需要大量差分操作对于多个SKU手动确定(p,d,q)(P,D,Q,s)参数不现实对突然的波动如促销捕捉能力差。# 示例使用pmdarima进行自动SARIMA参数搜索针对单个SKU import pmdarima as pm # series_sku 是某个SKU修正后的需求序列 model pm.auto_arima(series_sku, seasonalTrue, m52, # 周度数据年周期 traceTrue, # 打印搜索过程 error_actionignore, suppress_warningsTrue, stepwiseTrue) forecast, conf_int model.predict(n_periods4, return_conf_intTrue) # 预测未来4周指数平滑 (ETS)包括Holt-Winters等方法。它直观易懂通过平滑水平、趋势和季节性分量进行预测。相比SARIMA它对缺失值和异常值更稳健计算也更快。statsmodels库提供了完整的实现。对于波动不大、模式稳定的SKUETS常常能给出不错的结果。3.2 机器学习与集成方法捕捉复杂模式当SKU数量众多且存在促销、价格变化等外部因素时赛题有时会提供机器学习模型更有优势。特征工程这是提升预测性能的关键。除了历史销量滞后项lag1,lag2,lag52等我们还可以构造滚动统计特征过去4周均值、标准差。时间特征周数、月份、季度、是否节假日。事件特征是否有促销、促销力度。商品特征品类、价格段需与其他表关联。模型选择LightGBM / XGBoost树模型是处理表格数据的利器能自动处理特征交互和非线性关系对缺失值不敏感。非常适合这种混合了数值和类别特征的场景。ProphetFacebook开源的预测工具特别适合商业时序数据内置了对节假日、变点趋势改变的处理。它相当于一个可加性模型趋势季节假日配置简单解释性强对于许多SKU可以作为强基线。# 示例使用LightGBM进行SKU需求预测的特征构造与训练框架 import pandas as pd import lightgbm as lgb from sklearn.model_selection import TimeSeriesSplit # 假设df是包含所有SKU历史数据及特征的DataFrame features [lag1, lag2, lag3, lag52, rolling_mean_4, rolling_std_4, week_of_year, is_holiday, promo_flag] target demand models {} for sku in df[sku_id].unique(): sku_data df[df[sku_id] sku].copy() # 按时间排序 sku_data sku_data.sort_values(date) # 划分训练/验证集时间序列不能随机分 tscv TimeSeriesSplit(n_splits3) # ... 这里进行交叉验证训练找到最佳参数 ... lgb_model lgb.LGBMRegressor(objectiveregression, n_estimators100) lgb_model.fit(sku_data[features], sku_data[target]) models[sku] lgb_model3.3 模型融合与不确定性量化单一模型总有局限。我们的策略是加权融合。例如对每个SKU用SARIMA、ETS、LightGBM各预测一次然后根据它们在最近一个验证窗口上的表现如计算RMSE的倒数作为权重进行加权平均。融合后的预测通常更稳定。更重要的是不确定性量化。库存优化不仅需要点预测ŷ更需要预测分布至少是预测区间如90%分位数。树模型可以通过分位数回归LightGBM的objectivequantile直接预测高分位数。传统时序模型如SARIMA可以给出理论预测区间。我们将这些信息作为“安全库存”计算的关键输入。4. 库存优化模型的构建与求解预测给出了未来需求的“蓝图”库存优化则是基于这份蓝图制定“施工计划”。4.1 策略选择(s, S)还是(R, S)赛题通常不指定具体策略这需要我们自己权衡。(s, S)策略连续盘点实时监控库存一旦库存水平降至再订货点s立即发出订单将库存补至最高水平S。这种策略响应快能有效降低缺货风险但管理成本高需要持续监控且可能因频繁小额订单产生较高的固定订货成本。(R, S)策略定期盘点每间隔固定的R期如一周盘点一次库存无论当时库存多少都发出订单将库存水平补至S。这种策略管理简单易于计划可以将多个SKU的订单合并以节省固定成本。但缺点是在盘点周期末可能面临较高的缺货风险。对于电商零售场景SKU数量庞大(R, S)策略在实操中更常见。我们团队也主要围绕此策略展开。问题就转化为对于每个SKU最优的R盘点周期和S目标库存水平是多少4.2 建立优化模型成本最小化我们以最小化长期平均每周总成本为目标。对于单个SKU在(R, S)策略下其成本构成如下订货成本每次下单产生一笔固定成本K。平均每周订货成本为K / R。库存持有成本单位商品每周持有成本为h。我们需要计算一个盘点周期内的平均库存水平。这依赖于需求分布。假设每周需求预测均值为μ标准差为σ提前期L假设为0即瞬时补货。一个周期R内的总需求期望是μR。安全库存用于应对需求波动设为z * σ * sqrt(R)其中z是服务水平系数如95%服务水平对应z≈1.65。那么周期初的库存水平为S周期末的期望库存水平约为S - μR。平均库存水平近似为(S (S - μR)) / 2 S - μR/2。但更精确的需要考虑持有的是循环库存和安全库存。一个常用的近似公式是平均库存 ≈ (μR)/2 安全库存。因此持有成本 ≈h * [ (μR)/2 z * σ * sqrt(R) ]。缺货成本单位缺货损失为p。缺货发生在周期末当需求超过库存时。缺货的期望值需要根据需求分布函数计算。对于正态分布假设期望缺货量ES σ * sqrt(R) * L(z)其中L(z)是标准正态损失函数。因此缺货成本 ≈p * ES / R因为ES是一个周期内的期望缺货除以R得到每周平均。因此单SKU的近似每周总成本函数为C(R, S) ≈ K/R h*[ (μR)/2 z*σ*sqrt(R) ] (p/R)*[σ*sqrt(R)*L(z)]我们的优化问题就是为每个SKU找到使C(R, S)最小的R和SS由μ, R, z决定。由于R通常是离散的如1周、2周我们可以枚举所有合理的R如1到8周对于每个R计算最优的S或对应的z然后选择总成本最小的R。4.3 求解方法从解析近似到仿真优化上述解析公式基于许多假设如需求正态分布、提前期为0它速度快可以作为很好的初始解。但真正的“试金石”是仿真。我们必须构建一个离散事件仿真模型初始化设定仿真时长如52周所有SKU的初始库存成本累计为0。时间推进以“周”为单位推进。每周事件 a.需求实现根据预测模型给出的分布如正态分布N(μ_t, σ_t)随机生成该周每个SKU的实际需求。 b.满足需求从库存中扣除实际需求计算缺货量如果需求库存。更新库存水平累加缺货成本。 c.盘点与订货如果本周是该SKU的盘点周检查库存水平发出订单订货量为S - 当前库存。累加固定订货成本K。假设提前期后如下周初到货。 d.计算持有成本根据本周的平均库存水平如期初期末/2累加持有成本。循环重复步骤3直到仿真结束。输出计算仿真期内的总成本并折算为每周平均成本。通过仿真我们可以评估不同(R, S)参数组合下的真实成本表现。由于需求是随机的通常需要运行多次仿真如1000次取平均成本作为该策略的绩效评价。然后我们可以用启发式算法如模拟退火、遗传算法在(R, S)空间中进行搜索寻找使仿真平均成本最低的参数组合。这个过程计算量较大但结果最可靠。5. 方案集成、评估与报告撰写要点将预测和优化模块串联起来形成一个完整的解决方案流水线并对其进行严谨评估是最后也是最关键的一步。5.1 构建端到端解决方案流水线一个健壮的流水线应该包含以下模块并实现自动化数据预处理模块读取原始数据进行需求修正、缺失值处理、异常值处理。特征工程模块生成用于预测的时序特征和外部特征。模型训练与预测模块训练多个基础预测模型并进行融合输出未来N周每个SKU的需求预测均值和标准差。库存策略优化模块基于预测结果和成本参数为每个SKU计算优化的(R, S)参数。可以先使用解析公式快速计算一组基线参数。仿真评估模块使用优化得到的策略参数运行多次蒙特卡洛仿真计算平均每周总成本、服务水平和平均库存周转率等核心KPI。策略迭代模块根据仿真结果可以反向调整预测模型例如如果发现缺货成本极高可以调整模型以输出更高的分位数预测或微调优化参数形成闭环。5.2 评估指标不止看成本在仿真报告中除了总成本这个终极指标还必须分析以下方面以全面评价策略整体服务水平1 - (总缺货量 / 总需求量)。这是衡量客户满意度的关键。库存周转率总销售成本 / 平均库存价值。高周转率通常意味着资金效率高。成本结构分析订货成本、持有成本、缺货成本各自占比。这能帮助识别策略的短板例如是否因过于害怕缺货而导致持有成本畸高。策略敏感性分析改变关键输入如需求预测误差增大20%、缺货成本参数变化后总成本和服务水平的变化情况。这能体现策略的鲁棒性。SKU分类管理ABC分析将SKU按销售额或利润贡献分为A高价值、B中价值、C低价值类。对不同类别采用不同的服务水平目标和库存策略如对A类采用更短的R、更高的z值。在报告中展示分类管理带来的成本节省是重要的加分项。5.3 数学建模论文/报告撰写心得根据我们的参赛和评审经验一份优秀的解决方案报告其核心在于清晰的逻辑叙事和扎实的实证支撑。摘要用精炼的语言概括问题、你的核心方法特别是创新点、以及最重要的结果如成本降低了多少。避免堆砌方法名词。问题重述与分析不要照抄题目要用自己的话剖析问题的层次、难点和关键假设。画出系统流程图库存-订单-需求-成本非常有帮助。模型建立这是主干。分节阐述预测模型和库存模型。对于预测模型说明为什么选择这些模型/融合方式如何解决数据问题如需求修正。对于库存模型一定要推导成本函数。即使最后用了仿真解析模型的推导过程体现了你对问题本质的理解。然后说明从解析解到仿真优化的过渡逻辑。求解过程与算法设计详细说明你的仿真算法流程可以用伪代码以及如何优化策略参数如枚举、启发式算法。给出关键代码片段如仿真核心循环是很好的做法。结果分析这是展示你工作价值的部分。不要只扔出一个最终成本数字。展示预测效果挑选几个有代表性的SKU如畅销品、滞销品、有促销的画出历史需求与预测的对比图并给出误差指标。展示优化结果用表格列出部分SKU的优化前后策略参数对比及成本变化。用图表展示整体成本下降、服务水平提升。深入分析进行敏感性分析和ABC分析并解释其业务含义。模型评价与推广客观评价自己模型的优点如综合考虑了预测不确定性、通过仿真验证和局限性如假设需求分布、未考虑供应商产能约束等并提出可行的改进方向。最后一个实用的建议在比赛或项目中尽早搭建起这个“预测-优化-仿真”的最小可行闭环。哪怕最初预测只用简单移动平均优化只用(s, S)的近似公式仿真也只有几十次迭代。先让这个闭环跑起来得到基线结果。然后再逐个模块进行改进和迭代如升级预测模型、加入精确仿真、采用优化算法。这样做能确保你始终有一个完整的、可评估的解决方案避免在某个细节上钻牛角尖而忽略了整体。我们当时就是先用一个简单的版本跑通心里有了底再去打磨各个部分最终在稳定性和性能上都取得了不错的效果。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻