📦 移动平均法 简单 · 加权 · Python实现

📚 数据驱动库存补货决策 · 第4讲 🎯 核心平滑预测
📌 简单移动平均 vs 加权移动平均

🧮 简单移动平均 (SMA)

将最近 n 期历史需求赋予相同权重,适合平稳序列。

  • 公式 \( SMA_t = \frac{D_{t-1}+D_{t-2}+...+D_{t-n}}{n} \)
  • 📆 周期选择:n=3,4,5 常见(库存周转较快)
  • ⚖️ 每个数据点权重 = 1/n
  • 📉 滞后性随 n 增大而增加

⚡ 加权移动平均 (WMA)

对近期数据赋予更高权重,更灵敏反映趋势变化。

  • 公式 \( WMA_t = w_1 D_{t-1} + w_2 D_{t-2} + ... + w_n D_{t-n} \)
  • 📊 权重通常满足 \( \sum w_i = 1 \),且 \( w_1 \ge w_2 \ge ... \)
  • 🎯 常用线性递增权重 (如 n=3: 0.5, 0.3, 0.2)
  • 🚀 对需求突变响应更快
📊 实例:周补货数据对比
周次实际需求SMA(3) 预测WMA(3) 预测 (0.5,0.3,0.2)误差 (SMA)误差 (WMA)
1120————
2135————
3110————
4145121.7124.023.321.0
5130130.0133.50.03.5
6155128.3131.026.724.0
7148143.3145.54.72.5
8170144.3147.125.722.9

🔎 WMA 对第8周上升需求反应略快,误差稍低。

🐍 Python 实现与可视化
import numpy as np
import matplotlib.pyplot as plt

# 历史需求数据 (周)
demand = np.array([120, 135, 110, 145, 130, 155, 148, 170])

# ----- 简单移动平均 (n=3) -----
def simple_moving_average(data, n):
    sma = np.full(len(data), np.nan)
    for i in range(n-1, len(data)):
        sma[i] = np.mean(data[i-n+1:i+1])
    return sma

sma_3 = simple_moving_average(demand, 3)

# ----- 加权移动平均 (n=3, 权重 0.5, 0.3, 0.2) -----
weights = np.array([0.5, 0.3, 0.2])
def weighted_moving_average(data, n, w):
    wma = np.full(len(data), np.nan)
    for i in range(n-1, len(data)):
        wma[i] = np.dot(data[i-n+1:i+1], w)
    return wma

wma_3 = weighted_moving_average(demand, 3, weights)

# 输出预测值 (第4周起)
print("SMA(3):", sma_3[2:])
print("WMA(3):", wma_3[2:])
1 2 3 4 5 6 7 8 实际需求 SMA(3) WMA(3) 📈 移动平均法预测对比 (库存补货示例)

⬆️ 橙色虚线 = SMA(3) ,紫色点虚线 = WMA(3) ,对第8周上升趋势WMA更贴近。

🧩 库存补货决策流程 · 移动平均模块
📦 历史需求 📐 移动平均 SMA / WMA 计算 📋 补货量 ↺ 滚动更新 (每次补货后加入新需求)
🎯 库存补货场景建议

✅ 简单移动平均适用

  • 需求稳定、无明显趋势/季节
  • 安全库存充足,允许一定滞后
  • 计算简单,适合快速部署

⚡ 加权移动平均适用

  • 近期需求更具代表性 (促销/趋势)
  • 希望更快响应需求变化
  • 可结合专家权重调整

🐍 Python 实现要点

  • 使用 numpy.convolve 加速
  • 注意边界值 (NaN 处理)
  • 可视化用 matplotlib 或 plotly