2. 加權移動平均(WMA)

加權移動平均會對不同時間點的數據賦予不同的權重。加權移動平均的公式為:

3. 指數移動平均(EMA)

指數移動平均更注重近期的數據,它通過指數衰減的方式給數據賦予權重。公式為:

完整案例

這里使用 Python 編寫一個簡單的代碼來展示三種移動平均(SMA、WMA 和 EMA)的原理。

步驟:

  1. 生成一組時間序列數據,作為我們的原始數據。
  2. 計算三種移動平均(SMA、WMA 和 EMA)。
  3. 繪制多個圖形,展示原始數據與移動平均的關系。

數據生成與分析

我們生成一組波動較大的模擬數據,假設這是股票價格的變化,數據點的數量為 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)是如何幫助我們平滑時間序列數據的:

這些工具可以用于金融數據、天氣預報等領域的趨勢分析,希望對大家有幫助。

文章轉自微信公眾號@深夜努力寫Python

上一篇:

突破最強時間序列模型,自回歸滑動平均!!

下一篇:

突破最強分類算法,高斯混合模型!!
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費