文件
開啟 Studio

策略範例

機器學習範例策略

本頁內容5

這個範例用機器學習選股:透過 XGBoost 模型(經由 qlib 整合)預測股票未來報酬,再結合技術面的趨勢過濾建構投資組合。適合想看一個最精簡、從特徵到回測完整跑過一次的機器學習策略的人。

策略邏輯

  • 特徵:股價淨值比(PB)和本益比(PE),用 feature.combine() 整合成特徵矩陣,以週為重新取樣頻率。
  • 標籤:未來 12 週的報酬率,用 label.return_percentage() 計算。
  • 訓練與測試:2020-01-01 之前的資料作為訓練集,之後的資料作為測試集,用 qlib 提供的 XGBModel 訓練與預測。
  • 選股:收盤價高於 60 日均線的股票中,選出預測值最高的前 10 檔。
  • 換股:每季一次。

完整程式碼

執行前要先安裝 qlib 相依套件,方法見機器學習。

ml_strategy.py
from finlab import data
from finlab.ml import feature as mlf
from finlab.ml import label as mll
import finlab.ml.qlib as q
from finlab.backtest import sim

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

# 標籤:未來 12 週的報酬率
label = mll.return_percentage(features.index, resample='W', period=12)

# 以 2020-01-01 切分訓練集與測試集
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 日均線、預測值最高的 10 檔,每季換股
close = data.get('price:收盤價')

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

sim(position, resample='Q')

想先看看特徵長什麼樣子,在建立 features 之後執行 features.head()。

怎麼調整

  • 特徵 mlf.combine({...}, resample='W'):PB、PE 是為了範例簡潔而選的最基本特徵,週頻重採樣能平滑日頻雜訊,同時保留足夠的時間解析度。實務上可以擴充更多面向:

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

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

  • 預測期 period=12:模型學習的目標是未來 12 週的報酬。

  • 模型 XGBModel:qlib 封裝的 XGBoost 實作,適合中等特徵數、非線性關係的選股問題。

  • 趨勢過濾 close > close.average(60):只保留處於中期多頭趨勢的股票。這有兩個作用:

    1. 降低暴露在下跌股票的機率:即使模型預測某檔會上漲,若目前仍處於下跌趨勢,價格可能繼續走跌,預測才會兌現。
    2. 提升風險調整後報酬:基本面/機器學習訊號搭配技術面趨勢過濾,是常見的量化手法。
  • 持股檔數 is_largest(10):集中持有模型預測值最高的前 10 檔,兼顧訊號強度與分散度。

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

什麼行情有效

這個策略把「機器學習預測的未來報酬」與「中期技術趨勢」結合:模型從 PB、PE 等估值特徵學出哪些特徵組合對應較佳的未來報酬,再由 60 日均線過濾掉仍在下跌趨勢的股票。預期在價值因子與動能因子都有效的市場環境下表現最佳。

當風格劇烈輪動(例如成長股連續大跌後快速反彈),XGBoost 從歷史資料學到的規律可能暫時失效,模型預測會落後實際走勢。把預測當成排序訊號而非絕對報酬預測,並搭配單檔部位與停損等風控,能降低模型失準帶來的傷害。

下一步

↑↓ 選擇 Enter 開啟 Esc 關閉