EMA是什麼?指數移動平均線含義、計算公式與Python示例

EMA是什麼?指數移動平均線含義、計算公式與Python示例
EMA 是 Exponential Moving Average 的縮寫,即指數移動平均線。 它和簡單移動平均線(SMA)一樣用於平滑價格,但會給近期價格更高的權重。因此當行情轉向時,EMA 的反應更快,被股票、外匯、加密貨幣和期貨交易者廣泛用於判斷趨勢方向、尋找動態支撐阻力以及捕捉均線交叉信號。
本文用通俗的語言講清 EMA 的含義,逐步拆解 EMA 計算公式,並演示如何使用 iTick 歷史行情數據API 獲取真實 OHLCV 數據,在 Python 中計算 EMA。
EMA 在交易中的含義
當交易者説"價格站上 50 EMA"時,意思是最新收盤價高於 50 週期的指數移動平均線。"週期"指使用的K線數量——日線圖上是 50 根日K,1 分鐘圖上就是 50 根 1 分鐘K線。
EMA 主要回答三個問題:
- 趨勢是什麼? EMA 向上且價格在其上方代表上升趨勢;EMA 向下且價格在其下方代表下降趨勢。
- 動態支撐/阻力在哪? 強趨勢中,回調常在 20 或 50 EMA 附近止跌。
- 動能是否變化? 快線 EMA(如 12)與慢線 EMA(如 26)交叉,意味着動能轉換——MACD 指標正是基於此構建。
EMA 計算公式
EMA 採用遞推計算,每個新值都依賴前一個 EMA:
今日EMA = 今日收盤價 × α + 昨日EMA × (1 − α)
α(平滑係數)= 2 / (N + 1)
其中 N 為週期數。以 10 週期 EMA 為例,α = 2 / 11 ≈ 0.1818,即今日價格約佔新 EMA 的 18%,前一日 EMA 佔 82%。
第一個 EMA 需要初始值,通常用前 N 根收盤價的 SMA 作為種子,從第 N+1 根開始套用公式。
手算示例(5 週期 EMA)
| 日期 | 收盤價 | 計算 | EMA(5) |
|---|---|---|---|
| 第1-5天 | 10, 11, 12, 11, 13 | SMA 種子 = 57 / 5 | 11.40 |
| 第6天 | 14 | 14 × 0.333 + 11.40 × 0.667 | 12.27 |
| 第7天 | 13 | 13 × 0.333 + 12.27 × 0.667 | 12.51 |
| 第8天 | 15 | 15 × 0.333 + 12.51 × 0.667 | 13.34 |
N = 5 時 α = 2 / 6 = 0.333。可以看到 EMA 向新價格靠攏的速度明顯快於 5 日 SMA。
EMA 與 SMA 的一句話區別
兩者都是價格均值,但 SMA 對每根K線權重相同,EMA 更重視近期K線——所以 EMA 更快、SMA 更平滑。詳細對比見 SMA與EMA的區別。
常用 EMA 週期
| EMA | 常見用途 |
|---|---|
| 9 EMA | 超短線動能、日內剝頭皮 |
| 12 / 26 EMA | MACD 的兩條線,波段交叉信號 |
| 20 / 21 EMA | 短期趨勢與回調入場 |
| 50 EMA | 中期趨勢過濾 |
| 200 EMA | 長期趨勢,"站上200 EMA"常被視為牛市 |
沒有"最好"的 EMA 參數。短週期信號更早但噪音更多;長週期信號更少更晚但更可靠。請根據持倉週期選擇,並先用歷史數據回測。
常見 EMA 交易信號
- 價格穿越: 收盤價上穿 EMA(看多)或下穿 EMA(看空)。
- 均線交叉: 快線上穿慢線(金叉)或下穿(死叉),可參考 雙均線量化策略教程。
- 斜率過濾: 僅在 50 或 200 EMA 向上時做多。
- 回調入場: 趨勢中回踩 20 EMA 後反彈買入。
侷限性
EMA 是滯後指標,只描述已經發生的事情。在橫盤震盪行情中,EMA 交叉會產生大量假信號,建議配合 ADX 趨勢強度指標 或成交量使用。
用 Python 和真實行情數據計算 EMA
最可靠的方式是基於乾淨的 OHLCV K線自行計算。下面的示例從 iTick API 下載蘋果公司日線,並用 pandas 計算 12、26、200 EMA:
import requests
import pandas as pd
TOKEN = "YOUR_API_TOKEN" # 免費註冊:https://itick.org/zh-hk/register
# kType = K線週期(完整取值見 iTick 文檔)
url = "https://api.itick.org/stock/kline"
params = {"region": "US", "code": "AAPL", "kType": 8, "limit": 500}
headers = {"accept": "application/json", "token": TOKEN}
bars = requests.get(url, params=params, headers=headers, timeout=10).json()["data"]
df = pd.DataFrame(bars).rename(columns={"t": "time", "o": "open", "h": "high",
"l": "low", "c": "close", "v": "volume"})
df["time"] = pd.to_datetime(df["time"], unit="ms")
# pandas ewm(span=N) 使用 alpha = 2 / (N + 1),即標準 EMA 公式
for n in (12, 26, 200):
df[f"ema_{n}"] = df["close"].ewm(span=n, adjust=False).mean()
df["signal"] = (df["ema_12"] > df["ema_26"]).astype(int).diff() # 1 = 金叉, -1 = 死叉
print(df[["time", "close", "ema_12", "ema_26", "ema_200", "signal"]].tail(10))
把 stock 換成 forex(region GB,code EURUSD)或 crypto(region BA,code BTCUSDT),同一段代碼即可計算外匯或比特幣的 EMA。
提示:
adjust=False與大多數行情軟件的遞推公式一致;adjust=True時 pandas 使用加權求和版本,前幾根數值會略有差異。
實時更新 EMA
無需每個 Tick 都重算整條序列,只需保留上一個 EMA 值並用新收盤價更新:
alpha = 2 / (12 + 1)
ema = ema + alpha * (new_close - ema)
new_close 可來自 iTick WebSocket 實時行情推送,讓 EMA 保持毫秒級更新。
常見問題
EMA 是什麼意思? EMA 即指數移動平均線,是一種對近期價格賦予更高權重的移動平均線。
EMA 參數設多少合適? 日內交易常用 9 和 21,波段交易常用 20 和 50,長線投資常看 200。使用前請在目標市場回測。
EMA 比 SMA 好嗎? 沒有絕對優劣。EMA 對新信息反應更快,SMA 更平滑、更不易被洗盤。
外匯和加密貨幣可以用 EMA 嗎? 可以,EMA 適用於任何價格時間序列,包括股票、指數、外匯、黃金和加密貨幣。
為指標提供可靠的數據
指標的質量取決於數據的質量。iTick 通過統一的 REST 與 WebSocket 接口提供股票、外匯、加密貨幣、指數和期貨的實時與歷史行情數據。免費獲取 API Key,用真實價格計算你的 EMA。