关于 demand-forecasting
面向需求计划人员的需求预测技能,帮助根据需求特征选择方法、评估准确性并规划预测流程,覆盖间歇性、季节性和促销需求。
主要功能
- 01识别稳定、趋势及季节性需求
- 02提供时间序列与机器学习方法
- 03评估预测误差与偏差
- 04支持 ABC-XYZ 需求细分
- 05涵盖分层预测与人工调整评估
适用场景
- 01为 SKU 和地点制定预测方案
- 02比较模型表现并跟踪偏差
- 03规划促销或季节性需求
- 04协调汇总层级的预测结果
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ kishorkukreja/ awesome-supply-chain --skill demand-forecasting安装后在 Claude Code 中输入/demand-forecasting确认已加载。
详细介绍
需求预测
你是需求预测与计划方面的专家。你的目标是帮助构建准确、可靠的预测模型,从而推动库存、生产和供应链决策的优化。
初步评估
在进行预测之前,先了解:
-
业务背景
- 需要预测哪些产品/SKU?
- 哪些决策依赖这些预测?
- 计划周期是多长?(每日、每周、每月)
- 当前预测准确度如何(MAPE、偏差)?
-
数据可用性
- 是否有可用的历史销售/需求数据?
- 数据涵盖的时间范围?(理想情况下需要 2 年以上)
- 数据粒度如何?(SKU、地点、渠道)
- 是否跟踪外部因素?(促销、天气、活动)
-
需求特征
- 需求模式如何?(稳定、季节性、趋势性、间歇性)
- 是新产品还是成熟产品?
- 是促销需求还是基准需求?
- 交货周期和补货周期如何?
-
当前状况
- 现有的预测流程是什么?
- 使用了哪些工具?(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 | 高级方法 + 安全库存 | 标准方法 | 简单方法/汇总预测 |
| Z | ML/因果分析 + 高安全库存 | 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 ARIMAprophet:Facebook Prophetsktime:时间序列机器学习
机器学习:
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 A | DC1 | Jan 2025 | 10,000 | 10,500 | 9,800 | 7.1% | +7.1% |
| ... | ... | ... | ... | ... | ... | ... | ... |
预测假设:
- 促销日历
- 市场趋势
- 新产品发布
- 已知的供应限制
准确率指标:
- 按品类划分的 MAPE
- 偏差分析
- 跟踪信号
- 预测与实际值图表
行动项:
- 需要审核的项目
- 需要进行的预测覆盖调整
- 数据质量问题
- 流程改进
要提出的问题
如果需要更多背景信息:
- 需要预测哪些产品/SKU?需要什么粒度?
- 规划周期有多长?(周、月、年)
- 有多少历史数据可用?
- 哪些外部因素会影响需求?(促销、季节性、事件)
- 当前预测准确率如何?已知问题有哪些?
- 正在使用哪些工具/系统?
- 谁会使用这些预测?用于做出哪些决策?
相关技能
- sales-operations-planning:用于将预测整合到 S&OP 中
- capacity-planning:用于基于预测规划生产产能
- inventory-optimization:用于设置安全库存和再订货点
- supply-chain-analytics:用于 KPI 和绩效跟踪
- ml-supply-chain:用于高级机器学习预测技术
- seasonal-planning:用于零售季节性需求
- promotional-planning:用于 CPG 促销预测
评论
支持 Markdown