本文目錄
台股動能策略這幾年在投資社群討論度很高,但多數文章只講概念,真正把 Python 量化交易 流程寫出來、能讓讀者複製貼上的教學並不多。這篇會用教學範例的角度,帶你從資料抓取、因子計算、選股排序到簡易回測,一步步把「台股動能策略」的骨架搭出來,並誠實說明回測的極限與常見陷阱。本文所有數字都是示範用途的模擬情境,不是真實交易績效,也不是投資建議。
什麼是台股動能策略?核心邏輯與因子選擇
動能策略(Momentum Strategy)的核心概念是「強者恆強、弱者恆弱」:過去一段時間漲勢相對強的股票,未來一段時間延續上漲的機率被認為較高。這個現象在學術界有長期研究基礎,Jegadeesh 與 Titman 在 1993 年的經典論文即針對美股提出動能效應,後續也有不少研究討論台股市場的適用性,只是強度與持續時間會因市場結構而異。
建構台股動能策略時,通常會考慮三類因子:
1. 價格動能:以過去 3~12 個月的累積報酬率作為排序依據。不同週期在不同市場、不同年代表現差異很大,實務上必須用樣本外測試驗證,不能直接宣稱「6 個月最穩」。
2. 成交量動能:搭配成交量變化的股票,動能延續性可能較好,常見做法是用短期均量與長期均量的比值來篩選。
3. 相對強度(RS):把個股報酬率與大盤(加權指數)比較,抓出相對跑贏大盤的標的,而不是只看絕對漲幅。
動能策略受歡迎的原因,是它邏輯簡單、有學術脈絡可循,而且可以完全用程式化方式執行,減少憑感覺選股的成分。但請記得:因子有效與否是實證問題,不是常識問題,任何績效數字都必須透過可重現的回測流程驗證。
用 Python 打造動能策略回測流程
接下來是實作部分。完整流程分成四個階段:資料抓取、因子計算、選股排序、回測驗證。以下程式碼皆為教學範例,你可以直接複製到本機執行後再自行修改。
第一步:資料抓取
台股資料來源常見有兩類:免費的 yfinance,以及付費的專業資料庫(例如 TEJ 台灣經濟新報)。yfinance 免費、易上手,但不保證涵蓋已下市股票,容易產生倖存者偏差;付費資料庫資料較完整,但成本較高。若只是自己練習,建議先從 yfinance 開始,等策略邏輯確定後再考慮升級資料源。
import yfinance as yf
import pandas as pd
以台積電為例,抓取近 3 年日線資料
ticker = "2330.TW"
df = yf.download(ticker, start="2023-01-01″, end="2026-01-01″, auto_adjust=True)
確認欄位結構
print(df.head())
print(df.columns)
提醒:
yfinance的欄位名稱與回傳格式會隨版本調整,實際使用時請先print(df.columns)確認,不要直接假設欄位名稱。
第二步:因子計算
用 pandas 計算每支股票過去 6 個月(台股一年約 250 個交易日,6 個月約 126 天)的累積報酬率:
import pandas as pd
假設 df 為單一股票的日線資料,且含 'Close' 欄位
df = df.copy()
df["momentum_6m"] = df["Close"].pct_change(periods=126)
成交量動能:20 日均量 / 60 日均量
df["vol_ma20"] = df["Volume"].rolling(20).mean()
df["vol_ma60"] = df["Volume"].rolling(60).mean()
df["vol_ratio"] = df["vol_ma20"] / df["vol_ma60"]
print(df[["Close", "momentum_6m", "vol_ratio"]].tail())
第三步:選股與排序
實務上你不會只跑一檔股票,而是把整個股票池的資料合併成一個 DataFrame,再依日期分組排序。以下示範「每月月初取動能前 20%」的邏輯:
import pandas as pd
假設 all_df 為多檔股票合併後的長表,欄位包含:
date, ticker, Close, Volume, momentum_6m, vol_ratio
all_df["date"] = pd.to_datetime(all_df["date"])
all_df["ym"] = all_df["date"].dt.to_period("M")
每月最後一個交易日的資料作為下個月的選股依據
monthly = all_df.sort_values("date").groupby(["ym", "ticker"]).tail(1)
def pick_top(df_month, top_pct=0.2, min_vol_ratio=1.0):
# 先過濾成交量動能不足的標的
candidates = df_month[df_month["vol_ratio"] >= min_vol_ratio].copy()
if candidates.empty:
return candidates
# 依動能分數排序,取前 top_pct
candidates = candidates.sort_values("momentum_6m", ascending=False)
n = max(1, int(len(candidates) * top_pct))
return candidates.head(n)
selected = (
monthly.groupby("ym", group_keys=False)
.apply(pick_top)
)
print(selected[["ym", "ticker", "momentum_6m", "vol_ratio"]].head(20))
第四步:回測驗證
以下示範一個極簡版回測骨架,只計算等權重持有、每月再平衡的累積報酬,並扣除交易成本。這是教學用的最小可行範例,不是完整回測框架:
import pandas as pd
import numpy as np
台股交易成本(依現行規則,實際折扣依券商而異)
BUY_FEE = 0.001425 # 買進手續費(未折扣)
SELL_FEE = 0.001425 # 賣出上手續費(未折扣)
TAX = 0.003 # 賣出證交稅
def backtest_equal_weight(selected, price_df):
"""
selected: 每月選出的股票(含 ym, ticker)
price_df: 長表,含 date, ticker, Close
回傳:每月報酬序列
"""
price_df = price_df.copy()
price_df["date"] = pd.to_datetime(price_df["date"])
price_df["ym"] = price_df["date"].dt.to_period("M")
monthly_returns = []
months = sorted(selected["ym"].unique())
for i in range(len(months) – 1):
this_m = months[i]
next_m = months[i + 1]
tickers = selected.loc[selected["ym"] == this_m, "ticker"].tolist()
rets = []
for t in tickers:
p0 = price_df[(price_df["ticker"] == t) & (price_df["ym"] == this_m)]["Close"].iloc[-1]
p1 = price_df[(price_df["ticker"] == t) & (price_df["ym"] == next_m)]["Close"].iloc[-1]
if p0 > 0:
gross = p1 / p0 – 1
# 假設每月完整換股,扣掉買進與賣出成本
net = gross – BUY_FEE – SELL_FEE – TAX
rets.append(net)
if rets:
monthly_returns.append({
"ym": this_m,
"ret": float(np.mean(rets))
})
return pd.DataFrame(monthly_returns)
result = backtest_equal_weight(selected, all_df)
result["cum_ret"] = (1 + result["ret"]).cumprod()
print(result.tail())
執行完後,你會得到一條模擬的累積報酬曲線。請注意:
- 這條曲線是「假設」每月完整換股、等權重、扣固定成本下的結果,與真實交易會有落差。
- 若你的資料源只包含目前仍在上市的股票,曲線會系統性偏樂觀,因為已下市的地雷股沒有被納入。
- 任何具體的年化報酬、最大回撤、夏普值,都必須由你自己用可重現的程式跑出來,本文不提供、也不背書任何績效數字。
避雷防坑指南:量化回測最常見的三個陷阱
以下三個陷阱是量化回測領域的通用問題,不分新手老手都可能踩到,值得特別留意。
雷區一:倖存者偏差(Survivorship Bias)
如果你使用的資料只包含「目前還在上市」的股票,回測結果會系統性偏樂觀,因為那些已經下市、下櫃的地雷股完全沒有被納入計算。這等於是用「已經知道結果」的資料在回測,很容易高估策略的實際表現。
防範建議:盡量使用包含下市股票的完整歷史資料庫;若資料源無法涵蓋,至少在解讀結果時保守以對,不要被漂亮的數字沖昏頭。
雷區二:過度優化(Overfitting)
把動能週期從 3 個月試到 12 個月、成交量門檻調十幾種組合,最後找到一組「完美」參數——這在回測裡幾乎一定會發生。問題是,你很可能是在擬合歷史雜訊,而不是抓到真正的市場規律。拿去下一年的資料驗證時,報酬率往往會明顯衰退。
防範建議:務必做樣本外測試(Out-of-Sample Testing),把資料切成訓練期與驗證期,參數只能在訓練期決定,不要用全部資料反覆調到報酬率最漂亮為止。
雷區三:忽略交易成本與流動性
台股的交易成本大致如下(實際折扣依券商與交易方式而異):
| 項目 | 費率 | 說明 |
|---|---|---|
| 買進手續費 | 0.1425% | 多數券商有折扣,常見 6 折、5 折甚至更低 |
| 賣出手續費 | 0.1425% | 同上 |
| 賣出證交稅 | 0.3% | 依現行規定,僅賣出時課徵 |
一來一回的成本大約落在 0.4%~0.6% 之間(視折扣而定)。若策略每月換股、一年操作 12 次,光是成本就可能吃掉數個百分點的報酬。此外,成交量偏低的小型股在實際下單時容易出現滑價,回測若沒有把滑價納入,結果會失真。
防範建議:回測時務必把交易成本、稅金、滑價都估算進去,並設定最低成交量門檻(例如日均量 500 張以上)來過濾流動性不足的標的。
2026 年台股動能策略的優化方向與風險討論
進入 2026 年,台股在 AI 供應鏈、半導體與電子權值股的帶動下波動明顯放大,傳統動能策略需要更認真面對以下幾個風險:
- 動能崩盤(Momentum Crash):當市場發生劇烈反轉,前期漲多的動能股往往跌得最兇。學術文獻(如 Daniel & Moskowitz 2016)對此有專門討論,這是動能策略的結構性風險,不是靠紀律就能完全避開。
- 市場 regime change:多頭、盤整、空頭三種市場狀態下,動能因子的有效性差異很大。同一個參數在多頭年可能表現亮眼,在空頭年可能連續虧損。
- 產業集中度:台股電子權值股占比高,動能選股容易集中在少數產業,一旦該產業修正,策略淨值會同步受到衝擊。
對應的優化方向可以考慮:
1. 加入動能反轉的風險控制機制:例如當個股短期漲幅超過某個閾值時適度降低權重,避免追高。
2. 加入停損或動能反轉出場訊號:例如當個股跌破長期均線、或動能排名掉出前 50% 時出場。
3. 產業中性化:限制單一產業的持股比重上限,降低產業集中風險。
4. 結合技術面工具做即時監控:而不是每月才檢視一次。
工具比較:Python 回測與即時監控怎麼搭
我自己在實務上會把「策略邏輯」與「日常監控」分開處理:Python 負責批次回測與選股,圖表工具負責盯盤與警示。以下是常見工具的比較:
| 工具/平台 | 主要用途 | 費用 | 適合對象 | 優點 | 缺點 |
|---|---|---|---|---|---|
| Python + pandas/backtrader | 策略回測、因子計算 | 免費 | 有程式基礎者 | 完全客製化、彈性高 | 需自行維護資料源與程式碼 |
| TradingView | 即時圖表、技術分析、警示 | 免費~約 NT$780/月 | 各類交易者 | 介面直覺、指標庫豐富、跨裝置同步 | 進階回測功能需付費 |
| TEJ 台灣經濟新報 | 歷史財務與價量資料 | 約 NT$3,000 起/月 | 專業量化研究者 | 資料完整、涵蓋下市股 | 費用較高 |
| yfinance | 基礎股價資料抓取 | 免費 | 學生、初學者 | 免費易上手 | 資料品質不穩、易有倖存者偏差 |
如果你也是自己寫程式回測,但想要更直覺的圖表化操作介面來輔助日常監控,可以試試 TradingView 的免費版本,它的價格警示功能對動能策略「追蹤突破點」特別實用。
常見問題 FAQ
台股動能策略適合新手嗎?
動能策略的邏輯不難理解,但執行紀律要求高。常見的錯誤是:股票短期回檔時忍不住停損出場,反而錯過後續動能延續的漲幅。建議新手先用模擬交易或小資金(例如 10 萬元以下)跑至少 3~6 個月,確認自己能承受這種波動之後,再考慮放大資金部位。
Python 量化交易需要學會哪些技能才能開始?
基本門檻是 Python 的 pandas、numpy 兩個資料處理套件,進階則需要 backtrader 或 vectorbt 這類回測框架。若完全沒有程式基礎,建議先花 2~3 週打好 Python 基礎,再進入策略開發,否則容易卡在語法問題而放棄。
動能因子回測的結果可以直接拿來實盤操作嗎?
不建議直接照搬。回測結果通常比實盤樂觀,原因包括滑價、交易成本、倖存者偏差等(前面避雷指南有詳細說明)。合理的做法是:把回測年化報酬打七到八折來看待,再用小資金實盤驗證至少 3 個月,確認策略在真實市場的執行狀況與預期一致,才逐步加碼。
結論:從回測到實戰,關鍵在於流程與紀律
台股動能策略不是什麼神秘黑科技,它的核心就是「順勢而為」——用數據找出相對強勢的股票,並用紀律執行,而不是憑感覺追高殺低。透過 Python 量化交易,你可以把選股邏輯系統化,減少情緒干擾;但同時也要記得前面提到的三個雷:倖存者偏差、過度優化、交易成本與流動性。任何一個沒處理好,都可能讓策略從賺錢變成賠錢。
如果你已經準備好動手實作,建議你先用本文的程式碼骨架把選股邏輯跑起來,做足樣本外驗證,並搭配一個好用的即時監控工具輔助日常盯盤決策。像 TradingView 這類工具可以設定價格警示,讓你不用整天盯盤也能掌握動能突破的時機點,有免費版本可以先體驗。
最後再次提醒:本文所有內容僅供程式教學與研究用途,不構成任何個股投資建議。回測結果不代表未來獲利保證,投資有風險,請自行評估並做好資金控管。 祝你在 2026 年的台股市場,找到屬於自己的研究節奏。