機器學習範例策略(台股)
美股版本
本策略的美股版本請見 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) 的過濾有兩個作用:
- 降低暴露在下跌股票的機率 — 即使模型預測某檔會上漲,若目前仍處於下跌趨勢,價格可能繼續走跌,預測才會兌現。
- 提升風險調整後報酬 — 基本面/機器學習訊號搭配技術面趨勢過濾是常見的量化手法。
再平衡頻率
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 從歷史資料學到的規律可能暫時失效,此時模型預測會落後實際走勢。將預測視為排序訊號而非絕對報酬預測,並搭配風控上的單檔部位與停損,能降低模型失準帶來的傷害。