突破最强时间序列模型,移动平均!!

文摘   2024-10-24 16:36   北京  

哈喽,我是cos大壮!~

前几次给大家分享过关于时间序列模型几种常见的算法模型。

今儿给大家带来的事「时间序列模型」方面的移动平均算法~

今天我们要讲的「移动平均」是其中的一种简单但有效的方法。下面首先我会通过一个容易理解的例子来解释。

老规矩如果大家伙觉得近期文章还不错!欢迎大家点个赞、转个发,文末赠送《机器学习学习小册》

文末可取本文PDF版本~

什么是移动平均?

移动平均(Moving Average,简称MA)其实就是一种「平滑」数据的方法。你可以把它想象成,通过取一段时间内的数据平均值,来让这些数据看起来不那么波动,这样可以帮助我们看到数据的整体趋势,而不是被某些极端数值(比如突然的高峰或低谷)干扰。

比如:

假设你是一个小卖部老板,你想了解过去几天的饮料销量,看看销量的趋势。以下是你过去 5 天的销量:

  • 第 1 天:10 瓶
  • 第 2 天:12 瓶
  • 第 3 天:15 瓶
  • 第 4 天:14 瓶
  • 第 5 天:13 瓶

如果你想知道这些销量的趋势,但不想让某一天的波动影响你的判断,你可以使用「移动平均」。

简单移动平均(SMA)的例子

简单移动平均」是最常见的移动平均类型。假如你想通过「3 天的移动平均」来观察销量的趋势,那么你要做的就是把最近 3 天的销量求平均值,然后不断地向前滑动计算。

计算步骤:

  1. 前 3 天(第 1 天到第 3 天)的平均值:(10 + 12 + 15) ÷ 3 = 12.33
  2. 接下来 3 天(第 2 天到第 4 天)的平均值:(12 + 15 + 14) ÷ 3 = 13.67
  3. 再接下来 3 天(第 3 天到第 5 天)的平均值:(15 + 14 + 13) ÷ 3 = 14.00

这样,咱们现在就得到了三个新的数值,分别是:12.33、13.67 和 14.00。通过这些移动平均值,你可以看出销量的趋势是逐渐上升的,因为数值变得越来越高,且这些平均数比单纯的原始数据更平滑,更容易看出大致的走势。

移动平均的好处

  1. 去除噪音:原始数据有很多波动,比如某一天突然销量很高或很低,可能是某个特殊原因导致的。而移动平均可以帮助你忽略这些小波动,看到数据的整体趋势。
  2. 更容易做预测:当你想预测未来的销量时,移动平均能帮助你看清大致的变化方向,比如是上升还是下降。

一个简单例子

假设你正在观察股票价格,股票价格每天都会有起伏,但你不想被这些波动迷惑,想看整体的价格趋势。那么,你就可以使用 5 天或 10 天的移动平均线,这样你可以更清晰地看到股价的长期变化,而不是短期的涨跌。

总结起来,移动平均就是把数据平均化,让你看得更清楚更稳健,它帮你过滤掉那些短期的波动,抓住数据的主要趋势。

现在,大家对移动平均的理解应该是很清晰了。

下面,咱们从原理和案例详细和大家聊聊~

移动平均公式推导

1. 简单移动平均(SMA)的定义

简单移动平均是将前一段时间内的数据求平均。对于时间序列 ,设我们要计算窗口长度为  的简单移动平均,公式为:

其中, 是第  时刻的简单移动平均值,窗口大小为  意味着我们取过去  天的数据的平均值。

2. 加权移动平均(WMA)

加权移动平均会对不同时间点的数据赋予不同的权重。加权移动平均的公式为:

其中  是权重,通常 ,即最近的数据权重大。

3. 指数移动平均(EMA)

指数移动平均更注重近期的数据,它通过指数衰减的方式给数据赋予权重。公式为:

其中  是平滑因子,取值范围在 0 到 1 之间。常见的计算方法是 ,其中  是窗口大小。

完整案例

这里使用 Python 编写一个简单的代码来展示三种移动平均(SMA、WMA 和 EMA)的原理。

步骤:

  1. 生成一组时间序列数据,作为我们的原始数据。
  2. 计算三种移动平均(SMA、WMA 和 EMA)。
  3. 绘制多个图形,展示原始数据与移动平均的关系。

数据生成与分析

我们生成一组波动较大的模拟数据,假设这是股票价格的变化,数据点的数量为 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(010, 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=(1410))

# 1. 图 1:原始数据
plt.subplot(221)
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(222)
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(223)
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(224)
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 采用指数平滑方式,对趋势的快速变化最为敏感。

这些工具可以用于金融数据、天气预报等领域的趋势分析,希望对大家有帮助。

最后

大家有问题可以直接在评论区留言即可~

喜欢本文的朋友可收藏、点赞、转发起来!

需要本文PDF的同学,扫码备注「基础算法」即可~ 
关注本号,带来更多算法干货实例,提升工作学习效率!
最后,给大家准备了《机器学习学习小册》PDF版本16大块的内容,124个问题总结
100个超强算法模型,大家如果觉得有用,可以点击查看~

推荐阅读

原创、超强、精华合集
100个超强机器学习算法模型汇总
机器学习全路线
机器学习各个算法的优缺点
7大方面,30个最强数据集
6大部分,20 个机器学习算法全面汇总
铁汁,都到这了,别忘记点赞呀~

深夜努力写Python
Python、机器学习算法
 最新文章