移动平均法
定义
移动平均法(Moving Average Method)是一种时间序列分析方法,用于平滑数据波动,去除噪声,以便更好地识别趋势。它主要用于预测、技术分析和信号处理。
公式
简单移动平均 (Simple Moving Average, SMA) :
其中:
- SMAt 表示时间 t 时刻的移动平均值
- Xt 表示时间 t 时刻的原始数据
- n 为窗口大小(即平均的周期数)
加权移动平均 (Weighted Moving Average, WMA) :
其中,权重 w 赋予较新的数据更大的影响力。
指数移动平均 (Exponential Moving Average, EMA) :
其中:
-
α 是平滑因子,通常计算为 α=2/(n+1)
-
是上一时刻的指数移动平均值
应用场景
- 股票市场分析:用于识别趋势、交易信号
- 需求预测:平滑销量数据,预测未来需求
- 传感器数据处理:减少短期波动,提高数据稳定性
- 工业质量控制:监测生产数据,识别异常
Python 示例代码
以下代码演示如何计算简单移动平均(SMA)、加权移动平均(WMA)和指数移动平均(EMA)。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 生成示例数据
np.random.seed(42)
data = np.random.randint(50, 100, 20) # 生成20个随机数,范围在50-100
dates = pd.date_range(start="2024-01-01", periods=len(data), freq='D')
df = pd.DataFrame({'Date': dates, 'Value': data})
df.set_index('Date', inplace=True)
# 计算简单移动平均(SMA)
window_size = 5
df['SMA'] = df['Value'].rolling(window=window_size).mean()
# 计算加权移动平均(WMA)
weights = np.arange(1, window_size + 1) # 权重为 1, 2, 3, ..., window_size
df['WMA'] = df['Value'].rolling(window=window_size).apply(lambda x: np.dot(x, weights)/weights.sum(), raw=True)
# 计算指数移动平均(EMA)
df['EMA'] = df['Value'].ewm(span=window_size, adjust=False).mean()
# 绘制结果
plt.figure(figsize=(10, 5))
plt.plot(df.index, df['Value'], label='Original Data', marker='o', linestyle='--', alpha=0.6)
plt.plot(df.index, df['SMA'], label=f'SMA ({window_size})', linewidth=2, linestyle='--')
plt.plot(df.index, df['WMA'], label=f'WMA ({window_size})', linewidth=2, linestyle='-')
plt.plot(df.index, df['EMA'], label=f'EMA ({window_size})', linewidth=2, linestyle='dotted')
plt.legend()
plt.xlabel('Date')
plt.ylabel('Value')
plt.title('Moving Averages Example')
plt.xticks(rotation=90) # 让日期竖着显示
plt.grid()
plt.show()
print("SMA = n1+..n5/5 ; WMA = w1*n1+..w5*n5/w1 +w2+..w5 ; EMA = & * Xt(1=&)t-1 ")
# 打印数据
print(df)
显示效果
SMA = n1+..n5/5 ; WMA = w1*n1+..w5*n5/w1 +w2+..w5 ; EMA = & * Xt(1=&)t-1
Value SMA WMA EMA
Date
2024-01-01 88 NaN NaN 88.000000
2024-01-02 78 NaN NaN 84.666667
2024-01-03 64 NaN NaN 77.777778
2024-01-04 92 NaN NaN 82.518519
2024-01-05 57 75.8 72.600000 74.012346
2024-01-06 70 72.2 70.666667 72.674897
2024-01-07 88 74.2 75.933333 77.783265
2024-01-08 68 75.0 73.866667 74.522176
2024-01-09 72 71.0 72.866667 73.681451
2024-01-10 60 71.6 69.200000 69.120967
2024-01-11 60 69.6 65.333333 66.080645
2024-01-12 73 66.6 66.466667 68.387097
2024-01-13 85 70.0 72.600000 73.924731
2024-01-14 89 73.4 78.933333 78.949821
2024-01-15 73 76.0 78.800000 76.966547
2024-01-16 52 74.4 70.800000 68.644365
2024-01-17 71 74.0 69.666667 69.429577
2024-01-18 51 67.2 62.000000 63.286384
2024-01-19 73 64.0 63.933333 66.524256
2024-01-20 93 68.0 73.600000 75.349504