食品卖得越快就应该进货越多吗?为什么短保食品的库存模型不能只看历史销量?
库存报废往往不是发生在报废那一天,而是发生在订货量被抬高的那几天。下面用一组模拟数字倒着复盘:一款冷藏鲜奶到店后可以卖 3 天,第 3 天关店时没卖完的就报废。前三天恰逢周末和促销,日销 105、118、112 瓶,系统只看到销量在涨,便把每天补货量固定在 130 瓶;第 4 天起促销结束、天气转冷,需求落回 80 瓶上下。
反例复盘:第 4 天多订的货,第 8 天才变成报废
| 天 | 需求 | 到货 | 期末库存 | 覆盖天数 | 报废 |
|---|---|---|---|---|---|
| 1 | 105 | 130 | 25 | 0.2 | 0 |
| 2 | 118 | 130 | 37 | 0.3 | 0 |
| 3 | 112 | 130 | 55 | 0.5 | 0 |
| 4 | 84 | 130 | 101 | 1.2 | 0 |
| 5 | 80 | 130 | 151 | 1.9 | 0 |
| 6 | 78 | 130 | 203 | 2.6 | 0 |
| 7 | 80 | 130 | 253 | 3.2 | 0 |
| 8 | 82 | 130 | 260 | 3.2 | 41 |
| 9 | 80 | 130 | 260 | 3.3 | 50 |
前七天没有一瓶报废,也没有缺货,130 瓶看上去一直是对的。信号藏在期末库存里:它从 25 瓶涨到 253 瓶,覆盖天数在第 7 天升到 3.2,已经超过这款鲜奶的可售天数。需求稳定在 80 瓶以后,每天多进 50 瓶,就每天报废约 50 瓶,占到货量的 38%。
- 第 4 天期末 101 瓶,全部来自当天到货,覆盖 1.2 天,账面看不出问题;但需求已从 112 瓶掉到 84 瓶,订货量本该压下来。
- 第 6 天在库 203 瓶:第 5 天到的 73 瓶只剩一天可卖,第 6 天到的 130 瓶还剩两天。两天只能卖掉约 160 瓶,约 43 瓶已注定卖不完,比账面早两天。
- 第 8 天第 6 天到的那批只剩 41 瓶,到期报废,第一笔损耗出现。
- 第 9 天第 7 天到的那批剩 50 瓶到期,之后每天重复一次。
系统当时的判断
- 把周末与促销的 3 天当成趋势,补货量锁在高点
- 每天单独算订货量,在库已有 101 瓶仍照进 130 瓶
- 目标只有销量,不问多进一瓶的代价
应有的判断
- 先用促销与天气日历解释增长,预期回落,区分方法见销量暴涨时的判断流程
- 订货量 = 预计需求 − 在库 − 在途,并逐批检查寿命内卖不卖得完
- 目标是缺货与报废的总成本
卖得最快的那几天,先要解释,再谈补货。
模型要交出去的三个数
预测销量不是库存模型的产出,产出是订货量、订货时点和目标库存三个数。提前期决定预测要看多远:提前期 1 天、每天盘点一次,今天下的单要覆盖未来 2 天,所以预测的是 2 天需求的分布,不是明天的一个平均值。
示例推演 · 三个决策变量
保护期 = 提前期 L + 盘点周期 R = 1 + 1 = 2 天
目标库存 S = 保护期内需求分布的第 q 分位
订货量 Q = S − 在库 − 在途
封顶 在库 + Q ≤ 可售窗口内需求的第 q 分位
第 6 天 在库 151 瓶,窗口 3 天 × 80 = 240 瓶,最多再订 89 瓶,而不是 130 瓶| 输入 | 决定什么 | 最常见的失真 |
|---|---|---|
| Sales History | 需求基线与波动 | 断货日偏低,促销日偏高 |
| Shelf Life | 可售窗口与报废概率 | 没有批次到期日 |
| Lead Time | 预测要看多远 | 用合同天数,不用实际到货天数 |
| Weather | 提前期内的需求偏离 | 用实况而不是采购时的预报,见天气预报进入库存模型 |
| Promotion | 提升量与回落坑 | 日历晚于订货,事后才登记 |
| Store Traffic | 需求的领先信号 | 与销量的时间没有对齐 |
| Waste Cost | 临界比 q | 只算进价,漏了处理费 |
训练与评估:把 MAPE 换成成本
必赢亚洲智能库存的思路,是把目标从“预测销量”改成“最小化缺货加报废的总成本”,订货量由此成为需求分布上的一个分位,而不是平均销量再加 30%。
示例推演 · 两侧损失与订货分位
缺货损失 Cu = 毛利 3 元 + 顺手买走的其他商品毛利 2 元 = 5 元 报废损失 Co = 进价 6 元 × 最终卖不掉的概率 0.4 = 2.4 元 临界比 q = Cu ÷ (Cu + Co) = 5 ÷ 7.4 ≈ 0.68,订货量取第 68 百分位 只剩最后一天时 Co 接近进价 6 元:q = 5 ÷ 11 ≈ 0.45
剩余保质期越长,多出的一瓶越可能在到期前卖掉,Co 越小,所以保质期必须作为输入。训练时对应的损失函数是分位数损失(Pinball Loss):偏低每瓶罚 0.68,偏高每瓶罚 0.32,罚分之比约 2.1 : 1,与 5 : 2.4 的成本之比一致,模型直接输出第 68 百分位,不必事后乘安全系数。
评估口径也要跟着换。假设某天真实需求是 80 瓶:
只看预测误差与满足率
- 预测 72 瓶与 88 瓶的 MAPE 都是 10%,被评成一样好
- 固定 130 瓶满足率 100%,看不见 91 瓶报废
回放成本
- 偏低 8 × 5 = 40 元,偏高 8 × 2.4 = 19.2 元
- 把订货建议放进逐日账本,同时看总成本、报废率与满足率
- 按各 SKU 的 Cu 与 Co 加权
同样 9 天需求,按可售需求订货的回放见表 3:到货 = 预测 + 缓冲 − 期初库存,缓冲取 7 瓶;示例按到货日记账,订货在前一天下达。
| 天 | 需求 | 预测 | 到货 | 期末库存 |
|---|---|---|---|---|
| 1 | 105 | 108 | 115 | 10 |
| 2 | 118 | 114 | 111 | 3 |
| 3 | 112 | 114 | 118 | 9 |
| 4 | 84 | 82 | 80 | 5 |
| 5 | 80 | 81 | 83 | 8 |
| 6 | 78 | 75 | 74 | 4 |
| 7 | 80 | 84 | 87 | 11 |
| 8 | 82 | 81 | 77 | 6 |
| 9 | 80 | 86 | 87 | 13 |
| 合计 | 819 | — | 832 | 13 |
以上为示例推演数字。表 3 假设预测误差不超过 6 瓶(小于缓冲 7 瓶),并提前知道促销结束与降温;真实门店误差更大,报废不会是 0。
上线前的检查清单
- 先把销量还原成需求:断货日按小时曲线还原,促销日按日历剥离。
- 到期日按批次记录:否则做不了逐批的“寿命内卖得完”检验。
- 提前期用实测值:取近 8 周的实际到货天数,晚到一天,窗口就少一天。
- Cu 与 Co 逐 SKU 修正:引流品的 Cu 含整篮损失,长保品的 Co 按预计滞留天数折算。
- 设置护栏:订货量不超过窗口内需求的第 q 分位与陈列容量;预测缺失时退回规则法。
- 先并行、后放开:前四周只给建议,每周按表 3 的口径回放,总成本连续四周不差于人工订货,再放开自动下单。
在必赢亚洲 App 里,系统设计为按批次显示在库数量、剩余保质期和覆盖天数,超过时提示,让门店提前两天看到风险,见怎样识别即将进入高损耗区间的食品。
三个常见的反驳
- 卖得快说明需求是真的,多进一点有什么问题?
- 需求是真的,但只对过去成立,前三天的周末和促销会回落。卖得越快,同样比例的偏差换算成的瓶数越多:预测偏高 10%,日销 800 瓶的商品每天就多 80 瓶,每一瓶只有 3 天寿命。
- 报废这么贵,干脆少进一点,宁可缺货?
- 示例里缺货一瓶损失 5 元,多订一瓶的期望损失只有 2.4 元,最优订货量因此高于平均需求。长期偏少还有隐蔽代价:断货日销量低于真实需求,被压低的数字进入下一轮预测,基线一路下滑,见七天窗口里混进断货日的情形。毛利薄、进价高的品类,Cu 小于 Co,结论则相反。
- 让大语言模型直接回答“明天订多少”,不是更省事吗?
- 订货量需要数值预测和带成本的优化,语言模型不擅长稳定地给出带分位的数。必赢亚洲 AI 的分工是:时序与梯度提升模型预测,优化器取分位,大模型负责解释与调用工具,见为什么食品库存预测不能只靠大语言模型。
这套方法的边界
保质期长达数月的常温商品,Co 很小,逐批检验收益有限;起订量大于窗口需求时,先改批量,见安全库存为什么不能照搬普通公式;新品没有历史,用相似商品曲线冷启动,见上万个 SKU 为什么不能共用一个预测模型;已经订多了的批次,看临期食品第一次干预的时点。