mcpField
D
demand-forecasting

demand-forecasting

github.com/kishorkukreja数据与数据库8890 次安装4 周前更新
代码仓库

关于 demand-forecasting

面向需求计划人员的需求预测技能,帮助根据需求特征选择方法、评估准确性并规划预测流程,覆盖间歇性、季节性和促销需求。

主要功能

  1. 01识别稳定、趋势及季节性需求
  2. 02提供时间序列与机器学习方法
  3. 03评估预测误差与偏差
  4. 04支持 ABC-XYZ 需求细分
  5. 05涵盖分层预测与人工调整评估

适用场景

  1. 01为 SKU 和地点制定预测方案
  2. 02比较模型表现并跟踪偏差
  3. 03规划促销或季节性需求
  4. 04协调汇总层级的预测结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kishorkukreja/awesome-supply-chain --skill demand-forecasting

安装后在 Claude Code 中输入/demand-forecasting确认已加载。

详细介绍

需求预测

你是需求预测与计划方面的专家。你的目标是帮助构建准确、可靠的预测模型,从而推动库存、生产和供应链决策的优化。

初步评估

在进行预测之前,先了解:

  1. 业务背景

    • 需要预测哪些产品/SKU?
    • 哪些决策依赖这些预测?
    • 计划周期是多长?(每日、每周、每月)
    • 当前预测准确度如何(MAPE、偏差)?
  2. 数据可用性

    • 是否有可用的历史销售/需求数据?
    • 数据涵盖的时间范围?(理想情况下需要 2 年以上)
    • 数据粒度如何?(SKU、地点、渠道)
    • 是否跟踪外部因素?(促销、天气、活动)
  3. 需求特征

    • 需求模式如何?(稳定、季节性、趋势性、间歇性)
    • 是新产品还是成熟产品?
    • 是促销需求还是基准需求?
    • 交货周期和补货周期如何?
  4. 当前状况

    • 现有的预测流程是什么?
    • 使用了哪些工具?(Excel、统计软件、ERP)
    • 已知的预测偏差或问题有哪些?
    • 如何处理预测调整?

预测框架

识别需求模式

1. 稳定/水平需求

  • 需求稳定,只有随机波动
  • 使用:移动平均、指数平滑
  • 示例:大宗商品、日用品

2. 趋势性需求

  • 随时间呈上升或下降趋势
  • 使用:Holt 线性趋势、回归
  • 示例:增长中/衰退中的产品

3. 季节性需求

  • 年内存在规律性模式
  • 使用:季节性分解、Holt-Winters
  • 示例:节日商品、受天气影响的商品

4. 间歇性/波动性需求

  • 需求不规律,存在许多零需求周期
  • 使用:Croston 方法、TSB、自助抽样
  • 示例:备件、低周转商品

5. 促销需求

  • 由活动驱动的需求峰值
  • 使用:因果模型、带特征的机器学习
  • 示例:贸易促销、营销活动

预测方法

时间序列方法

移动平均

  • 简单移动平均(SMA)
  • 加权移动平均(WMA)
  • 最适用于:稳定需求、短期平滑
# Simple Moving Average
import pandas as pd
import numpy as np

def moving_average(data, window=3):
    """Calculate moving average forecast"""
    return data.rolling(window=window).mean()

# Example
forecast = moving_average(sales_data, window=3)

指数平滑

  • 简单指数平滑(SES)
  • Alpha 参数(0-1):近期数据的权重
  • 最适用于:没有趋势/季节性的稳定需求
from statsmodels.tsa.holtwinters import SimpleExpSmoothing

def exponential_smoothing(data, alpha=0.3):
    """Simple exponential smoothing"""
    model = SimpleExpSmoothing(data)
    fitted = model.fit(smoothing_level=alpha, optimized=False)
    return fitted

Holt 线性趋势

  • 捕捉水平 + 趋势
  • 两个参数:alpha(水平)、beta(趋势)
  • 最适用于:趋势性需求
