跳至主要內容
台股研究 約 7 分鐘閱讀

Qlib 是什麼?用 finlab 在台股打造 AI 選股完整教學(Alpha158 + LightGBM)

Qlib 是微軟開源的 Python AI 量化投資平台,內建 Alpha158 / Alpha360 特徵與十餘種選股模型,但預設只有中、美股、沒有台股。這篇先講 Qlib 是什麼、強在哪,再用 finlab 把它接上台股:pip install 'finlab[qlib]' 後三行生成 Alpha158 特徵、用 q.get_models() 一鍵訓練 LightGBM 等模型,並完整交代回測方法與限制。

Qlib 是微軟開源的 AI 量化平台,卻沒有台股資料;finlab 幫你接上:三行生成 Alpha158 特徵、一鍵訓練多種 AI 模型。

Qlib 與 FinLab 整合在台股打造 AI 選股策略示意圖

Qlib 是微軟開源的 Python AI 量化投資研究平台,把資料處理、特徵生成、模型訓練、回測與下單決策串成一條龍,內建十餘種機器學習與深度學習的選股模型範例。 它最大的門檻是:預設資料只有中國(滬深 300)與美股,沒有台股,而且要自己把資料轉成 Qlib 的二進位格式、處理台股「一張 1000 股、漲跌停 10%」這些市場規則。這篇先把 Qlib 是什麼、強在哪講清楚,再示範用 finlab[qlib] 三步驟把它接上台股:把資料倒進 Qlib(q.dump())、生成 Alpha158 特徵(q.alpha())、用 q.get_models() 一鍵訓練 LightGBM、XGBoost 等模型來回測。

Qlib 關鍵數字

項目 內容
開發者 微軟亞洲研究院(Microsoft),GitHub 開源
語言 Python
內建市場資料 中國(滬深 300)、美股;預設不含台股
特徵資料集 Alpha158(158 個價量特徵)、Alpha360(360 個)
內建模型 十餘種,含梯度提升樹(LightGBM/XGBoost/CatBoost)與深度學習(TabNet/DNN/LSTM 延伸)
涵蓋流程 資料 → 特徵 → 建模 → 回測 → 下單決策(一條龍)
台股支援 透過 finlab[qlib] 接上(見下方台股實作)

Qlib 的三個特色

內建多種 AI 演算法模型

Qlib 最有價值的地方在於降低了使用 AI 演算法的門檻。套件內有十幾個機器學習與深度學習在股票交易上的應用範例,許多是相對新穎的架構,且都已模組化,換資料、調參數就能用。其中不少屬於 Self-attention 一類,例如 TRA(Temporal Routing Adaptor)把 LSTM 延伸成能學習多種策略風格的模型。想先理解 LSTM 在股價序列上的基本用法,可以參考我們用 LSTM 解析 K 線預測台股的實作。GitHub 上除了程式碼,也在 qlib/examples/benchmarks 附上對應論文,方便開發者追到方法本身。

現成的特徵資料集

AI 訓練的第一步是準備特徵,而生成好特徵並不容易。Qlib 基於股市資料建構了 Alpha158 與 Alpha360 兩套特徵集,把價量資料展開成大量訊號:

特徵集 特徵數 特性 記憶體需求
Alpha158 158 日常研究主力,價量訊號為主 全台股日頻偏大,週頻可省約 80%
Alpha360 360 更細緻,訊號更多 展開後常需上百 GB,需高階硬體

Workflow 與 Recorder 訓練管理

Workflow 層負責模型的訓練與回測,從尋找獲利因子(Alpha)與風險因子,一路到資產配置、選股、下單決策。搭配的 Recorder 流程管理器則用來記錄與儲存訓練過程與結果;AI 模型訓練時間長、偶爾中斷,Recorder 能讓你從中斷處續跑,不必從頭再來。

Qlib 背後的研究脈絡

Qlib 把近年「機器學習做資產定價」的研究成果工程化成一套可重複使用的平台。微軟團隊在 Yang et al. (2020) 提出 Qlib,定位為「AI 導向的量化投資平台」,目標是把資料處理、特徵工程、模型訓練到回測的流程標準化,讓不同模型能在同一套資料與評估標準下公平比較。

