跳轉到

機器學習

相關函式庫安裝

必要安裝

安裝核心套件(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 策略涉及多個步驟。安裝 FinLab Skill 後,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')