哈喽,我是cos大壮!~
前几次给大家分享过关于时间序列模型几种常见的算法模型。
今儿给大家带来的事「时间序列模型」方面的移动平均算法~
今天我们要讲的「移动平均」是其中的一种简单但有效的方法。下面首先我会通过一个容易理解的例子来解释。
文末可取本文PDF版本~
什么是移动平均?
移动平均(Moving Average,简称MA)其实就是一种「平滑」数据的方法。你可以把它想象成,通过取一段时间内的数据平均值,来让这些数据看起来不那么波动,这样可以帮助我们看到数据的整体趋势,而不是被某些极端数值(比如突然的高峰或低谷)干扰。
比如:
假设你是一个小卖部老板,你想了解过去几天的饮料销量,看看销量的趋势。以下是你过去 5 天的销量:
第 1 天:10 瓶 第 2 天:12 瓶 第 3 天:15 瓶 第 4 天:14 瓶 第 5 天:13 瓶
如果你想知道这些销量的趋势,但不想让某一天的波动影响你的判断,你可以使用「移动平均」。
简单移动平均(SMA)的例子
「简单移动平均」是最常见的移动平均类型。假如你想通过「3 天的移动平均」来观察销量的趋势,那么你要做的就是把最近 3 天的销量求平均值,然后不断地向前滑动计算。
计算步骤:
前 3 天(第 1 天到第 3 天)的平均值:(10 + 12 + 15) ÷ 3 = 12.33 接下来 3 天(第 2 天到第 4 天)的平均值:(12 + 15 + 14) ÷ 3 = 13.67 再接下来 3 天(第 3 天到第 5 天)的平均值:(15 + 14 + 13) ÷ 3 = 14.00
这样,咱们现在就得到了三个新的数值,分别是:12.33、13.67 和 14.00。通过这些移动平均值,你可以看出销量的趋势是逐渐上升的,因为数值变得越来越高,且这些平均数比单纯的原始数据更平滑,更容易看出大致的走势。
移动平均的好处
去除噪音:原始数据有很多波动,比如某一天突然销量很高或很低,可能是某个特殊原因导致的。而移动平均可以帮助你忽略这些小波动,看到数据的整体趋势。 更容易做预测:当你想预测未来的销量时,移动平均能帮助你看清大致的变化方向,比如是上升还是下降。
一个简单例子
假设你正在观察股票价格,股票价格每天都会有起伏,但你不想被这些波动迷惑,想看整体的价格趋势。那么,你就可以使用 5 天或 10 天的移动平均线,这样你可以更清晰地看到股价的长期变化,而不是短期的涨跌。
总结起来,移动平均就是把数据平均化,让你看得更清楚更稳健,它帮你过滤掉那些短期的波动,抓住数据的主要趋势。
现在,大家对移动平均的理解应该是很清晰了。
下面,咱们从原理和案例详细和大家聊聊~
移动平均公式推导
1. 简单移动平均(SMA)的定义
简单移动平均是将前一段时间内的数据求平均。对于时间序列 ,设我们要计算窗口长度为 的简单移动平均,公式为:
其中, 是第 时刻的简单移动平均值,窗口大小为 意味着我们取过去 天的数据的平均值。
2. 加权移动平均(WMA)
加权移动平均会对不同时间点的数据赋予不同的权重。加权移动平均的公式为:
其中 是权重,通常 ,即最近的数据权重大。
3. 指数移动平均(EMA)
指数移动平均更注重近期的数据,它通过指数衰减的方式给数据赋予权重。公式为:
其中 是平滑因子,取值范围在 0 到 1 之间。常见的计算方法是 ,其中 是窗口大小。
完整案例
这里使用 Python 编写一个简单的代码来展示三种移动平均(SMA、WMA 和 EMA)的原理。
步骤:
生成一组时间序列数据,作为我们的原始数据。 计算三种移动平均(SMA、WMA 和 EMA)。 绘制多个图形,展示原始数据与移动平均的关系。
数据生成与分析
我们生成一组波动较大的模拟数据,假设这是股票价格的变化,数据点的数量为 100。我们将用 5 天的窗口来进行简单移动平均、加权移动平均和指数移动平均的计算。
分析图形:
图 1:原始时间序列数据。 图 2:原始数据与简单移动平均(SMA)的对比,展示平滑效果。 图 3:原始数据与加权移动平均(WMA)的对比,展示加权的影响。 图 4:原始数据与指数移动平均(EMA)的对比,展示指数衰减的平滑效果。
代码实现
import numpy as np
import matplotlib.pyplot as plt
# 1. 生成模拟时间序列数据(100个数据点,波动较大)
np.random.seed(42)
days = 100
data = np.random.normal(loc=50, scale=10, size=days) + np.sin(np.linspace(0, 10, days)) * 10
# 2. 简单移动平均(SMA)
def simple_moving_average(data, window):
sma = np.convolve(data, np.ones(window)/window, mode='valid')
return sma
# 3. 加权移动平均(WMA)
def weighted_moving_average(data, window):
weights = np.arange(1, window+1)
wma = np.convolve(data, weights/weights.sum(), mode='valid')
return wma
# 4. 指数移动平均(EMA)
def exponential_moving_average(data, alpha):
ema = np.zeros_like(data)
ema[0] = data[0] # 初始值
for t in range(1, len(data)):
ema[t] = alpha * data[t] + (1 - alpha) * ema[t - 1]
return ema
# 计算平滑参数
window = 5
alpha = 2 / (window + 1)
# 计算 SMA、WMA 和 EMA
sma = simple_moving_average(data, window)
wma = weighted_moving_average(data, window)
ema = exponential_moving_average(data, alpha)
# 绘图设置
plt.figure(figsize=(14, 10))
# 1. 图 1:原始数据
plt.subplot(2, 2, 1)
plt.plot(data, label='Original Data', color='blue')
plt.title('Original Time Series')
plt.xlabel('Day')
plt.ylabel('Value')
plt.legend()
# 2. 图 2:SMA 与原始数据对比
plt.subplot(2, 2, 2)
plt.plot(data, label='Original Data', color='lightblue')
plt.plot(range(window-1, len(sma)+window-1), sma, label=f'SMA (window={window})', color='red')
plt.title('Simple Moving Average (SMA)')
plt.xlabel('Day')
plt.ylabel('Value')
plt.legend()
# 3. 图 3:WMA 与原始数据对比
plt.subplot(2, 2, 3)
plt.plot(data, label='Original Data', color='lightblue')
plt.plot(range(window-1, len(wma)+window-1), wma, label=f'WMA (window={window})', color='green')
plt.title('Weighted Moving Average (WMA)')
plt.xlabel('Day')
plt.ylabel('Value')
plt.legend()
# 4. 图 4:EMA 与原始数据对比
plt.subplot(2, 2, 4)
plt.plot(data, label='Original Data', color='lightblue')
plt.plot(ema, label=f'EMA (alpha={alpha:.2f})', color='orange')
plt.title('Exponential Moving Average (EMA)')
plt.xlabel('Day')
plt.ylabel('Value')
plt.legend()
plt.tight_layout()
plt.show()
图 1:展示了原始的时间序列数据。你可以看到,这些数据波动较大,有很多噪音和不规律的上下波动。
图 2:展示了简单移动平均(SMA) 和原始数据的对比。SMA 平滑了原始数据,将短期波动抹平,因此趋势更加清晰,但它对所有数据点的权重是相等的。
图 3:展示了加权移动平均(WMA) 和原始数据的对比。相比于 SMA,WMA 更强调近期数据的影响,所以它对新数据的反应更快,波动也比 SMA 更小。
图 4:展示了指数移动平均(EMA) 和原始数据的对比。EMA 通过指数平滑对数据进行处理,近期数据的影响最大,EMA 对趋势的反应速度比 SMA 和 WMA 都更快。
通过这个案例,我们可以看到三种移动平均(SMA、WMA、EMA)是如何帮助我们平滑时间序列数据的:
SMA 更加平滑,但响应慢。 WMA 通过权重分配提高了对新数据的敏感度。 EMA 采用指数平滑方式,对趋势的快速变化最为敏感。
这些工具可以用于金融数据、天气预报等领域的趋势分析,希望对大家有帮助。
最后
大家有问题可以直接在评论区留言即可~
喜欢本文的朋友可以收藏、点赞、转发起来!
推荐阅读
原创、超强、精华合集 100个超强机器学习算法模型汇总 机器学习全路线 机器学习各个算法的优缺点 7大方面,30个最强数据集 6大部分,20 个机器学习算法全面汇总 铁汁,都到这了,别忘记点赞呀~