台股突破動能策略教學:用 Python 打造 2026 中長線交易策略完整範例

本文目錄
  1. 什麼是台股動能策略?核心邏輯與因子選擇
  2. 用 Python 打造動能策略回測流程
  3. 避雷防坑指南:量化回測最常見的三個陷阱
  4. 2026 年台股動能策略的優化方向與風險討論
  5. 工具比較:Python 回測與即時監控怎麼搭
  6. 常見問題 FAQ
  7. 結論:從回測到實戰,關鍵在於流程與紀律

台股動能策略這幾年在投資社群討論度很高,但多數文章只講概念,真正把 Python 量化交易 流程寫出來、能讓讀者複製貼上的教學並不多。這篇會用教學範例的角度,帶你從資料抓取、因子計算、選股排序到簡易回測,一步步把「台股動能策略」的骨架搭出來,並誠實說明回測的極限與常見陷阱。本文所有數字都是示範用途的模擬情境,不是真實交易績效,也不是投資建議。

什麼是台股動能策略?核心邏輯與因子選擇

動能策略(Momentum Strategy)的核心概念是「強者恆強、弱者恆弱」:過去一段時間漲勢相對強的股票,未來一段時間延續上漲的機率被認為較高。這個現象在學術界有長期研究基礎,Jegadeesh 與 Titman 在 1993 年的經典論文即針對美股提出動能效應,後續也有不少研究討論台股市場的適用性,只是強度與持續時間會因市場結構而異。

建構台股動能策略時,通常會考慮三類因子:

1. 價格動能:以過去 3~12 個月的累積報酬率作為排序依據。不同週期在不同市場、不同年代表現差異很大,實務上必須用樣本外測試驗證,不能直接宣稱「6 個月最穩」。

2. 成交量動能:搭配成交量變化的股票,動能延續性可能較好,常見做法是用短期均量與長期均量的比值來篩選。

3. 相對強度(RS):把個股報酬率與大盤(加權指數)比較,抓出相對跑贏大盤的標的,而不是只看絕對漲幅。

動能策略受歡迎的原因,是它邏輯簡單、有學術脈絡可循,而且可以完全用程式化方式執行,減少憑感覺選股的成分。但請記得:因子有效與否是實證問題,不是常識問題,任何績效數字都必須透過可重現的回測流程驗證。

用 Python 打造動能策略回測流程

接下來是實作部分。完整流程分成四個階段:資料抓取、因子計算、選股排序、回測驗證。以下程式碼皆為教學範例,你可以直接複製到本機執行後再自行修改。

第一步:資料抓取

台股資料來源常見有兩類:免費的 yfinance,以及付費的專業資料庫(例如 TEJ 台灣經濟新報)。yfinance 免費、易上手,但不保證涵蓋已下市股票,容易產生倖存者偏差;付費資料庫資料較完整,但成本較高。若只是自己練習,建議先從 yfinance 開始,等策略邏輯確定後再考慮升級資料源。

PYTHON
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 天)的累積報酬率:

PYTHON
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%」的邏輯:

PYTHON
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))

第四步:回測驗證

以下示範一個極簡版回測骨架,只計算等權重持有、每月再平衡的累積報酬,並扣除交易成本。這是教學用的最小可行範例,不是完整回測框架:

PYTHON
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 年的台股市場,找到屬於自己的研究節奏。