跳轉到

機器學習

相關函式庫安裝

必要安裝

安裝核心套件(finlab、TA-Lib):

pip install finlab
pip install ta-lib

模型函式庫(選用)

finlab.ml.qlib 可搭配多種模型(LightGBM、XGBoost、CatBoost、PyTorch、TensorFlow 等)。需要時依官方文件安裝;Colab 多數已預裝。

  1. 安裝 LightGBM
  2. 安裝 XGBoost
  3. 安裝 CatBoost
  4. 安裝 Pytorch
  5. 安裝 Tensorflow

機器學習流程較複雜,推薦搭配 AI 助手

從特徵工程到模型訓練,ML 策略涉及多個步驟。先安裝 Codex 或 Claude Desktop,請 AI 執行 npx skills add https://github.com/koreal6803/finlab-ai --skill finlab 後,AI 編程助手可協助選擇特徵、切分資料集、訓練模型與解讀回測結果。

特徵處理

使用 Combine 函數合併特徵

finlab.ml.feature.combine 可合併多來源特徵(技術、基本面、自定義),並支援重採樣。範例如下:

  1. 合併股價淨值比和本益比為一個特徵集
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
  1. 合併技術指標為一個特徵集
from finlab.ml import feature as mlf
mlf.combine({
  'talib': mlf.ta(mlf.ta_names(n=1))
})
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 提供 tata_names 兩個函數,用於產生 TA-Lib 指標特徵。

ta_names 函數

ta_names 會產生一組 TA-Lib 指標名稱,每個名稱對應一組參數設定。

  • n:每個指標隨機產生的參數組數。n=10 表示每個指標會有 10 組不同參數。

from finlab.ml import feature as mlf
mlf.ta_names(n=1)
['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:需與 combineresample 一致,以對齊時間。
  • 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天後的報酬率

計算在給定周期內的百分比變化,用於分析中長期表現。

label = mll.return_percentage(feature.index, resample='W', period=1)

Maximum Adverse Excursion

MAE:持有期內的最大不利變動(目前不支援 resample)。

label = mll.maximum_adverse_excursion(feature.index, period=1)

Maximum Favorable Excursion

MFE:持有期內的最大有利變動(目前不支援 resample)。

label = mll.maximum_favorable_excursion(feature.index, period=1)

Excess Over Median

相對同期全市場收益「中位數」的超額收益。

label = mll.excess_over_median(feature.index, resample='M', period=1)

Excess Over Mean

相對同期全市場收益「均值」的超額收益。

label = mll.excess_over_mean(feature.index, resample='M', period=1)

請確保 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 年前為訓練集的範例:

is_train = features.index.get_level_values('datetime') < '2020-01-01'
X_train = features[is_train]
y_train = labels[is_train]
X_test = features[~is_train]

XGBModel

封裝 XGBoost 模型。

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

DEnsmbleModel

封裝雙重集成模型。

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

CatBoostModel

封裝 CatBoost 模型。

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

LinearModel

封裝線性模型。

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

TabnetModel

封裝 TabNet 模型。

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

DNNModel

封裝深度神經網絡模型。

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

封裝讓你專注在特徵與策略,不必陷入模型細節。

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 進行回測,計算策略收益與風險指標:

from finlab.backtest import sim

position = y_pred.is_largest(50)

sim(position, resample='4W')