第二章:需求预测与波动——别让预测变成“猜谜游戏”
大家好,我是老李。在供应链这行摸爬滚打了十几年,我见过太多因为需求预测不准而翻车的案例。今天咱们聊聊需求预测和波动的关系。说白了,预测不是算命,它是一门用历史数据说话的科学。
我个人习惯把需求预测比作“开车看路”。你不可能完全预判下一秒会不会有行人窜出来,但你可以根据路况、车速、天气来调整你的驾驶策略。库存管理也一样——我们追求的不是100%准确,而是知道误差有多大,以及如何应对。
2.1 需求预测的基本方法
先说说最常用的几种方法。别嫌基础,我当年就是靠这些方法帮一家电子厂把库存周转率提升了30%。
2.1.1 移动平均法
这个方法最简单,也最实用。取最近N期的实际需求,算个平均值作为下一期的预测值。
# 简单移动平均示例(Python)
def simple_moving_average(data, window=3):
return sum(data[-window:]) / window
# 假设过去3周的需求是 [120, 130, 110]
prediction = simple_moving_average([120, 130, 110], 3)
print(f"下周预测需求: {prediction}") # 输出: 120.0
嗯,这里要注意:窗口期选多大很关键。我在项目中遇到过,如果产品季节性波动大,窗口期选太短会过度反应,选太长又反应迟钝。一般建议先试3-6期,再根据误差调整。
2.1.2 指数平滑法
这个方法比移动平均聪明一点。它给近期数据更高的权重,远期数据权重递减。公式长这样:
# 指数平滑示例
def exponential_smoothing(data, alpha=0.3):
if not data:
return None
forecast = data[0] # 初始值用第一个实际值
for actual in data[1:]:
forecast = alpha * actual + (1 - alpha) * forecast
return forecast
# 假设数据 [120, 130, 110, 140]
prediction = exponential_smoothing([120, 130, 110, 140], alpha=0.3)
print(f"下一期预测: {prediction:.1f}")
alpha值怎么选?我建议从0.2开始试。alpha越大,模型对近期变化越敏感。说白了,如果你觉得市场变化快,就选大一点的alpha;如果觉得趋势稳定,就选小一点的。
2.1.3 季节性分解法
这个方法适合有明显季节性的产品。比如空调、羽绒服、月饼。我曾经帮一家饮料公司做预测,发现他们的销量在夏天是冬天的3倍。如果不做季节性分解,预测就是瞎扯。
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 移动平均 | 需求平稳、无趋势 | 简单易懂 | 滞后性明显 |
| 指数平滑 | 短期预测 | 计算量小 | 对突变不敏感 |
| 季节性分解 | 有明显周期 | 捕捉季节规律 | 需要足够历史数据 |
2.2 预测误差与波动的关系
你想想看,预测做完了,然后呢?很多人犯的错误是:把预测值当成真理,直接下单采购。结果呢?要么库存积压,要么断货。
为什么会这样?因为预测一定有误差。这个误差就是波动的来源之一。
核心观点:预测误差 ≠ 需求波动,但预测误差会放大需求波动的影响。
举个例子:假设真实需求是100,你预测了90。误差是10%。如果你按90备货,实际来了100,你就缺了10个。这10个缺口会触发紧急补货,而紧急补货又会导致供应商那边波动加剧。这就是所谓的“牛鞭效应”。
我记得有一次,一家客户因为预测误差只有5%,但他们的安全库存设得太低,结果一个促销活动直接把库存打穿。后来我帮他们重新算了一下,把安全库存公式里的波动系数从1.5调到了2.0,问题就解决了。
2.3 如何量化需求的不确定性
量化不确定性,说白了就是回答一个问题:我的预测到底有多不靠谱?
2.3.1 用标准差衡量波动
最常用的指标是标准差。它告诉你数据偏离平均值的程度。
import numpy as np
# 假设过去12个月的需求数据
demand = [120, 130, 110, 140, 125, 135, 115, 145, 128, 132, 118, 142]
mean_demand = np.mean(demand)
std_demand = np.std(demand, ddof=1) # 样本标准差
print(f"平均需求: {mean_demand:.1f}")
print(f"标准差: {std_demand:.1f}")
print(f"波动系数(CV): {std_demand/mean_demand:.2f}")
波动系数(CV)是个好东西。CV小于0.2算低波动,0.2-0.5算中等,大于0.5算高波动。我一般建议:CV超过0.3的产品,就别用简单移动平均了,得用更复杂的模型。
2.3.2 预测区间 vs 点预测
很多新手只给一个点预测值。我建议至少给出80%的预测区间。什么意思?就是告诉业务部门:下周需求有80%的概率落在[110, 130]之间。
实战技巧:用历史预测误差的分布来估算预测区间。假设误差服从正态分布,那么80%的预测区间就是:预测值 ± 1.28 × 误差标准差。
2.3.3 用MAPE评估预测质量
MAPE(平均绝对百分比误差)是我最常用的评估指标。它告诉你预测平均偏离了多少百分比。
def calculate_mape(actual, forecast):
return np.mean(np.abs((np.array(actual) - np.array(forecast)) / np.array(actual))) * 100
actual = [120, 130, 110, 140]
forecast = [115, 125, 115, 135]
mape = calculate_mape(actual, forecast)
print(f"MAPE: {mape:.1f}%")
MAPE小于10%算优秀,10%-20%算良好,超过20%就要警惕了。我曾经遇到一个项目,MAPE高达35%,后来发现是数据清洗出了问题——他们把退货数据也算进去了。
避坑指南:我曾经犯过一个错误——只看MAPE,不看实际业务场景。有一次MAPE只有8%,但那个产品是高价低量品,8%的误差意味着几十万的库存风险。所以,评估预测质量一定要结合业务价值来看。
知识体系总览
下面这张图是我自己画的,把本章的核心逻辑串起来了。你一看就明白:预测方法、误差量化、波动控制,这三者是怎么联动的。
好了,这一章的内容就这些。记住:预测不是目的,控制波动才是。下一章咱们聊聊安全库存怎么算,那才是真正见功夫的地方。
公众号:蓝海资料掘金营,微信deep3321