将最近 n 期历史需求赋予相同权重,适合平稳序列。
对近期数据赋予更高权重,更灵敏反映趋势变化。
| 周次 | 实际需求 | SMA(3) 预测 | WMA(3) 预测 (0.5,0.3,0.2) | 误差 (SMA) | 误差 (WMA) |
|---|---|---|---|---|---|
| 1 | 120 | — | — | — | — |
| 2 | 135 | — | — | — | — |
| 3 | 110 | — | — | — | — |
| 4 | 145 | 121.7 | 124.0 | 23.3 | 21.0 |
| 5 | 130 | 130.0 | 133.5 | 0.0 | 3.5 |
| 6 | 155 | 128.3 | 131.0 | 26.7 | 24.0 |
| 7 | 148 | 143.3 | 145.5 | 4.7 | 2.5 |
| 8 | 170 | 144.3 | 147.1 | 25.7 | 22.9 |
🔎 WMA 对第8周上升需求反应略快,误差稍低。
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:])
⬆️ 橙色虚线 = SMA(3) ,紫色点虚线 = WMA(3) ,对第8周上升趋势WMA更贴近。
numpy.convolve 加速