from statsmodels.tsa.holtwinters import Holt

def holts_method(data, alpha=0.8, beta=0.2):
    """Holt's linear trend method"""
    model = Holt(data)
    fitted = model.fit(smoothing_level=alpha, smoothing_trend=beta)
    return fitted

Holt-Winters 季节性

  • 捕捉水平 + 趋势 + 季节性
  • 加法或乘法季节性
  • 最适用于:季节性需求模式
from statsmodels.tsa.holtwinters import ExponentialSmoothing

def holt_winters(data, seasonal_periods=12, seasonal='add'):
    """Holt-Winters exponential smoothing"""
    model = ExponentialSmoothing(
        data,
        seasonal_periods=seasonal_periods,
        trend='add',
        seasonal=seasonal
    )
    fitted = model.fit()
    return fitted

# Forecast future periods
forecast = fitted.forecast(steps=6)

ARIMA 模型

  • 自回归差分移动平均
  • 参数:p(AR)、d(差分)、q(MA)
  • 最适用于:复杂时间序列模式
from statsmodels.tsa.arima.model import ARIMA

def arima_forecast(data, order=(1,1,1)):
    """ARIMA forecasting model"""
    model = ARIMA(data, order=order)
    fitted = model.fit()
    return fitted

# Auto ARIMA for parameter selection
from pmdarima import auto_arima
auto_model = auto_arima(data, seasonal=True, m=12)
因果/回归方法

带特征的线性回归

  • 纳入外部变量
  • 价格、促销、节假日、天气等
from sklearn.linear_model import LinearRegression
import pandas as pd

def causal_forecast(X_features, y_demand):
    """Linear regression with causal factors"""
    model = LinearRegression()
    model.fit(X_features, y_demand)
    return model

# Example features
features = pd.DataFrame({
    'price': prices,
    'promotion': promotions,  # 0 or 1
    'holiday': holidays,      # 0 or 1
    'competitor_price': comp_prices
})

多元线性回归

  • 多个自变量
  • 特征工程至关重要
机器学习方法

随机森林

  • 决策树集成
  • 可处理非线性关系
  • 分析特征重要性
from sklearn.ensemble import RandomForestRegressor

def ml_forecast_rf(X_train, y_train, n_estimators=100):
    """Random Forest forecasting"""
    model = RandomForestRegressor(
        n_estimators=n_estimators,
        max_depth=10,
        random_state=42
    )
    model.fit(X_train, y_train)
    return model

# Feature importance
importances = model.feature_importances_

梯度提升(XGBoost、LightGBM)

  • 顺序集成学习
  • 通常性能最佳
  • 需要调优
import xgboost as xgb

def ml_forecast_xgb(X_train, y_train):
    """XGBoost forecasting"""
    model = xgb.XGBRegressor(
        objective='reg:squarederror',
        n_estimators=100,
        learning_rate=0.1,
        max_depth=6
    )
    model.fit(X_train, y_train)
    return model

神经网络(LSTM)

  • 用于序列的深度学习
  • 可捕捉复杂模式
  • 需要更多数据
from tensorflow import keras
from keras.models import Sequential
from keras.layers import LSTM, Dense

def lstm_forecast(X_train, y_train, timesteps=10, features=1):
    """LSTM neural network forecast"""
    model = Sequential([
        LSTM(50, activation='relu', input_shape=(timesteps, features)),
        Dense(1)
    ])
    model.compile(optimizer='adam', loss='mse')
    model.fit(X_train, y_train, epochs=50, batch_size=32)
    return model

Prophet(Facebook)

  • 可处理季节性、节假日和趋势
  • 易于使用,对缺失数据具有较强鲁棒性
  • 适用于业务时间序列
from prophet import Prophet

