P paper2skillsPlaybook
AI 路线图 →

需求满足率与缺货成本全量化 — Fill Rate三层模型与OOS全链路损失计算

Skill-Fill-Rate-OOS-Cost-Quantification · 04-供应链

causalexperimentforecasting广告与投放供应链与补货客服与VOC定价与利润WF-A 智能补货WF-B 广告优化WF-C 客服分诊WF-E Review监控WF-H 复购增长WF-J DTC 独立站增长
年化 ROI50万
实现难度⭐⭐⭐☆☆
业务优先级⭐⭐⭐⭐⭐
业务视角
适用角色供应链负责人 · 采购负责人 · CEO / 运营 VP
适用平台Amazon FBA · 海外仓 · 多国仓位(美/欧/日)
什么情况下用库存周转率低,资金压在海外仓出不来;SKU 断货紧急空运,物流成本吃掉毛利;多仓库存分布不均
成功是什么样的库存周转天数从 90 天降到 60 天,断货率 <3%,海外仓综合成本降低 15-25%
业务痛点
库存周转天数太长资金压死了断货了只能空运救急成本爆了多市场库存分配不均

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 Rate

8. 论文来源

  • 2404.11237