
如何高效爬取全球新闻网站 – 整合Scrapy、Selenium与Mediastack API实现自动化新闻采集
移动平均(Moving Average,简称MA)其实就是一种「平滑」数据的方法。你可以把它想象成,通过取一段时间内的数据平均值,来让这些数据看起来不那么波动,这样可以帮助我们看到数据的整体趋势,而不是被某些极端数值(比如突然的高峰或低谷)干扰。
假设你是一个小卖部老板,你想了解过去几天的饮料销量,看看销量的趋势。以下是你过去 5 天的销量:
如果你想知道这些销量的趋势,但不想让某一天的波动影响你的判断,你可以使用「移动平均」。
「简单移动平均」是最常见的移动平均类型。假如你想通过「3 天的移动平均」来观察销量的趋势,那么你要做的就是把最近 3 天的销量求平均值,然后不断地向前滑动计算。
这样,咱们现在就得到了三个新的数值,分别是:12.33、13.67 和 14.00。通过这些移动平均值,你可以看出销量的趋势是逐渐上升的,因为数值变得越来越高,且这些平均数比单纯的原始数据更平滑,更容易看出大致的走势。
假设你正在观察股票价格,股票价格每天都会有起伏,但你不想被这些波动迷惑,想看整体的价格趋势。那么,你就可以使用 5 天或 10 天的移动平均线,这样你可以更清晰地看到股价的长期变化,而不是短期的涨跌。
总结起来,移动平均就是把数据平均化,让你看得更清楚更稳健,它帮你过滤掉那些短期的波动,抓住数据的主要趋势。
现在,大家对移动平均的理解应该是很清晰了。
下面,咱们从原理和案例详细和大家聊聊~
加权移动平均会对不同时间点的数据赋予不同的权重。加权移动平均的公式为:
指数移动平均更注重近期的数据,它通过指数衰减的方式给数据赋予权重。公式为:
这里使用 Python 编写一个简单的代码来展示三种移动平均(SMA、WMA 和 EMA)的原理。
我们生成一组波动较大的模拟数据,假设这是股票价格的变化,数据点的数量为 100。我们将用 5 天的窗口来进行简单移动平均、加权移动平均和指数移动平均的计算。
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)是如何帮助我们平滑时间序列数据的:
这些工具可以用于金融数据、天气预报等领域的趋势分析,希望对大家有帮助。