P paper2skillsPlaybook
AI 路线图 →

Price Elasticity Estimation — 需求价格弹性估算:跨境 SKU 定价底线测算

Skill-Price-Elasticity-Estimation · 17-价格优化

causalexperimentforecastingoptimizationpricing供应链与补货定价与利润WF-A 智能补货WF-F 动态定价WF-G Listing内容优化
年化 ROI¥30-80 万
实现难度⭐⭐☆☆☆
业务视角
适用角色定价负责人 / 运营负责人 · 选品负责人 · CEO
适用平台Amazon Buy Box 竞价策略 · 多市场价格协调 · Prime Day / Coupon 折扣优化
什么情况下用竞品突然降价,不知道该不该跟,跟了怕伤利润不跟怕丢 BSR;大促期间不知道折扣给多少,给多了利润没了
成功是什么样的实时监控竞品价格并自动触发调价,毛利率保持在目标区间,BSR 排名和利润同时兼顾
业务痛点
竞品降价了不知道要不要跟大促折扣给多少没有依据手动盯价格太累反应不及时新品上线定价高了还是低了

1. 解决的问题

母婴卖家对吸奶器盲目大促打折,不知道该 SKU 弹性是否足够高值得降价——价格弹性工具变量估算(OLS + DiD)给出每个 SKU 的弹性系数,识别哪些SKU可提价哪些不值得促销,年化节省无效促销并增加利润30-80万元

2. 核心算法逻辑

价格弹性 $\epsilon$ 定义为:价格变动1%时需求量变动的百分比。$|\epsilon|1$ 是弹性商品(涨价会显著降低销量),$|\epsilon|<1$ 是非弹性商品(涨价对销量影响小)。这是所有定价决策的底层参数——没有它,任何动态定价都是在盲飞。

3. 业务应用场景

业务问题:黑五要不要打折?打折多少?运营经验说"降15%就够了",但没有数据支撑。每次促销结束后不知道是真的带动了增量销售,还是只是提前消费了原本会买的用户。

数据要求: - 过去52周 ASIN 级别周销量 + 周均价(来自 Seller Central) - 同类竞品价格序列(Keepa API,主要竞品3-5个) - 促销事件标记(Coupon/Deal/Lightning Deal 时间窗口)

预期产出: - 弹性系数:如 $\epsilon = -1.4$(价格降10%,销量预计涨14%) - 促销临界点:降价超过 X% 才能实现正增量GMV - 促销 ROI 曲线:横轴=折扣力度,纵轴=增量利润(考虑降价损失)

4. 输入数据要求

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

5. 输出结果

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

6. 业务价值 / ROI

  • ROI 预估
  • 识别强非弹性 SKU(奶粉配件类)后提价 10%:月增利润 ¥5-15 万
  • 避免对高弹性 SKU 盲目提价造成的 BSR 崩塌:保护 ¥10-30 万/季度排名价值
  • 促销预算精准分配(只对弹性高的 SKU 打折):节省无效促销成本 ¥10-20 万/年
  • 年化综合 ROI:¥30-80 万
  • 实施难度:⭐⭐☆☆☆(需要 Seller Central 历史数据 + Keepa API;OLS 回归无需复杂环境)

7. 代码模板

代码块数量:1 · 路径:paper2skills-code/17-价格优化/price_elasticity_estimation

"""
Price Elasticity Estimation for Cross-Border E-Commerce
基于 DiD + Log-Log OLS 的 SKU 级价格弹性估算
"""
import numpy as np
import pandas as pd
from scipy import stats
import warnings
warnings.filterwarnings('ignore')


def generate_sample_data():
    """生成模拟母婴 SKU 价格-需求数据"""
    np.random.seed(42)
    n_weeks = 52
    weeks = pd.date_range('2025-01-01', periods=n_weeks, freq='W')

    # 真实弹性设定:吸奶器 -1.4,奶粉 -0.6
    skus = {
        'breast_pump_A': {'base_price': 129, 'true_elasticity': -1.4, 'base_demand': 200},
        'formula_B':     {'base_price': 45,  'true_elasticity': -0.6, 'base_demand': 500},
        'sterilizer_C':  {'base_price': 89,  'true_elasticity': -1.1, 'base_demand': 150},
    }

    records = []
    for sku, params in skus.items():
        for i, week in enumerate(weeks):
            # 添加价格扰动(模拟促销/竞品调价)
            price_shock = np.random.choice([-0.15, -0.10, 0, 0, 0, 0.05], p=[0.05, 0.1, 0.5, 0.2, 0.1, 0.05])
            price = params['base_price'] * (1 + price_shock)
            # 季节性因子
            season = 1 + 0.3 * np.sin(2 * np.pi * i / 52)
            # 需求 = f(价格弹性, 季节, 噪声)
            demand = params['base_demand'] * season * (price / params['base_price']) ** params['true_elasticity']
            demand = max(0, demand * (1 + np.random.normal(0, 0.1)))
            records.append({'week': week, 'sku': sku, 'price': price, 'demand': demand})

    return pd.DataFrame(records)


def estimate_elasticity_ols(df, sku_name, control_vars=None):
    """
    对数-对数 OLS 弹性估算
    ln(demand) = α + ε·ln(price) + controls + ε_it
    """
    sku_df = df[df['sku'] == sku_name].copy()
    sku_df['ln_demand'] = np.log(sku_df['demand'].clip(lower=1))
    sku_df['ln_price'] = np.log(sku_df['price'])
    sku_df['week_num'] = range(len(sku_df))
    # 添加季节控制
    sku_df['sin_season'] = np.sin(2 * np.pi * sku_df['week_num'] / 52)
    sku_df['cos_season'] = np.cos(2 * np.pi * sku_df['week_num'] / 52)

    X = sku_df[['ln_price', 'sin_season', 'cos_season']].values
    X = np.column_stack([np.ones(len(X)), X])
    y = sku_df['ln_demand'].values

    # OLS
    beta, residuals, rank, sv = np.linalg.lstsq(X, y, rcond=None)
    y_pred = X @ beta

8. 论文来源

  • 2106.08274