paper2skills Playbook

Pre-launch new product demand forecasting using Bass model with ML

Skill-New-Product-Inventory-Coldstart · 04-供应链

experimentforecastingpricing供应链与补货推荐与搜索定价与利润WF-A 智能补货WF-D 选品扫描WF-F 动态定价
实现难度⭐⭐⭐☆☆
业务视角
适用角色供应链负责人 · 采购负责人 · CEO / 运营 VP
适用平台Amazon FBA · 海外仓 · 多国仓位(美/欧/日)
什么情况下用库存周转率低,资金压在海外仓出不来;SKU 断货紧急空运,物流成本吃掉毛利;多仓库存分布不均
成功是什么样的库存周转天数从 90 天降到 60 天,断货率 <3%,海外仓综合成本降低 15-25%
业务痛点
库存周转天数太长资金压死了断货了只能空运救急成本爆了多市场库存分配不均

1. 解决的问题

核心思想:新品上市前无历史销量,但不是无信息——相似 SKU 的历史数据、产品属性特征、Bass 扩散参数估计三条路径可以构建新品的需求先验分布。上市后用贝叶斯更新快速收敛,并通过「探索加成」(首批量刻意多订一点以加速学习)避免因首批订少而永久缺乏数据的陷阱。

2. 核心算法逻辑

核心思想:新品上市前无历史销量,但不是无信息——相似 SKU 的历史数据、产品属性特征、Bass 扩散参数估计三条路径可以构建新品的需求先验分布。上市后用贝叶斯更新快速收敛,并通过「探索加成」(首批量刻意多订一点以加速学习)避免因首批订少而永久缺乏数据的陷阱。

3. 业务应用场景

场景 A:新款 UV-C 密闭消毒器上市首批备货(强相似 SKU 存在)

- 业务问题:全新 SKU「UV-C Pro X200」即将上市,lead time 6 周(需提前 6 周锁定首批量)。类比品:已有 UV-C Pro X100(上市 8 个月,月均销量 320 件,系数变异 CV=35%)。 - 预期产出: - 业务价值:相比"按均值订320件"的短视策略,贝叶斯策略在高不确定性场景下减少缺货损失约 $8,000-$15,000(前 6 周)

场景 B:全新品类(无历史类比SKU)—— Bass 参数估计

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

  • ROI 预估
  • Ban et al. 实证:忽略协变量 → 成本上升 6-15%,换算 $50K 首批采购 = 节省 $3,000-$7,500
  • Keskin 探索加成:避免短视策略在高不确定性场景的"任意大损失",实践估算避免缺货损失 $8,000-$15,000
  • 年均 3-4 个新品上市:年化价值 $33,000-$90,000
  • 实施难度:⭐⭐⭐☆☆(3/5)— 需要历史 SKU 数据整理和相似度建模
  • 优先级评分:⭐⭐⭐⭐☆(4/5)— 高风险决策,但频率低于日常补货

7. 代码模板

代码块数量:7 · 路径:paper2skills-code/supply_chain/new_product_inventory_coldstart

"""
Skill-New-Product-Inventory-Coldstart
基于 Ban, Gallien & Mersereau M&SOM 2019 (类比SKU残差树) +
    Keskin, Li & Song OR 2023 (Bayesian探索加成) +
    Lee et al. TF&SC 2014 (Bass参数ML估计)
母婴跨境 DTC 新品冷启动库存策略
"""

import numpy as np
from dataclasses import dataclass
from scipy import stats
from scipy.optimize import minimize_scalar


@dataclass
class AnalogSKU:
    sku_id: str
    monthly_sales: list[float]
    unit_price: float
    category: str
    launch_month: int
    price_tier: str

    @property
    def demand_mean(self) -> float:
        return float(np.mean(self.monthly_sales))

    @property
    def demand_std(self) -> float:
        return float(np.std(self.monthly_sales))

    @property
    def cv(self) -> float:
        return self.demand_std / max(self.demand_mean, 1)


@dataclass
class NewProductSpec:
    sku_id: str
    unit_price: float
    category: str
    price_tier: str
    launch_month: int
    lead_time_months: float = 1.5
    holding_cost_rate: float = 0.20
    stockout_cost_multiplier: float = 2.0


def find_analog_skus(
    new_product: NewProductSpec,
    catalog: list[AnalogSKU],
    n_analogs: int = 3,
) -> list[tuple[AnalogSKU, float]]:
    """
    按相似度匹配类比 SKU(Ban et al. 协变量回归的简化版)。
    相似度 = 类别匹配 × 价格段距离 × 上市季节对齐
    """
    scored = []
    for sku in catalog:
        sim = 0.0

8. 论文来源

未自动抽取;请查看原始 Skill 卡片。