技術指標計算:MA、MACD、RSI、布林通道

技術指標是量化交易的核心工具。它們是基於價格和成交量數據計算出來的統計量,幫助你判斷市場的趨勢、動能與超買超賣狀態。

載入資料

import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 下載台積電資料
df = yf.download("2330.TW", start="2023-01-01", end="2024-12-31")

# 使用收盤價
close = df['Close']
high = df['High']
low = df['Low']
volume = df['Volume']

1. 移動平均線 (Moving Average)

移動平均線是最基礎的趨勢指標。它計算過去 N 天的平均價格,用來平滑短期的價格波動。

# 手動計算移動平均線
df['MA5'] = close.rolling(window=5).mean()
df['MA20'] = close.rolling(window=20).mean()
df['MA60'] = close.rolling(window=60).mean()

# 畫圖
plt.figure(figsize=(14, 7))
plt.plot(df.index, close, label='收盤價', alpha=0.5)
plt.plot(df.index, df['MA5'], label='MA5 (5日)', linewidth=1.5)
plt.plot(df.index, df['MA20'], label='MA20 (20日)', linewidth=1.5)
plt.plot(df.index, df['MA60'], label='MA60 (60日)', linewidth=2)
plt.title('台積電 2330 - 移動平均線')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

2. MACD (平滑異同移動平均線)

MACD 是動能指標,用來判斷趨勢的強度與方向變化。它由三個部分組成:

  • MACD 線:12 日 EMA 減 26 日 EMA
  • 訊號線:MACD 的 9 日 EMA
  • 柱狀圖 (Histogram):MACD 線減訊號線
from ta.trend import MACD

# 使用 ta 套件計算
macd_indicator = MACD(close=close)
df['MACD'] = macd_indicator.macd()
df['MACD_Signal'] = macd_indicator.macd_signal()
df['MACD_Hist'] = macd_indicator.macd_diff()

# 畫 MACD
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 10), gridspec_kw={'height_ratios': [2, 1]})

# 上圖:價格
ax1.plot(df.index, close, label='收盤價')
ax1.set_title('台積電 2330 - MACD 指標')
ax1.legend()
ax1.grid(True, alpha=0.3)

# 下圖:MACD
ax2.plot(df.index, df['MACD'], label='MACD', color='blue')
ax2.plot(df.index, df['MACD_Signal'], label='訊號線', color='orange')
ax2.bar(df.index, df['MACD_Hist'], label='柱狀圖', color='gray', alpha=0.5)
ax2.axhline(y=0, color='black', linestyle='--', alpha=0.3)
ax2.legend()
ax2.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

MACD 交易信號:

  • MACD 線向上突破訊號線 → 買進信號 📈
  • MACD 線向下跌破訊號線 → 賣出信號 📉
  • MACD 由負轉正 → 動能轉強
  • MACD 由正轉負 → 動能轉弱

3. RSI (相對強弱指標)

RSI 衡量價格變動的速度與幅度,用來判斷超買或超賣狀態。

  • RSI > 70:超買(可能即將下跌)
  • RSI < 30:超賣(可能即將反彈)
  • RSI 在 30-70 之間:正常波動
from ta.momentum import RSIIndicator

# 計算 RSI(預設週期為 14 天)
rsi_indicator = RSIIndicator(close=close, window=14)
df['RSI'] = rsi_indicator.rsi()

# 畫圖
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 10), gridspec_kw={'height_ratios': [2, 1]})

ax1.plot(df.index, close, label='收盤價')
ax1.set_title('台積電 2330 - RSI 指標')
ax1.legend()
ax1.grid(True, alpha=0.3)

ax2.plot(df.index, df['RSI'], label='RSI (14)', color='purple')
ax2.axhline(y=70, color='r', linestyle='--', alpha=0.5, label='超買 (70)')
ax2.axhline(y=30, color='g', linestyle='--', alpha=0.5, label='超賣 (30)')
ax2.fill_between(df.index, 30, 70, alpha=0.1, color='gray')
ax2.set_ylim(0, 100)
ax2.legend()
ax2.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

4. 布林通道 (Bollinger Bands)

布林通道由三條線組成:中軌是 MA20,上下軌是 MA20 ± 2 個標準差。它用來衡量價格的波動程度。

  • 價格觸碰上軌 → 可能過熱
  • 價格觸碰下軌 → 可能超跌
  • 通道寬度擴大 → 波動度增加
  • 通道寬度縮小 → 波動度降低(可能即將大行情)
from ta.volatility import BollingerBands

bb_indicator = BollingerBands(close=close, window=20, window_dev=2)
df['BB_Upper'] = bb_indicator.bollinger_hband()
df['BB_Middle'] = bb_indicator.bollinger_mavg()
df['BB_Lower'] = bb_indicator.bollinger_lband()

plt.figure(figsize=(14, 7))
plt.plot(df.index, close, label='收盤價', color='black')
plt.plot(df.index, df['BB_Middle'], label='MA20 (中軌)', color='blue', linestyle='--')
plt.plot(df.index, df['BB_Upper'], label='上軌 (MA20+2σ)', color='red', linestyle='--')
plt.plot(df.index, df['BB_Lower'], label='下軌 (MA20-2σ)', color='green', linestyle='--')
plt.fill_between(df.index, df['BB_Upper'], df['BB_Lower'], alpha=0.1, color='gray')
plt.title('台積電 2330 - 布林通道')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

使用 Vibe Coding 計算技術指標

🔥 【技術指標詠唱範例】 「請幫我分析 TSLA 股票: 1. 抓取過去 1 年的日資料。 2. 計算 MA10、MA30、MACD、RSI(14) 與布林通道。 3. 用一張圖顯示價格 + 移動平均線。 4. 用另一張圖顯示 MACD。 5. 用第三張圖顯示 RSI 與超買超賣線。 6. 用第四張圖顯示布林通道。 7. 標出所有 MA10 向上突破 MA30 的黃金交叉點。」

本日總結

在本章中,你學到了:

  1. MA(移動平均線):判斷長期趨勢方向
  2. MACD:衡量趨勢強度與動能變化
  3. RSI(相對強弱指標):判斷超買超賣
  4. 布林通道:衡量價格波動度
  5. 視覺化分析:用 Matplotlib 畫出專業級技術圖表

下一章,我們將實作第一個完整的交易策略!

會員專屬免費教學

本章節為註冊會員專屬的免費開放內容!請先登入或註冊會員,即可立即解鎖閱讀。

立即登入 / 註冊