機器學習能否真的改善選股,學界已有具規模的證據。Gu, Kelly & Xiu (2020) 在 Review of Financial Studies 用美股數十年資料比較各種方法,發現樹模型與神經網路在預測股票報酬上,普遍優於傳統線性因子模型,主因是能捕捉因子之間的非線性與交互作用,這正是 Qlib 內建 LightGBM 與深度學習模型的理由。不過同一份研究也提醒:機器學習的優勢來自「組合大量弱訊號」,對資料品質與防止過擬合的要求很高,這也是後面實作會特別強調樣本內外切分與交易成本的原因。

為什麼 Qlib 預設跑不了台股

Qlib 是通用型框架,特徵幾乎都用價格序列製作,預設市場綁定滬深 300 與美股。要在台股使用,得自己處理兩件麻煩事:一是把台股資料轉成 Qlib 自家的 .bin 二進位格式(含日曆、商品清單、還原因子),二是設定台股的市場規則,包括成交單位一張 1000 股、漲跌停 10%、以收盤價成交。這兩件事工程量都不小,也是很多人卡關的地方。finlab 的 finlab.ml.qlib 模組把這兩件事包成函式,所以你不用碰 Qlib 底層。

安裝:一行帶起 finlab + Qlib

顯示程式碼
pip install 'finlab[qlib]'

模型後端是選用的,需要哪個再裝哪個(Colab 多半已預裝):

顯示程式碼
pip install lightgbm xgboost catboost
pip install ta-lib

桌機安裝 TA-Lib 用 conda install conda-forge::ta-lib;Colab 上則用 pip install ta-lib-bin。第一次跑到需要資料時,finlab 會自動引導你登入,照指示操作即可,程式碼不需要手動填任何 token。

三行:把台股倒進 Qlib、生成 Alpha158 特徵

顯示程式碼
from finlab.ml import qlib as q
 
q.dump()                    # 把台股資料轉成 Qlib 格式(第一次執行較久)
q.init()                    # 以台股設定初始化 Qlib(一張 1000 股、漲跌停 10%、收盤價成交)
f158 = q.alpha("Alpha158")  # 生成 158 種價量特徵

q.dump() 會把台股的開高低收、成交量與還原因子寫成 Qlib 的 .bin 資料庫;q.init() 等同台股版的 qlib.init(),自動把成交單位設成 1000 股、漲跌停 0.1、成交價設為收盤價。q.alpha() 支援 Alpha158 與 Alpha360 兩種特徵集(差異見上方表格)。

Alpha158 在全台股、日頻展開後資料量很大。把頻率改成「週」可以省下約 80% 的資料量,在 50GB RAM 的環境(如 Colab Pro)勉強跑得動:

顯示程式碼
from finlab.ml import label as mll
from finlab.ml import feature as mlf
 
features = mlf.combine({
    'qlib': f158,
}, resample='W')
 
labels = mll.return_percentage(features.index, period=2)

mlf.combine 把特徵重採樣到週頻並對齊索引,mll.return_percentage 生成「未來 2 期報酬率」當訓練標籤。實務上 Alpha158 裡的 VWAP0 欄位會整欄是空值,訓練前先移除(或用 mlf.combine 自行補一份 VWAP):

顯示程式碼
features = features.drop('VWAP0', axis=1)

一鍵叫出所有 Qlib 模型來訓練

finlab 把 Qlib 的模型工廠包成 q.get_models(),回傳一整批可直接訓練的模型;缺哪個後端(例如沒裝 CatBoost)就自動略過,不會中斷:

顯示程式碼
model_templates = q.get_models()

目前可取得的模型如下表,涵蓋梯度提升樹到深度學習:

模型 類型 適用情境
LGBModel LightGBM 梯度提升樹 速度快、表格特徵首選,本文表現最佳
XGBModel XGBoost 梯度提升樹 與 LightGBM 同類,調參空間大
CatBoostModel CatBoost 梯度提升樹 對類別特徵與過擬合較穩健
DEnsmbleModel 雙重整體(Double Ensemble) 多模型整合,降低單一模型偏誤
LinearModel 線性模型 當基準線,解釋性高
TabnetModel TabNet 深度學習 表格資料的注意力網路
DNNModel 深度神經網路 需較多資料與算力
SFMModel State Frequency Memory 把序列拆成不同頻率成分學習

訓練時把資料切成樣本內(2020 年以前)與樣本外(2020 年以後),逐一訓練並隨手存檔,避免 RAM 中途爆掉得從頭來過:

