文件
開啟 Studio

架構與設計

模組架構

本頁內容8

這一頁用圖說明 FinLab 的模組怎麼分工、資料怎麼在模組之間流動。想看懂 FinLab 的結構,或想自己擴充功能,從這裡開始。

整體架構:從資料層一路到交易層

FinLab 採用分層架構,底層是資料層,頂層是交易層,資料由下往上走:

資料層 Data Layer

策略層 Strategy Layer

回測層 Backtest Layer

分析層 Analysis Layer

交易層 Trading Layer

finlab.portfolio
組合管理

finlab.online
實盤交易

finlab.analysis
策略分析

finlab.optimize
參數優化

finlab.plot
資料視覺化

finlab.backtest
回測引擎

finlab.report
報告生成

finlab.market
市場物件

finlab.ml.feature
特徵工程

finlab.ml.label
標籤生成

finlab.ml.qlib
模型訓練

finlab.data
資料存取

finlab.dataframe
FinlabDataFrame

  • 資料層:finlab.data 下載資料,交給 FinlabDataFrame 做運算。
  • 策略層:用機器學習產生持股時,依序經過特徵工程(finlab.ml.feature)、標籤生成(finlab.ml.label)、模型訓練(finlab.ml.qlib)。一般的選股條件不經過這一層,直接交給回測。
  • 回測層:finlab.backtest 依市場物件(finlab.market)模擬交易,產生回測報告(finlab.report)。
  • 分析層:拿報告做深度分析(finlab.analysis)或參數優化(finlab.optimize,會回頭重跑回測);finlab.plot 負責畫圖。
  • 交易層:finlab.portfolio 管理多策略組合,finlab.online 實際送單給券商。
完整資料流:從資料來源到實盤部位

技術指標

機器學習

參數優化

深度分析

視覺化

實盤交易

資料來源
GCS/BigQuery

finlab.data.get

DataFrame

用途?

FinlabDataFrame
運算方法

ml.feature
特徵工程

產生訊號
bool DataFrame

ml.label
標籤生成

ml.qlib
模型訓練

預測權重
float DataFrame

finlab.backtest.sim

Report 物件

分析類型?

optimize.sim_conditions

analysis 模組

plot 模組

online.OrderExecutor

分析報告

互動式圖表

券商 API

實盤部位

每個模組負責什麼

點模組名稱可以看它的 API 參考。

模組主要類別/函數用途依賴模組
finlab.dataget()從資料庫取得財經資料(無)
finlab.dataframeFinlabDataFrame增強版 DataFrame,支援金融運算pandas
finlab.backtestsim()回測引擎,模擬交易data、dataframe、market
finlab.reportReport回測報告、績效分析backtest
finlab.optimizesim_conditions()、ReportCollection測試多個條件組合backtest
finlab.analysisLiquidityAnalysis、MaeMfeAnalysis 等深度策略分析report
finlab.marketMarket、TWMarket、USMarket、USFundMarket市場資料與特性data
finlab.ml.featureta()、combine()機器學習特徵工程data
finlab.ml.labelreturn_percentage()、excess_over_mean() 等機器學習標籤生成data
finlab.ml.qlibLGBModel()、XGBModel() 等模型訓練ml.feature、ml.label
finlab.portfolioPortfolio、PortfolioSyncManager多策略組合管理report
finlab.onlineOrderExecutor、SinopacAccount 等券商帳戶實盤交易執行report、portfolio
finlab.plotplot_candles()、StrategyReturnStats資料視覺化dataframe

從資料到回測報告:最基本的流程

一個策略最少只要四步:下載資料、算指標、寫出持有條件、交給 sim() 回測。

from finlab import data
from finlab.backtest import sim

close = data.get('price:收盤價')
position = close > close.average(20)
report = sim(position, resample='M')
report.display()

這段程式在模組之間的往返:

Report 物件finlab.backtestFinlabDataFramefinlab.data使用者Report 物件finlab.backtestFinlabDataFramefinlab.data使用者data.get('price:收盤價')DataFrame計算指標 .average(20)FinlabDataFrame產生訊號 close > ma20bool DataFramesim(position, resample='M')建立 Report 物件回測結果report.display()顯示績效圖表

模組之間傳遞的資料

資料類型格式說明範例
價格資料pd.DataFrameindex 是日期,columns 是股票代號data.get('price:收盤價')
選股訊號pd.DataFrame(bool)True 代表買入,False 代表不持有close > ma20
持倉權重pd.DataFrame(float)0 到 1 之間,代表持倉比例ML 模型預測
交易記錄pd.DataFrame逐筆交易的詳細資訊report.get_trades()
績效指標dict策略的各種統計指標report.get_stats()
對照指數pd.Series時間序列的價格資料TWMarket.get_benchmark()

條件算出來是一張 True/False 的表。需要出場條件時先用 hold_until 加上,否則直接當成 position 交給 sim():

是

否

條件判斷
close > ma20

bool DataFrame
True/False

是否需要出場邏輯?

hold_until
加入出場條件

直接作為 position

finlab.backtest.sim
執行回測

Report 物件
包含績效與交易

常見的工作流程

完整的策略開發大致依序經過:資料 → 指標計算 → 產生訊號 → 參數優化 → 深度分析 → 樣本外測試 → 實盤交易。下面是其中幾段各自的流程。

一次測試多個條件組合

把多個候選條件組成 dict 交給 sim_conditions(),它會產生所有組合(n 個條件共 2^n - 1 種)並各跑一次回測,收進 ReportCollection。用熱力圖、棒狀圖或折線圖比較後,用最好的組合重新回測:

熱力圖

棒狀圖