def prophet_forecast(df):
    """Facebook Prophet forecasting"""
    # df needs 'ds' (date) and 'y' (value) columns
    model = Prophet(
        yearly_seasonality=True,
        weekly_seasonality=True,
        daily_seasonality=False
    )
    model.fit(df)

    # Make future dataframe
    future = model.make_future_dataframe(periods=90)
    forecast = model.predict(future)

    return model, forecast
间歇性需求方法

Croston 方法

  • 适用于零星需求
  • 分别预测需求量和需求间隔
import numpy as np

def crostons_method(demand, alpha=0.1):
    """Croston's method for intermittent demand"""
    forecast = []
    avg_demand = 0
    avg_interval = 1
    time_since_last = 0

    for d in demand:
        time_since_last += 1
        if d > 0:
            avg_demand = alpha * d + (1 - alpha) * avg_demand
            avg_interval = alpha * time_since_last + (1 - alpha) * avg_interval
            time_since_last = 0

        forecast.append(avg_demand / avg_interval if avg_interval > 0 else 0)

    return forecast

TSB(Teunter-Syntetos-Babai)

  • 改进版 Croston 方法
  • 无偏估计

自助抽样

  • 对历史需求进行重采样
  • 生成需求分布

预测准确度指标

关键指标

MAD(平均绝对偏差)

def mad(actual, forecast):
    """Mean Absolute Deviation"""
    return np.mean(np.abs(actual - forecast))

MAPE(平均绝对百分比误差)

def mape(actual, forecast):
    """Mean Absolute Percentage Error"""
    return np.mean(np.abs((actual - forecast) / actual)) * 100

RMSE(均方根误差)

def rmse(actual, forecast):
    """Root Mean Square Error"""
    return np.sqrt(np.mean((actual - forecast) ** 2))

Bias(预测偏差)

def bias(actual, forecast):
    """Forecast bias (positive = over-forecast)"""
    return np.mean(forecast - actual)

跟踪信号

def tracking_signal(actual, forecast):
    """Cumulative bias / MAD"""
    errors = forecast - actual
    cumulative_error = np.cumsum(errors)
    mad_value = np.mean(np.abs(errors))
    return cumulative_error / mad_value if mad_value > 0 else 0
按产品类别划分的目标准确率
类别目标 MAPE备注
A 类商品(高销量)15-25%最严格的控制
B 类商品(中等销量)25-40%中等
C 类商品(低销量)40-60%容许范围较宽
新产品50-80%不确定性高
促销商品30-50%取决于活动

需求细分

ABC 分析

分类:

  • A 类商品:排名前 20% 的 SKU,占营收的 80% → 每日/每周预测,严格控制
  • B 类商品:接下来的 30% SKU,占营收的 15% → 每周/每月预测
  • C 类商品:排名后 50% 的 SKU,占营收的 5% → 每月预测,采用更简单的方法

XYZ 分析(变异性):

  • X:低变异性(CV < 0.5)→ 更容易预测
  • Y:中等变异性(0.5 < CV < 1.0)→ 难度适中
  • Z:高变异性(CV > 1.0)→ 难以预测,需求间歇性强

ABC-XYZ 综合矩阵:

A(高价值)B(中等)C(低价值)
X严格控制,采用高级方法标准方法简单方法
Y高级方法 + 安全库存标准方法简单方法/汇总预测
ZML/因果分析 + 高安全库存Croston 方法最小/最大库存策略或不备货

预测流程

1. 数据准备

数据清理:

  • 移除异常值(退货、一次性订单)
  • 处理缺失值
  • 识别并分离促销期间
  • 针对缺货情况进行调整(需求被截断)
# Remove outliers using IQR method
Q1 = df['demand'].quantile(0.25)
Q3 = df['demand'].quantile(0.75)
IQR = Q3 - Q1
df_clean = df[~((df['demand'] < (Q1 - 1.5 * IQR)) |
                 (df['demand'] > (Q3 + 1.5 * IQR)))]

