策略範例
機器學習範例策略
本頁內容5
這個範例用機器學習選股:透過 XGBoost 模型(經由 qlib 整合)預測股票未來報酬,再結合技術面的趨勢過濾建構投資組合。適合想看一個最精簡、從特徵到回測完整跑過一次的機器學習策略的人。
策略邏輯
- 特徵:股價淨值比(PB)和本益比(PE),用
feature.combine()整合成特徵矩陣,以週為重新取樣頻率。 - 標籤:未來 12 週的報酬率,用
label.return_percentage()計算。 - 訓練與測試:2020-01-01 之前的資料作為訓練集,之後的資料作為測試集,用 qlib 提供的
XGBModel訓練與預測。 - 選股:收盤價高於 60 日均線的股票中,選出預測值最高的前 10 檔。
- 換股:每季一次。
完整程式碼
執行前要先安裝 qlib 相依套件,方法見機器學習。
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):只保留處於中期多頭趨勢的股票。這有兩個作用:- 降低暴露在下跌股票的機率:即使模型預測某檔會上漲,若目前仍處於下跌趨勢,價格可能繼續走跌,預測才會兌現。
- 提升風險調整後報酬:基本面/機器學習訊號搭配技術面趨勢過濾,是常見的量化手法。
持股檔數
is_largest(10):集中持有模型預測值最高的前 10 檔,兼顧訊號強度與分散度。換股頻率
resample='Q':季頻與預測期(12 週 ≈ 1 季)相符。每季根據最新預測重構投資組合,既讓模型能隨市場變化調整,又能控制週轉率。
什麼行情有效
這個策略把「機器學習預測的未來報酬」與「中期技術趨勢」結合:模型從 PB、PE 等估值特徵學出哪些特徵組合對應較佳的未來報酬,再由 60 日均線過濾掉仍在下跌趨勢的股票。預期在價值因子與動能因子都有效的市場環境下表現最佳。
當風格劇烈輪動(例如成長股連續大跌後快速反彈),XGBoost 從歷史資料學到的規律可能暫時失效,模型預測會落後實際走勢。把預測當成排序訊號而非絕對報酬預測,並搭配單檔部位與停損等風控,能降低模型失準帶來的傷害。
下一步
這一頁有幫到你嗎?