一根鞭子,甩到链条末端
最后一卷不再教新工具,而是把前二十章的工具拿去看别的地方。第一站是一条供应链——它是一个延迟很长、增益不小、而且串了好几级的反馈环。它会做出你现在应该已经能预测的事。
一条四级供应链:顾客 → 零售 → 批发 → 分销 → 工厂。顾客的需求是平稳的随机波动(每周 100 单位上下,标准差 10),没有任何趋势、季节、突发。
每一级都做同一件完全合理的事:按最近几周的平均值预测需求,把库存补到「够撑过交货期」的水平。没有人囤积,没有人恐慌,没有人博弈。
一条链,四个环
先看清楚这里的环在哪。每一级零售商面对的是:
- 被控量:我的库存水平;
- 目标:够撑过交货期的库存;
- 控制量:这周订多少货;
- 延迟:订了货要 L 周才到(交货期);
- 传感器:我看到的需求——而它其实是下游那一级的订单,不是终端顾客的真实需求。
最后一条是关键。每一级看到的都不是真实需求,而是下游那个环的输出。而那个输出,已经被下游那个环加过工了。
| 这一级 | 订单波动放大 |
|---|---|
| 顾客的真实需求 | 1.00× |
| 零售商的订单 | 1.18× |
| 批发商的订单 | 1.66× |
| 分销商的订单 | 2.60× |
| 工厂看到的订单 | 4.27× |
每一级只放大 1.2 到 1.6 倍,看起来都不严重。而四级串起来,放大是相乘的。
放大不需要任何人做错事。
这个模型里没有恐慌、没有囤货、没有虚报、没有信息不对称的博弈。每一级都在做一件教科书上写着的、完全正确的事:用最近的数据预测需求,把库存补到该有的水平。
而放大是这条规则的数学后果。它有闭式解,可以算,可以预测,可以设计。
那个闭式解
Chen、Drezner、Ryan 和 Simchi-Levi 在 2000 年给出了单级的精确放大倍数。推导只要几行:
# 设:需求 d 独立同分布,交货期 L 周,用最近 p 周的移动平均做预测。
# 「补到目标库存」策略下,这一周的订单是:
q_t = (1 + L/p) · d_{t−1} − (L/p) · d_{t−1−p}
└────┬────┘ └───┬───┘
对最新那个需求的反应 把 p 周前那个需求从平均里剔掉
# 因为 d 各期独立,方差直接相加:
Var(q)/Var(d) = (1 + L/p)² + (L/p)²
= 1 + 2L/p + 2L²/p²
★ 这个式子里没有任何人的愚蠢,只有 L 和 p 两个数。
验算:用 20 万期的仿真真跑一遍,和闭式对照:
交货期 L 预测窗口 p 仿真放大 闭式解 相对差
────────────────────────────────────────────────────
1 5 1.4809× 1.4800× 0.060%
2 5 2.1221× 2.1200× 0.097%
4 5 3.8853× 3.8800× 0.136%
2 10 1.4789× 1.4800× 0.075%
4 1 41.0841× 41.0000× 0.205%
# 最后一行值得盯一眼:交货期 4 周、只看上周的需求做预测,
# 放大 41 倍。**只看最近一期**这件事,代价大得离谱。
这个式子给出两个可以直接动手的旋钮:
① 缩短交货期 L。式子里 L 是二次的(2L²/p² 那一项),所以缩短交货期的回报是超线性的。L 从 4 降到 2(p=5),放大从 3.88 降到 2.12。
② 加长预测窗口 p。看得越长越平稳。p 从 5 加到 10(L=2),放大从 2.12 降到 1.48。代价是反应变慢——真需求发生变化时,你要更久才承认它。这就是我们熟悉的那笔交易:稳定换速度。(第 17 章那个滤波器的账,一模一样。)
而最有效的一招不在这个式子里:③ 让每一级都能看到终端的真实需求。这样每一级就不再是串联的,放大不再相乘。这正是「供应商管理库存」(VMI)和 POS 数据共享这类做法的全部理论依据——它把一条串联的链,变成了四个并联的环。
用控制论的话重讲一遍
这一整章其实是前二十章的一次复习,每一条都能对上号:
| 供应链里的说法 | 控制论里的说法 | 本书第几章 |
|---|---|---|
| 交货期 L | 纯延迟 | 第 9 章 |
| 预测窗口 p | 传感器上的低通滤波 | 第 17 章 |
| 「缺口补齐比例」(订得多凶) | 回路增益 | 第 5 章 |
| 订单波动被放大 | 闭环在某些频率上增益大于 1 | 第 10 章 |
| 四级串起来放大相乘 | 串联环节的增益相乘 | 第 20 章 |
| 共享终端需求数据 | 前馈 | 第 18 章 |
| 缩短交货期 | 缩短延迟(净收益,不是交易) | 第 11 章 |
| 加长预测窗口 | 加滤波(是交易,赔上反应速度) | 第 17 章 |
整张表没有一行需要新知识。这就是「学完之后会改变你理解其他事物的方式」的具体样子——不是你多了一个关于供应链的知识点,是你发现供应链问题和你上周调的那个自动扩容是同一道题。
这个名字(bullwhip effect)来自宝洁在 1990 年代对尿布订单的观察:终端销量极其平稳,而上游的订单剧烈波动。名字取得很形象——手腕轻轻一抖,鞭梢甩出去很远。
但这个名字有一个副作用:它听起来像一种病理,像是有人做错了什么。于是很多讨论落在「怎么让大家别恐慌」「怎么防止虚报订单」上。
那些因素当然真实存在,也确实会加剧它。但本章的模型里一个都没有,放大照样是 4.27 倍。更准确的描述是:牛鞭效应是「串联的、带延迟的、各自局部最优的反馈环」这一结构的固有属性。
这个区分决定了你去改什么:改人的行为(宣导、考核、惩罚虚报)收效有限,改结构(缩短交货期、共享数据、减少层级)才是真的在动那个式子里的 L 和 p。
芯片行业的周期。从下单到交货十几周甚至更久(L 很大),而下游厂商只能看到自己的订单(信息不共享)。结果是这个行业著名的暴涨暴跌——缺货时人人超额下单,货到了又集体砍单。这不是因为半导体从业者比别人不理性,是因为那条链的 L 特别大。
2020–2022 年的集装箱和自行车。终端需求只涨了百分之几十,而上游订单一度涨了数倍,随后又暴跌到大量库存积压。那正好是这条链在一次阶跃输入下的过冲和回摆——和第 12 章那条冲过头 44.4% 的曲线是同一个形状,只是横轴的单位从秒变成了季度。
你的团队的工作量。需求从产品经理到设计到开发到测试,每一级都会「预留一点缓冲」。而缓冲就是增益:每一级预留 20%,四级下来就是 1.2⁴ ≈ 2.07 倍。而每一级都会诚实地说自己只留了一点点。
啤酒游戏。MIT 在 1960 年代设计的一个课堂桌游,就是让四个人分别扮演这条链的四级。几乎每一局都会出现剧烈的震荡和积压,而参与者事后普遍认为「是别人(或者上游那个傻子)搞砸的」。游戏的教学点正是:把同样理性的人放进这个结构,结果不会变。
看那个订单式子就明白了:
q_t = (1 + L/p)·d_{t−1} − (L/p)·d_{t−1−p}
└────┬────┘
系数**大于 1**
最新那个需求的系数是 1 + L/p,比 1 大。为什么?因为需求涨了 1 个单位,你不但要多订 1 个单位来满足它,还要把「交货期内的目标库存」也往上抬——而目标库存是按预测算的,预测涨了,目标库存跟着涨。这后半份是纯粹的放大。
这是本书反复出现的一个模式的又一次现身:局部合理 ≠ 全局合理。每一级都在正确地保护自己不缺货,而这些正确加起来,制造了一个上游根本没法应对的波形。
顺带一提,这也解释了为什么「让大家别过度反应」这类劝告基本无效:过度反应正是那条规则要求的。你要改的是规则本身(比如:目标库存不跟着预测走,而是用一个平滑得多的基准),或者改结构(共享数据、缩短交货期)。
C波动被逐级放大,工厂看到的标准差是顾客的 4.27 倍。逐级是 1.18× → 1.66× → 2.60× → 4.27×——每一级只放大一点,但四级是相乘的。
而单级的放大倍数有精确的闭式解:1 + 2L/p + 2L²/p²,与 20 万期仿真对照,相对差 0.060% 到 0.205%。
这一章的一句话
把几个各自理性、各自带延迟的反馈环串起来,放大是相乘的——而没有任何一级会觉得问题出在自己这里。
下一章把镜头转回你自己的代码。你大概率正在维护好几个反馈环,只是没人这么叫它们。其中最典型的那个会演示一条你现在应该能预测的规律:指标延迟一旦超过机器启动时间,同一套配置就会从「稳如磐石」变成「冲到 200 台」。