需求满足率与缺货成本全量化 — Fill Rate三层模型与OOS全链路损失计算
Skill-Fill-Rate-OOS-Cost-Quantification · 04-供应链
1. 解决的问题
7天缺货损失被估算$6650实际高达$23290——OOS五层全量化模型(直接+排名+流失+广告+评分)揭示真实损失是传统估算3.5倍,支撑正确安全库存决策
2. 核心算法逻辑
业务背景(陈凤霞实战经验):书中明确区分"缺货率"和"满足率"两个相关但不同的KPI:缺货率关注"什么时候没货"(时间维度),满足率关注"多少需求被满足"(数量维度)。书中特别强调:缺货的损失远不止"这次没卖出去"——更深层的损失包括:搜索排名下降(算法惩罚)、买家转向竞品(可能永久流失)、品牌口碑损伤(Review减少)。这些隐性损失往往是直接销售损失的35倍。
3. 业务应用场景
- 业务问题:某卖家吸奶器爆款因备货不足OOS了7天,运营团队估算损失"只有7天×25件×$38=$6650",觉得还好。但实际损失远不止于此 - 数据要求:OOS前后销量和排名数据、广告花费、历史评分、Buy Box拥有率 - 算法应用: 1. L1直接损失:7天×25件×$38=$6650 2. L2排名恢复期损失:补货后排名从P50降至P300,恢复需12天,流量衰减60%;损失=12天×25×0.6×$38=$6840 3. L3买家流失:7天访客约1400人,转化率3%流失永久,LTV=$220/人;损失=1400×3%×$220=$9240 4. L4广告浪费:7天继续投放$560
场景B:Fill Rate KPI体系建立(亚马逊运营团队)
- **业务问题**:运营团队没有Fill Rate指标,只追踪"有没有货"(二值),不知道"满足了多少需求" - **算法应用**:建立三层Fill Rate周报:Line Fill Rate(目标≥97%)、Order Fill Rate(目标≥94%)、Unit Fill Rate(目标≥99%);每周报告各层Fill Rate,低于目标的SKU自动触发补货评审 - **预期产出**:引入Fill Rate KPI后3个月,缺货率从12%降至5%,月均GMV提升8%(约$4万)
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- ROI 预估:月销$50万卖家,OOS真实成本=传统估算的3.5倍;通过正确量化后优化安全库存策略,年减少OOS 60%,避免损失约$8万;系统成本$2万,ROI≈400%
- 实施难度:⭐⭐⭐☆☆(Fill Rate计算本身简单,难点是L3(买家流失LTV)和L5(评分影响)的量化需要历史数据建模)
- 优先级:⭐⭐⭐⭐⭐(OOS成本被严重低估是行业普遍现象,量化后直接改变安全库存决策ROI方程)
- 适用规模:所有规模,月销>$1万就值得建立Fill Rate监控
- 数据依赖:订单级入库/出库记录(含OOS标记)、广告花费、评分历史、Buy Box拥有率历史
7. 代码模板
代码块数量:2 · 路径:未检测到
"""
需求满足率与缺货成本全量化系统
功能:Fill Rate三层计算 + OOS五层成本量化 + 动态FR预测 + 决策框架
"""
import numpy as np
import pandas as pd
from dataclasses import dataclass, field
from typing import List, Dict, Optional, Tuple
from datetime import datetime, timedelta
import warnings
warnings.filterwarnings('ignore')
@dataclass
class OrderLine:
"""订单行"""
order_id: str
sku_id: str
demanded_qty: int
fulfilled_qty: int
oos_occurred: bool = False
@property
def line_fulfilled(self) -> bool:
return self.fulfilled_qty >= self.demanded_qty * 0.98
@property
def unit_fill_rate(self) -> float:
return self.fulfilled_qty / max(self.demanded_qty, 1)
@dataclass
class OOSEvent:
"""缺货事件"""
sku_id: str
start_date: datetime
end_date: datetime
daily_demand_pre_oos: float # OOS前日均销量
unit_margin: float # 单位毛利($)
# 广告参数
daily_ad_spend: float # 日广告花费($)
# 排名影响参数
rank_recovery_days: int = 10 # 排名恢复天数
rank_flow_decay: float = 0.55 # 排名恢复期流量衰减
# 买家流失参数
daily_visitors_pre_oos: int = 0 # OOS前日访客数
permanent_loss_rate: float = 0.08 # 永久流失率
customer_ltv: float = 150.0 # 客户生命周期价值($)
@property
def oos_days(self) -> int:
return max((self.end_date - self.start_date).days, 0)
def compute_fill_rates(order_lines: List[OrderLine]) -> Dict:
"""计算三层Fill Rate"""
if not order_lines:
return {}
# Line Fill Rate8. 论文来源
- 2404.11237