特征工程:

  • 滞后特征(前几个期间的数据)
  • 滚动统计量(移动平均值、标准差)
  • 日历特征(星期几、月份、节假日)
  • 促销指标
  • 价格特征
# Create time-based features
df['month'] = df['date'].dt.month
df['day_of_week'] = df['date'].dt.dayofweek
df['is_weekend'] = df['day_of_week'].isin([5, 6]).astype(int)
df['is_holiday'] = df['date'].isin(holidays).astype(int)

# Lag features
df['lag_1'] = df['demand'].shift(1)
df['lag_7'] = df['demand'].shift(7)
df['rolling_mean_7'] = df['demand'].rolling(7).mean()
2. 模型选择

决策树:

Start
 ├─ Intermittent demand (many zeros)?
 │   └─ Yes → Croston's, TSB, or aggregate
 │   └─ No → Continue
 ├─ Strong seasonality?
 │   └─ Yes → Holt-Winters, SARIMA, or Prophet
 │   └─ No → Continue
 ├─ Trend present?
 │   └─ Yes → Holt's trend, ARIMA
 │   └─ No → Continue
 ├─ External factors available?
 │   └─ Yes → Regression, ML models
 │   └─ No → Simple smoothing
 └─ Default: Exponential smoothing or Moving Average
3. 生成基线预测

统计预测:

  • 运行选定的模型
  • 生成点预测
  • 计算预测区间(80%、95%)
# Generate forecast with confidence intervals
forecast = model.forecast(steps=12)
conf_int = model.forecast_interval(steps=12, alpha=0.05)  # 95% CI
4. 丰富预测信息

加入业务情报:

  • 已知的即将开展的促销活动
  • 新产品上市
  • 市场趋势
  • 竞争对手行动
  • 经济指标
5. 协作审查

预测调整流程:

  • 销售团队提供意见
  • 审查营销日历
  • 与财务部门协调
  • 基于例外情况进行审查(A 类商品、大幅变更)
6. 共识预测

加权组合:

# Combine statistical and judgmental
final_forecast = (
    0.7 * statistical_forecast +
    0.3 * sales_team_forecast
)
7. 跟踪绩效

监控指标:

  • 每周/每月准确率审查
  • 跟踪偏差
  • 预测增值(FVA)
  • 预测值与实际值的可视化对比

高级技术

层级预测

自顶向下:

  • 在汇总层级进行预测
  • 按比例分配到更低层级

自底向上:

  • 在最低层级(SKU-地点)进行预测
  • 汇总至更高层级

中间向外:

  • 在中间层级进行预测
  • 向上和向下协调

最优协调:

  • MinT(最小迹)
  • 确保层级结构中的预测保持一致
from hierarchicalforecast.utils import aggregate
from hierarchicalforecast.methods import BottomUp, TopDown, MinTrace

# Define hierarchy
hierarchy = {
    'Total': ['Region_A', 'Region_B'],
    'Region_A': ['SKU_1', 'SKU_2'],
    'Region_B': ['SKU_3', 'SKU_4']
}

# Reconcile forecasts
reconciled = MinTrace().fit_predict(forecasts, hierarchy)
预测增值(FVA)

概念:

  • 衡量人工调整是否提升或降低准确率
  • 比较调整后的预测与基线预测
def forecast_value_added(actual, baseline_fcst, adjusted_fcst):
    """Calculate if adjustments added value"""
    baseline_error = np.abs(actual - baseline_fcst)
    adjusted_error = np.abs(actual - adjusted_fcst)

    fva = baseline_error - adjusted_error
    # Positive FVA = adjustment improved forecast
    return fva
需求感知

实时信号:

  • POS 数据(实际消费量)
  • 仓库出库量
  • 网络流量、搜索趋势
  • 社交媒体情绪
  • 天气预报

短期调整:

  • 每周或每日更新预测
  • 使用最新信号
  • 与统计预测结合

工具和库

Python 库

