动态ABC分层与策略自适应 — 帕累托分类自动更新与差异化库存策略绑定
Skill-Dynamic-ABC-Stratification-Adaptive-Policy · 04-供应链
1. 解决的问题
新升级爆款仍按C类备货导致旺季缺货——CUSUM漂移检测自动升降级并绑定差异化策略,年化防损$10-15万,C类库存瘦身释放资金$10-20万
2. 核心算法逻辑
业务背景(陈凤霞实战经验):书中专节阐述ABC分类在电商供应链中的核心地位:A类商品(20%SKU贡献80%营收)需要高精度预测、充足安全库存、高频补货;C类商品(50%SKU只贡献5%营收)应用最低订购量、低安全库存、宽松补货周期。但静态ABC分类每季度才更新一次,导致"已变成爆款的商品仍按C类策略备货,导致缺货"这一极高频痛点。
3. 业务应用场景
场景A:母婴卖家全SKU动态ABC分类重建
- 业务问题:某卖家80个SKU,上次做ABC分类是6个月前,期间有2款新品快速成长(吸奶器配件套装、智能温奶器),仍按C类管理,Q4旺季前缺货损失$3万 - 数据要求:12个月SKU级月度销售额/毛利/销量、当前库存、近期增长率 - 算法应用: 1. 多维加权评分重新计算,发现"吸奶器配件套装"评分从C类上升至A类 2. CUSUM检测:该SKU销售额连续4个月超过B类上边界 → 自动升级为A类 3. 升级后自动绑定策略:安全库存从5天→14天,补货频率从月度→每周,分配前置仓仓位 4. 触发立即补货:按新策略计算缺口,下单500件 - 预期产出:动态分类使新品冷启动到充足备货的时间从3个月
- **业务问题**:50个C类SKU占用$20万库存,贡献营收仅3%,每个月产生$0.8万仓储费 - **算法应用**:对CZ类(低销+波动大)SKU启动"最小库存策略":安全库存降至3天,按需采购不做库存备货;对连续6个月销量<5件/月的SKU启动清仓流程 - **预期产出**:C类库存从$20万降至$8万,释放$12万资金,月均仓储节省$0.5万
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- ROI 预估:动态ABC使新升级SKU及时备货,每年防止5-8次升级SKU旺季缺货,每次防损$2-5万;同时C类SKU策略瘦身释放$10-20万库存资金;系统建设成本$4万,ROI≈500-800%
- 实施难度:⭐⭐☆☆☆(算法简单,关键是建立"分类结果自动触发策略"的闭环,而不只是出一张分类报表)
- 优先级:⭐⭐⭐⭐⭐(所有有50个以上SKU的卖家必建能力,是供应链差异化管理的基础框架)
- 适用规模:SKU数>30个的卖家均可受益,越多SKU效果越显著
- 数据依赖:12个月SKU级月度销售数据(销售额/毛利/销量)、当前分类历史记录
7. 代码模板
代码块数量:2 · 路径:未检测到
"""
动态ABC分层与策略自适应系统
功能:多维ABC分类 + XYZ波动分析 + CUSUM漂移检测 + 策略自动绑定
"""
import numpy as np
import pandas as pd
from dataclasses import dataclass, field
from typing import List, Dict, Optional, Tuple
from collections import defaultdict
import warnings
warnings.filterwarnings('ignore')
@dataclass
class SKUHistoricalData:
"""SKU历史数据"""
sku_id: str
monthly_revenue: List[float] # 12个月销售额
monthly_profit: List[float] # 12个月毛利
monthly_units: List[float] # 12个月销量
current_abc_class: str = 'C' # 当前分类
months_in_class: int = 0 # 在当前分类的月数
is_new_product: bool = False # 是否新品(首3个月)
# 策略矩阵(ABC × XYZ → 库存策略)
STRATEGY_MATRIX = {
('A', 'X'): {'safety_days': 7, 'replenish_freq': 'weekly', 'forecast': 'ml_precise', 'priority': 'HIGHEST'},
('A', 'Y'): {'safety_days': 14, 'replenish_freq': 'weekly', 'forecast': 'ml_calibrated','priority': 'HIGH'},
('A', 'Z'): {'safety_days': 21, 'replenish_freq': 'biweekly', 'forecast': 'conservative', 'priority': 'HIGH'},
('B', 'X'): {'safety_days': 10, 'replenish_freq': 'biweekly', 'forecast': 'statistical', 'priority': 'MEDIUM'},
('B', 'Y'): {'safety_days': 14, 'replenish_freq': 'monthly', 'forecast': 'statistical', 'priority': 'MEDIUM'},
('B', 'Z'): {'safety_days': 21, 'replenish_freq': 'adhoc', 'forecast': 'manual', 'priority': 'LOW'},
('C', 'X'): {'safety_days': 5, 'replenish_freq': 'monthly', 'forecast': 'simple_ma', 'priority': 'LOW'},
('C', 'Y'): {'safety_days': 3, 'replenish_freq': 'adhoc', 'forecast': 'simple_ma', 'priority': 'LOWEST'},
('C', 'Z'): {'safety_days': 3, 'replenish_freq': 'adhoc', 'forecast': 'manual', 'priority': 'LOWEST'},
}
def compute_multi_dim_score(sku: SKUHistoricalData,
w_revenue: float = 0.4, w_profit: float = 0.3,
w_units: float = 0.2, w_growth: float = 0.1) -> Dict:
"""多维ABC评分计算"""
rev_total = sum(sku.monthly_revenue[-12:])
profit_total = sum(sku.monthly_profit[-12:])
units_total = sum(sku.monthly_units[-12:])
# 增长率(近3个月 vs 前3个月)
recent = np.mean(sku.monthly_revenue[-3:]) if len(sku.monthly_revenue) >= 3 else 0
prior = np.mean(sku.monthly_revenue[-6:-3]) if len(sku.monthly_revenue) >= 6 else recent
growth_rate = (recent - prior) / max(prior, 1)
growth_score = np.tanh(growth_rate) # 归一化到[-1, 1]
return {
'sku_id': sku.sku_id,
'revenue_12m': rev_total,
'profit_12m': profit_total,
'units_12m': units_total,
'growth_rate': growth_rate,
'growth_score': growth_score,8. 论文来源
- 2403.15621