顯示程式碼
import os
import gc
import pickle
import numpy as np
 
model_templates = q.get_models()
is_train = features.index.get_level_values('datetime') < '2020-01-01'
 
model_path = './models.pkl'
models = {}
if os.path.isfile(model_path):
    with open(model_path, 'rb') as f:
        models = pickle.load(f)
 
for name, Model in model_templates.items():
    if name in models or name == 'DNNModel':
        continue
 
    X_train = features.loc[is_train]
    y_train = labels.loc[is_train]
 
    # 清掉 inf / NaN 後再訓練,避免某些模型報錯
    ok = X_train.replace([np.inf, -np.inf], np.nan).notna().all(axis=1) \
        & y_train.replace([np.inf, -np.inf], np.nan).notna()
    model = Model()
    model.fit(X_train.loc[ok], y_train.loc[ok])
 
    models[name] = model
    with open(model_path, 'wb') as f:
        pickle.dump(models, f)
    gc.collect()

每個模型在 fit() 時會自動從訓練集切出驗證集,用來監控過擬合,這也是用 finlab 包裝後省事的地方。

樣本外回測:比較各模型的選股能力

把訓練好的模型套到 2020 年以後的樣本外資料,產生預測分數,再用 finlab 的 sim() 月頻回測。下面對每個模型都選預測分數最高的 20 檔股票:

顯示程式碼
from finlab.backtest import sim
from finlab import data
import matplotlib.pyplot as plt
 
ys = {name: model.predict(features[~is_train]) for name, model in models.items()}
 
reports = {}
for name, y in ys.items():
    with data.universe('TSE_OTC'):
        close = data.get('price:收盤價')
        report = sim(y[close.notna()].is_largest(20), resample='M', upload=False)
        reports[name] = report
        report.creturn.plot(label=name)
 
plt.legend()
plt.show()

各 Qlib 模型在台股樣本外的累積報酬率比較曲線圖

不同模型的選股能力有明顯差距。把每個模型的回測指標整理成表後可以看到,梯度提升樹這一類(以 LGBModel 為代表)在這段樣本外期間的表現相對突出:

各 Qlib 模型在台股的選股績效比較表

以表現最好的 LGBModel 為例,再加上兩道實務濾網:20 日均量大於 20 萬股(避免買到回測買得到、實單買不到的低流動性股),以及股價站上近 10 日高點(順勢),縮到只選 10 檔:

顯示程式碼
y = ys['LGBModel']
 
with data.universe('TSE_OTC'):
    close = data.get('price:收盤價')
    vol = data.get('price:成交股數')
 
    liquid = vol.average(20) > 200_000      # 流動性濾網
    momentum = close >= close.rolling(10).max()  # 動能濾網
 
    position = y[liquid & momentum].is_largest(10)
    report = sim(position, resample='M', upload=False)
    report.display()

LightGBM 加流動性與動能濾網後的台股樣本外回測績效報告

完整的權益曲線、年化報酬、最大回撤與夏普值都在上面的回測報告裡。把這段程式碼當成起點,換特徵、換濾網、換再平衡頻率,都能延伸出自己的版本。

回測方法與限制

AI 模型最容易給人「指標漂亮、方法很薄」的錯覺,所以把這個範例的設定與沒做到的地方一次講清楚:

  • 交易成本sim() 預設已內扣台股手續費 0.1425% 與賣出證交稅 0.3%,月頻再平衡的成本已反映在績效裡。
  • 股票池與流動性:宇宙為上市加上櫃(TSE_OTC);最後一版策略加了 20 日均量大於 20 萬股的流動性門檻,但未估算策略容量(資金規模拉大後的衝擊成本未計)。
  • 樣本內外:2020 年以前訓練、2020 年以後測試,屬於單一切點的樣本外,沒有做滾動重訓練;參數(選 10 檔、近 10 日高、月頻)未做敏感度掃描。
  • 前視偏差:特徵與標籤都用 combine 對齊索引,標籤是「未來 2 期報酬」,預測時只用樣本外特徵,沒有用到未來資料。
  • 基準對照:本文聚焦各模型之間的相對比較,未與含息 0050 做同口徑對照;想看「贏不贏大盤」的嚴謹比較,可參考〈台股選股回測:單因子全輸 0050、複合策略風險調整後勝出〉的基準口徑。
  • 模型的時運:AI 模型對市場結構(regime)敏感,這幾個月的整體表現偏弱,不代表方法失效,但也提醒:樣本外亮眼不等於未來保證,實單前務必自行重跑與驗證。

