機器學習
相關函式庫安裝
必要安裝
安裝核心套件(finlab、TA-Lib):
模型函式庫(選用)
finlab.ml.qlib 可搭配多種模型(LightGBM、XGBoost、CatBoost、PyTorch、TensorFlow 等)。需要時依官方文件安裝;Colab 多數已預裝。
機器學習流程較複雜,推薦搭配 AI 助手
從特徵工程到模型訓練,ML 策略涉及多個步驟。安裝 FinLab Skill 後,AI 編程助手可協助選擇特徵、切分資料集、訓練模型與解讀回測結果。
特徵處理
使用 Combine 函數合併特徵
finlab.ml.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()
| pb | pe | |
|---|---|---|
| (Timestamp('2010-01-04 00:00:00'), '1101') | 1.47 | 18.85 |
| (Timestamp('2010-01-04 00:00:00'), '1102') | 1.44 | 14.58 |
| (Timestamp('2010-01-04 00:00:00'), '1103') | 0.79 | 40.89 |
| (Timestamp('2010-01-04 00:00:00'), '1104') | 0.92 | 73.6 |
- 合併技術指標為一個特徵集 :
| talib.HT_DCPERIOD__real__ | talib.HT_DCPHASE__real__ | talib.HT_PHASOR__quadrature__ | |
|---|---|---|---|
| (Timestamp('2024-04-01 00:00:00'), '9951') | 23.4372 | 122.135 | -0.0107087 |
| (Timestamp('2024-04-01 00:00:00'), '9955') | 18.4416 | 68.0654 | -0.0168584 |
| (Timestamp('2024-04-01 00:00:00'), '9958') | 30.1035 | -10.7866 | 0.159777 |
| (Timestamp('2024-04-01 00:00:00'), '9960') | 17.5025 | 94.0009 | 0.00310615 |
| (Timestamp('2024-04-01 00:00:00'), '9962') | 23.2931 | 90.0781 | -0.0145453 |
使用 Talib 產生技術指標
finlab 提供 ta 和 ta_names 兩個函數,用於產生 TA-Lib 指標特徵。
ta_names 函數
ta_names 會產生一組 TA-Lib 指標名稱,每個名稱對應一組參數設定。
- n:每個指標隨機產生的參數組數。
n=10表示每個指標會有 10 組不同參數。
['talib.HT_DCPERIOD__real__',
'talib.HT_DCPHASE__real__',
'talib.HT_PHASOR__quadrature__',
'talib.HT_PHASOR__inphase__',
'talib.HT_SINE__sine__',
'talib.HT_SINE__leadsine__'
...
]
ta 函數
ta 根據 ta_names 產生的指標名稱列表,計算對應的指標值。
resample:選填,將計算出的指標值重新取樣到指定頻率。
from finlab.ml import feature as mlf
mlf.ta(['talib.HT_DCPERIOD__real__',
'talib.HT_DCPHASE__real__',
'talib.HT_PHASOR__quadrature__'], resample='W')
| talib.HT_DCPERIOD__real__ | talib.HT_DCPHASE__real__ | |
|---|---|---|
| (Timestamp('2024-04-07 00:00:00'), '9951') | 23.4372 | 122.135 |
| (Timestamp('2024-04-07 00:00:00'), '9955') | 18.4416 | 68.0654 |
| (Timestamp('2024-04-07 00:00:00'), '9958') | 30.1035 | -10.7866 |
| (Timestamp('2024-04-07 00:00:00'), '9960') | 17.5025 | 94.0009 |
| (Timestamp('2024-04-07 00:00:00'), '9962') | 23.2931 | 90.0781 |
標籤生成
使用 Label 函數生成標籤
finlab.ml.label 提供多種報酬/風險標籤計算,便於訓練預測模型。
預測 daytrading_percentage
此函數計算給定周期內市場價格的百分比變化,特別是從開盤價到收盤價的變化。
resample:需與combine的resample一致,以對齊時間。period:計算未來 N 期(由resample定義)的變化。
from finlab.ml import feature as mlf
from finlab.ml import label as mll
feature = mlf.combine(...)
label = mll.daytrading_percentage(feature.index)
datetime instrument
2007-04-23 0015 0.000000
0050 0.003454
0051 0.004874
0052 0.006510
01001T 0.001509
dtype: float64
預測N天後的報酬率
計算在給定周期內的百分比變化,用於分析中長期表現。
Maximum Adverse Excursion
MAE:持有期內的最大不利變動(目前不支援 resample)。
Maximum Favorable Excursion
MFE:持有期內的最大有利變動(目前不支援 resample)。
Excess Over Median
相對同期全市場收益「中位數」的超額收益。
Excess Over Mean
相對同期全市場收益「均值」的超額收益。
請確保 index 與市場設定正確;標籤可直接搭配特徵用於模型訓練。
使用 Qlib 套件模型訓練
WrapperModel 將 LightGBM、XGBoost、CatBoost、線性模型、TabNet、DNN 等模型封裝成統一的 fit / predict 介面。
LGBModel
封裝 LightGBM 模型。
import finlab.ml.qlib as q
# 構建 X_train, y_train, X_test
model = q.LGBModel()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
如何建構 X_train, y_train, X_test?
以 2020 年前為訓練集的範例:
XGBModel
封裝 XGBoost 模型。
DEnsmbleModel
封裝雙重集成模型。
CatBoostModel
封裝 CatBoost 模型。
LinearModel
封裝線性模型。
TabnetModel
封裝 TabNet 模型。
DNNModel
封裝深度神經網絡模型。
封裝讓你專注在特徵與策略,不必陷入模型細節。
get_models
get_models 可快速取得可用模型清單並初始化,方便進行多模型試驗。
import finlab.ml.qlib as q
# 獲取所有可用的模型
models = q.get_models()
# 列印出所有模型的名稱
print(list(models.keys()))
# 選擇一個模型進行實例化,例如 LightGBM
model = models['LGBModel']()
# 假設已經準備好了訓練數據和測試數據 X_train, y_train, X_test
# model
model.fit(X_train, y_train)
# 使用訓練好的模型進行預測
y_pred = model.predict(X_test)
進行回測
使用 sim 進行回測,計算策略收益與風險指標: