跳轉到

機器學習範例策略(台股)

美股版本

本策略的美股版本請見 English page

本範例展示如何使用機器學習進行選股,透過 XGBoost 模型(經由 qlib 整合)預測股票未來報酬,並結合技術面趨勢過濾建構投資組合。

特徵工程

使用股價淨值比(PB)和本益比(PE)作為特徵,透過 feature.combine() 整合為特徵矩陣,以週為重新取樣頻率。

from finlab import data
from finlab.ml import feature as mlf

features = mlf.combine({
    'pb': data.get('price_earning_ratio:股價淨值比'),
    'pe': data.get('price_earning_ratio:本益比')
}, resample='W')

features.head()

標籤定義

標籤為未來 12 週的報酬率,使用 label.return_percentage() 計算。

from finlab.ml import label as mll

label = mll.return_percentage(features.index, resample='W', period=12)

模型訓練與預測

以 2020-01-01 為分界,之前的資料作為訓練集,之後的資料作為測試集。使用 qlib 提供的 XGBModel 進行訓練與預測。

import finlab.ml.qlib as q

is_train = features.index.get_level_values('datetime') < '2020-01-01'

X_train, y_train = features[is_train], label[is_train]
X_test = features[~is_train]

model = q.XGBModel()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

建構投資組合與回測

將模型預測結果結合 60 日均線趨勢過濾(收盤價高於 60 日均線才納入),選取預測值最高的前 10 檔股票,以季度為頻率進行回測。

from finlab.backtest import sim

close = data.get('price:收盤價')

position = y_pred[close > close.average(60)].is_largest(10)

sim(position, resample='Q')

關鍵概念

特徵選擇

PB、PE 是為了範例簡潔而選的最基本特徵。實務上可以擴充更多面向:

  • 成長性指標:營收成長率、稅後淨利成長率(fundamental_features:營收成長率fundamental_features:稅後淨利成長率
  • 獲利能力:ROE、營業利益率(fundamental_features:股東權益報酬率fundamental_features:營業利益率
  • 技術指標:RSI、MACD、股價相對均線的比值
  • 動能:6 個月與 12 個月的價格報酬率

更多特徵可以提升模型的預測能力,但也會增加過擬合(overfitting)的風險。擴充特徵時務必搭配交叉驗證與特徵重要度分析。

訓練/測試切分

時間序列切分(< '2020-01-01')是關鍵。不同於傳統機器學習可用隨機切分,金融時序必須按時間先後切分以避免資料洩漏(data leakage)。模型在訓練時絕對不能看到未來的資料。

趨勢過濾

close > close.average(60) 的過濾有兩個作用:

  1. 降低暴露在下跌股票的機率 — 即使模型預測某檔會上漲,若目前仍處於下跌趨勢,價格可能繼續走跌,預測才會兌現。
  2. 提升風險調整後報酬 — 基本面/機器學習訊號搭配技術面趨勢過濾是常見的量化手法。

再平衡頻率

resample='Q'(季頻)與預測期(12 週 ≈ 1 季)相符。每季根據最新預測重構投資組合,既讓模型能隨市場變化調整,又能控制週轉率。

關鍵參數

  • resample='W'(特徵):特徵以週頻重採樣,平滑日頻雜訊,同時保留足夠的時間解析度。
  • period=12(標籤):預測未來 12 週的報酬,作為模型學習的目標。
  • 2020-01-01 時間切分:以時間序列方式切分訓練/測試集,避免資料洩漏(data leakage),不可使用隨機切分。
  • XGBModel:qlib 封裝的 XGBoost 實作,適合中等特徵數、非線性關係的選股問題。
  • close > close.average(60):60 日均線趨勢過濾,只保留處於中期多頭趨勢的股票。
  • is_largest(10):集中持有模型預測值最高的前 10 檔,兼顧訊號強度與分散度。
  • resample='Q'(回測):季頻換股,與預測期(12 週)一致。

預期行為

此策略把「機器學習預測的未來報酬」與「中期技術趨勢」結合:模型會從 PB、PE 等估值特徵學習出哪些特徵組合對應未來報酬較佳,再由 60 日均線過濾掉仍在下跌趨勢的標的。預期在價值因子與動能因子都有效的市場環境下表現最佳;當風格劇烈輪動(例如成長股連續大跌後快速反彈),XGBoost 從歷史資料學到的規律可能暫時失效,此時模型預測會落後實際走勢。將預測視為排序訊號而非絕對報酬預測,並搭配風控上的單檔部位與停損,能降低模型失準帶來的傷害。