這段「沒做到什麼」比任何一個漂亮數字都重要,它決定了你能不能信任這個結果。

Qlib 和 finlab 怎麼選

面向 Qlib finlab
定位 通用 ML 量化研究框架 台股資料與回測為核心
內建資料 中、美股 台股(價量、財報、籌碼、月營收等)
強項 模型多樣、Workflow、訓練管理 台股資料齊全、sim() 回測、可用 AI 對話操作
台股使用 需自行接資料與市場規則 原生支援,pip install finlab 即可

兩者並不互斥:Qlib 提供模型與特徵的肩膀,finlab 補上台股資料與回測,用 finlab[qlib] 接起來就能在台股上享受 Qlib 的研究能力。想完整理解量化研究的全貌,可以從量化交易完整指南入門。

適合誰、不適合誰

適合:想用機器學習做選股研究、又不想從零打造工程框架的人;已熟悉 Python、想站在現成模型與特徵肩膀上的人。

不適合:只想要一鍵買賣訊號、不打算碰程式與模型訓練的人,這類需求用現成的台股選股策略或 AI 對話式操作會更省事。Qlib 的學習曲線偏陡、框架也較重,如果你的目標只是快速驗證一個選股想法,建議先用 finlab 把策略跑出來、確認方向有效,再回頭考慮要不要導入 Qlib 的 ML 流程。

常見問題(FAQ)

Qlib 是什麼?

Qlib 是微軟開源的 AI 量化投資研究平台,用 Python 把資料、特徵、建模、回測到下單決策整合成一條龍流程,內建十餘種機器學習與深度學習選股模型範例,定位是給研究者用的 AI 量化骨架。

Qlib 可以用在台股嗎?

可以,但 Qlib 本身沒有台股資料。透過 finlab 的 finlab.ml.qlib,用 q.dump() 把台股資料轉成 Qlib 格式、q.init() 套用台股市場規則,就能在台股上使用 Qlib 的 Alpha158/Alpha360 特徵與內建模型。

finlab[qlib] 怎麼安裝?

執行 pip install 'finlab[qlib]' 即可一次帶起 finlab 與 Qlib。模型後端(LightGBM、XGBoost、CatBoost)與 TA-Lib 是選用的,需要時再各自安裝。

Alpha158 和 Alpha360 差在哪?需要多少記憶體?

Alpha158 是 158 個價量特徵,是日常研究主力;Alpha360 是 360 個,更細但展開後常需上百 GB 記憶體。即使是 Alpha158,全台股日頻也很吃資源,把頻率改成週頻可省約 80% 資料量,50GB RAM 環境較能負荷。

q.get_models() 有哪些模型?

涵蓋 LGBModel(LightGBM)、XGBModel(XGBoost)、CatBoostModel、DEnsmbleModel、LinearModel、TabnetModel、DNNModel、SFMModel。沒安裝對應後端的模型會自動被略過,不影響其他模型訓練。

為什麼要透過 finlab 使用 Qlib,而不是單獨用 Qlib?

Qlib 框架相對封閉,預設不含台股,也不容易和 sklearn、LightGBM 等生態無縫銜接。finlab 一方面補上台股資料與市場規則,一方面把特徵生成、模型訓練、回測接到自己的資料與 sim() 回測引擎,研究流程也能跟既有的台股因子策略共用同一套資料來源。

這個 AI 選股策略可以照抄拿去實單嗎?

不建議照抄就上。範例是單一切點的樣本外示範,沒有做容量估計、滑價假設與滾動重訓練,AI 模型又對市場結構敏感。把它當研究起點,自行重跑、加上停損與資金控管等風控機制後再評估,並先用小額或模擬部位驗證一段時間。

延伸閱讀


投資警語:本文為教學與研究分享,不構成投資建議。回測為歷史資料下的結果,不保證未來績效;AI 模型可能因市場結構改變而失效,實際投入前請自行驗證並控制風險。

最後更新:2026-06|回測區間:訓練 ~2019、樣本外 2020 年起|作者:FinLab 量化研究團隊(經量化研究員審閱)

FinLab AI

想建立自己的策略?

用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案

免費開始

更多技術指標研究

查看全部