
如何高效爬取全球新聞網站 – 整合Scrapy、Selenium與Mediastack API實現自動化新聞采集
加權移動平均會對不同時間點的數據賦予不同的權重。加權移動平均的公式為:
指數移動平均更注重近期的數據,它通過指數衰減的方式給數據賦予權重。公式為:
這里使用 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)是如何幫助我們平滑時間序列數據的:
這些工具可以用于金融數據、天氣預報等領域的趨勢分析,希望對大家有幫助。