技術指標計算: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 的黃金交叉點。」
本日總結
在本章中,你學到了:
- ✅ MA(移動平均線):判斷長期趨勢方向
- ✅ MACD:衡量趨勢強度與動能變化
- ✅ RSI(相對強弱指標):判斷超買超賣
- ✅ 布林通道:衡量價格波動度
- ✅ 視覺化分析:用 Matplotlib 畫出專業級技術圖表
下一章,我們將實作第一個完整的交易策略!