Simple Moving Average (简单移动平均)讲解
前言
继上一篇Exponential Smoothing之后,这次笔者继续介绍另一种基础且常见的时间序列预测方法 —— 简单移动平均(Simple Moving Average,简称 SMA)。
SMA 是我在读研期间最早接触到的预测方法之一。相比指数平滑,SMA 的概念更加直观、实现更加简单。它虽然没有权重衰减机制,但通过“滑动窗口”平均处理,也能很好地揭示数据的整体趋势。
1. 什么是 Simple Moving Average?
Simple Moving Average(SMA,简单移动平均) 是一种基础的时间序列平滑方法,通过计算一段时间内数据的平均值,来反映当前的趋势。
它的思想非常直观:把最近一段时间的数据加总后取平均,平滑掉短期波动,揭示长期趋势。
例如,对于一组每日销售数据,若我们希望用最近3天的数据作为今天的预测值,就可以用 SMA。
与指数平滑(Exponential Smoothing)相比,SMA 权重均匀,对突变不够敏感,但更加稳定、计算也更简单。
2. SMA 的基本原理与计算公式
SMA 的核心计算公式如下:
S t = 1 w ∑ i = t − w + 1 t A i S_t = \frac{1}{w} \sum_{i=t-w+1}^t A_i St=w1i=t−w+1∑tAi
其中:
- S t S_t St:表示第 t t t 时刻的预测值(或平滑值)
- A i A_i Ai:第 i i i 个时刻的实际观测值
- w w w:窗口大小,即平均计算的时间跨度(如 3 天、5 天等)
直观解释:每次向前滑动一个单位,就丢掉最早的值,加入最新的值,形成新的平均数。
3. 窗口大小的选择与影响
窗口大小 w w w 是 SMA 中最关键的超参数,决定了模型对新数据的反应速度:
窗口大小 | 平滑效果 | 对变化反应 |
---|---|---|
小(如3) | 较弱 | 更灵敏 |
大(如7) | 更强 | 更迟钝 |
建议:
- 如果数据波动较大且我们关心“最新走势”,可以使用较小窗口;
- 如果希望整体趋势更平稳,则适当增大窗口。
4. SMA 的优缺点
✅ 优点
- 简单易懂:无需复杂参数,公式直观明了;
- 稳定性强:适合消除高频噪声,体现长期趋势;
- 计算代价低:实现成本低,适用于实时系统。
❌ 缺点
- 对突变反应慢:无法及时捕捉快速上升或下降;
- 权重固定:对窗口内的每个数据赋予相同权重,可能不符合实际情形;
- 不能外推未来多个点:只适合一阶预测。
5. 应用场景举例
- 股票/基金的技术分析(如5日、10日均线)
- 日常销售量/流量趋势判断
- 传感器数据降噪(例如温度、压力等)
- 简单的实时业务监控指标平滑处理
SMA 虽然简单,但在很多商业系统、初步数据分析场景中,依然发挥着重要作用。
6. 小实例:用 Python 实现 SMA
假设我们有以下观测数据:
观测值 A = [50, 52, 53, 54, 55, 56, 60]
窗口大小 w = 3
从第3个数据点开始,每次取最近3个值求平均:
S3 = (50 + 52 + 53) / 3 = 51.67
S4 = (52 + 53 + 54) / 3 = 53.00
S5 = (53 + 54 + 55) / 3 = 54.00
S6 = (54 + 55 + 56) / 3 = 55.00
S7 = (55 + 56 + 60) / 3 = 57.00
Python实现:
def simple_moving_average(series, window):
sma = []
for i in range(window - 1, len(series)):
window_values = series[i - window + 1:i + 1]
sma.append(sum(window_values) / window)
return sma
# 示例数据
A = [50, 52, 53, 54, 55, 56, 60]
window = 3
print(simple_moving_average(A, window))
输出结果:
[51.67, 53.0, 54.0, 55.0, 57.0]
7. 总结
- SMA 是最经典也最容易上手的平滑预测方法之一;
- 适用于平稳且对实时性要求不高的场景;
- 可作为学习和实际项目中的“第一步工具”,打好预测基础。
希望这篇笔记对你有所帮助。作为一名正在读研的学生,我也在慢慢学习一些基础或进阶的时序预测方法。未来还会陆续更新包括加权移动平均、Holt 指数平滑、ARIMA 等更多基础或进阶的时间序列预测方法。如果你也正在学习这方面内容,欢迎一起交流探讨,一起进步!