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

  1. iTick
  2. 技術分析
EMA是什麼?指數移動平均線含義、計算公式與Python示例 - iTick
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 主要回答三個問題:

  1. 趨勢是什麼? EMA 向上且價格在其上方代表上升趨勢;EMA 向下且價格在其下方代表下降趨勢。
  2. 動態支撐/阻力在哪? 強趨勢中,回調常在 20 或 50 EMA 附近止跌。
  3. 動能是否變化? 快線 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, 13SMA 種子 = 57 / 511.40
第6天1414 × 0.333 + 11.40 × 0.66712.27
第7天1313 × 0.333 + 12.27 × 0.66712.51
第8天1515 × 0.333 + 12.51 × 0.66713.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 EMAMACD 的兩條線,波段交叉信號
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。