折線圖

定義多個候選條件

組合成 dict

使用 sim_conditions

生成所有組合
2^n - 1 種

對每個組合執行回測

收集所有 Report

建立 ReportCollection

選擇視覺化方式

plot_stats heatmap

plot_stats bar

plot_creturns

找出最佳組合

使用最佳組合重新回測

詳細用法見策略參數優化。

用機器學習產生持股權重

依序做特徵工程、標籤生成、模型訓練,用模型預測持股權重後回測。績效不滿意就回頭調整特徵或模型;滿意後做深度分析與樣本外測試,通過驗證才部署實盤:

否

是

否

是

載入原始資料
finlab.data

特徵工程
finlab.ml.feature

標籤生成
finlab.ml.label

模型訓練
finlab.ml.qlib

預測持倉權重

回測
finlab.backtest.sim

績效是否滿意?

調整特徵或模型

執行深度分析

樣本外測試

通過驗證?

部署實盤

詳細步驟見機器學習策略流程。

把回測結果拿去實盤下單

用 report.upload(name) 上傳策略、report.position_info() 取得持股清單,設定好券商帳戶後交給 OrderExecutor,由它計算買賣清單並送單:

券商 APIOrderExecutorAccount 物件Report 物件使用者券商 APIOrderExecutorAccount 物件Report 物件使用者report.upload(name)上傳成功report.position_info()持股清單設定券商帳戶連線成功OrderExecutor(report, account)計算買賣清單executor.execute()發送買單買單回報發送賣單賣單回報執行完成查詢部位取得部位資訊部位資料顯示實盤持股

詳細設定見下單:單一策略。

把多個策略合成一個組合

多個策略的報告交給 Portfolio 組合,再由 PortfolioSyncManager 同步到實盤:

策略 A report →
策略 B report →  Portfolio → PortfolioSyncManager → 實盤多策略
策略 C report →

詳見多策略組合管理。

擴充 FinLab:從哪個類別開始

熟悉基本回測後,依你想加的功能選起點:

多策略組合

自訂市場

自訂分析

機器學習

熟悉基礎回測

開發需求?

學習 finlab.portfolio
組合管理

繼承 Market 類別
開發自訂市場

繼承 Analysis 類別
開發分析模組

學習 finlab.ml
特徵、標籤、模型

多策略實盤

回測海外市場/加密貨幣

客製化分析報告

機器學習策略

進階應用

自訂市場:繼承 Market

Market 定義每個市場都要提供的方法:名稱、頻率、價格、對照指數、代號與名稱對照。台股、美股等市場都是它的子類別。完整做法見自訂市場物件。

«abstract»

Market

+get_name() : str

+get_freq() : str

+get_price() : DataFrame

+get_benchmark() : Series

+get_asset_id_to_name() : dict

TWMarket

+get_name() : "tw_stock"

+get_benchmark() : 加權指數

+get_industry() : dict

+market_close_at_timestamp()

USMarket

+get_name() : "us_stock"

+get_benchmark() : S&P 500

+market_close_at_timestamp()

ROTCMarket

+get_name() : "rotc_stock"

CustomMarket

+自訂資料來源

+get_name() : "custom"

自訂分析:繼承 Analysis

每種分析都實作 calculate_trade_info()、analyze()、display() 與 is_market_supported()。完整做法見策略分析模組。

«abstract»

Analysis

+calculate_trade_info() : list

+analyze() : dict

+display() : Figure

+is_market_supported() : bool

LiquidityAnalysis

+流動性風險檢測

+漲跌停、成交量

MaeMfeAnalysis

+波動分析

+MAE/MFE 12 子圖

PeriodStatsAnalysis

+時期穩定性

+年度、月度表現

InequalityAnalysis

+不等式因子

+基尼係數

AlphaBetaAnalysis

+Alpha/Beta 分析

DrawdownAnalysis

+回撤分析

CustomAnalysis

+自訂分析邏輯

FinlabDataFrame 在 pandas 上加了什麼

FinlabDataFrame 繼承 pandas 的 DataFrame,多了選股常用的方法:

«pandas»

DataFrame

+基本 DataFrame 功能

FinlabDataFrame

+average() : 移動平均

+is_largest() : 排名

+is_smallest() : 排名

+quantile() : 分位數

+hold_until() : 進出場語法糖

+and_then() : 組合邏輯

想把改動貢獻回 FinLab,見擴充開發。

讓回測跑得更快

同一份資料一次載入、重複使用,不要每次回測都重新呼叫 data.get();大量回測時可以考慮本地快取。快取怎麼運作見資料流程。

小
單一股票

中
數十個指標

大
大量回測

需要使用資料

資料量大小?

直接使用 data.get

一次載入
避免重複呼叫

考慮使用
本地快取

執行策略邏輯

回測本身太慢時:

瓶頸優化方法
條件組合過多先用單一條件篩選,移除差的條件
資料範圍過大縮短回測區間或增加 resample 週期
計算複雜度高使用向量化運算,避免迴圈
記憶體不足分批處理或使用更長的 resample

下一步

第一次接觸 FinLab,建議照這個順序認識各模組:

是

否

是

否

開始

學習 finlab.data
資料存取

學習 FinlabDataFrame
指標計算

學習 finlab.backtest
基礎回測

學習 Report 物件
績效分析

想要深入?

學習 finlab.analysis
深度分析

開始實盤交易
finlab.online

學習 finlab.optimize
參數優化

學習完整工作流程

想用機器學習?

學習 finlab.ml
機器學習模組

精通!

更多範例在台股實用範例與 FinLab GitHub。

↑↓ 選擇 Enter 開啟 Esc 關閉