统计预测:

  • statsmodels:ARIMA、指数平滑、季节分解
  • pmdarima:Auto ARIMA
  • prophet:Facebook Prophet
  • sktime:时间序列机器学习

机器学习:

  • scikit-learn:回归、基于树的模型
  • xgboost、lightgbm:梯度提升
  • tensorflow、pytorch:深度学习(LSTM、transformer)

实用工具:

  • pandas:数据处理
  • numpy:数值计算
  • matplotlib、seaborn、plotly:可视化
商业软件
  • SAP IBP:集成业务规划
  • Oracle Demantra:需求管理
  • Blue Yonder (JDA):需求规划
  • Kinaxis RapidResponse:S&OP 平台
  • Anaplan:云规划平台
  • o9 Solutions:AI 驱动的规划
Excel 加载项
  • Forecast Pro:统计预测
  • SAS Forecast Server:企业级预测
  • Lokad:概率预测

常见挑战与解决方案

挑战:预测波动性高

解决方案:

  • 将需求划分为基线需求和促销需求
  • 使用分层预测(汇总后更稳定)
  • 提高预测频率
  • 实施最小值/最大值规则或平滑处理
挑战:新产品预测

解决方案:

  • 采用类似产品/参考产品方法
  • 开展市场调研和试销
  • 利用品类层面的趋势
  • 采用渐进式爬坡曲线
  • 密切监控并快速调整
挑战:促销预测

解决方案:

  • 将基线需求与提升量分开
  • 建立促销数据库(过往活动)
  • 使用包含促销特征的回归模型
  • 与市场营销/销售部门协作
  • 活动结束后进行分析以改进预测
挑战:长尾/间歇性需求

解决方案:

  • 汇总到更高层级(产品系列)
  • 使用 Croston 或 TSB 方法
  • 进行概率预测(使用分布)
  • 设置库存最小值/最大值规则
  • 考虑不备货(按需订购)
挑战:数据质量问题

解决方案:

  • 清理历史数据(剔除异常值、缺货数据)
  • 实施数据治理
  • 验证输入(范围检查、异常检测)
  • 定期进行数据审计
挑战:预测偏差

解决方案:

  • 跟踪偏差指标
  • 审查激励机制(销售团队经常过度预测)
  • 分开职责(预测与目标)
  • 使用无偏的统计基线
  • 进行预测增值分析

输出格式

预测报告结构

执行摘要:

  • 整体预测准确率(当前期间)
  • 与上一版预测相比的主要变化
  • 主要假设和风险

按细分项划分的需求预测:

产品/SKU地点期间统计预测调整后预测实际值(上一期)MAPE偏差
Product ADC1Jan 202510,00010,5009,8007.1%+7.1%
........................

预测假设:

  • 促销日历
  • 市场趋势
  • 新产品发布
  • 已知的供应限制

准确率指标:

  • 按品类划分的 MAPE
  • 偏差分析
  • 跟踪信号
  • 预测与实际值图表

行动项:

  • 需要审核的项目
  • 需要进行的预测覆盖调整
  • 数据质量问题
  • 流程改进

要提出的问题

如果需要更多背景信息:

  1. 需要预测哪些产品/SKU?需要什么粒度?
  2. 规划周期有多长?(周、月、年)
  3. 有多少历史数据可用?
  4. 哪些外部因素会影响需求?(促销、季节性、事件)
  5. 当前预测准确率如何?已知问题有哪些?
  6. 正在使用哪些工具/系统?
  7. 谁会使用这些预测?用于做出哪些决策?

相关技能

  • sales-operations-planning:用于将预测整合到 S&OP 中
  • capacity-planning:用于基于预测规划生产产能
  • inventory-optimization:用于设置安全库存和再订货点
  • supply-chain-analytics:用于 KPI 和绩效跟踪
  • ml-supply-chain:用于高级机器学习预测技术
  • seasonal-planning:用于零售季节性需求
  • promotional-planning:用于 CPG 促销预测

评论

支持 Markdown