更多精彩內容,歡迎關注公眾號:數量技術宅,也可新增技術宅個人微訊號:sljsz01,與我交流。
微軟亞洲研究院釋出了 AI 量化投資開源平臺“微礦 Qlib”。Qlib 涵蓋了量化投資的全過程,為使用者的 AI 演算法提供了高效能的底層基礎架構,從框架設計上讓使用者可以更容易地應用 AI 演算法來輔助解決量化投資的各個關鍵問題,比如 Alpha 因子構建、風險預測、市場動態性建模等等。
Qlib 覆蓋了量化投資的全過程,從底層構造開始就專為 AI 而生,從資料處理到計算力支撐,再到模型的訓練與驗證,都為基於 AI 的量化投資提供了全方位的框架支援。使用者可以通過 Qlib 平臺提供的多個工具模組,更加輕鬆地管理和使用自己的演算法,特別是其 AI 演算法。Qlib 的架構如下圖所示:
最底層的是基礎架構層(Infrastructure)。Qlib 的資料服務模組(Data Server)提供了高效能的資料儲存設計,讓 AI 演算法可以更快地處理更多金融資料。訓練模組(Trainer)則為 AI 演算法提供了靈活的介面來定義訓練模型的過程,讓 Auto-ML 等演算法成為可能,也為分散式訓練提供了介面。而模型管理模組(Model Manager)可以讓使用者更好地管理繁多的 AI 模型,更快地迭代其 AI 演算法。
中間層是量化投資流程(Workflow)。資訊抽取模組(Information Extractor)負責從異構資料中提取有效的資訊,因為用 AI 進行投資分析資料是關鍵,儘管金融行業有一定的資料基礎,但 AI 模型可以直接使用的高質量資料仍然十分有限,所以這就需要更多精細化處理和資訊抽取。之後,預測模型(Forecast Model)會輸入抽取的資訊,輸出可供金融專家參考的未來收益、風險等等預測,然而預測模型需要依靠底層海量資料才能訓練出精準、有效的預測模型。而投資組合生成模組(Portfolio Generator)則能根據預測得到 Alpha 訊號和風險訊號輔助生成投資策略組合。訂單執行模組(Order Executor)是投資的最後一步——交易執行,幫助使用者判斷何時下單也是一門藝術。在量化投資中,幾乎不可能有一個模型在全時段都一直保持卓越的表現,所以對市場動態性建模,以及在不同時期適時地調整模型、策略、執行也是一個非常重要的課題。Qlib 中元控制器模組 (Meta Controller) 的設計正是要支援這類問題的研究,實時提供精準的參考資訊和方案,輔助使用者進行操作。
最上層是互動層(Interface)。其中,分析模組(Analyzer)會根據下層的預測訊號、倉位、執行結果做出詳細的分析並呈現給使用者。
特別的,Qlib內建了時序量價資料、業內常用因子、以及 常見的金融 AI 模型(例如 LightGBM、GRU、GATs 等十幾個模型) , 大大降低了 AI 使用的專業門檻 。Qlib內建資料集和模型分類如下。
資料準備
QLib的測試資料支援線上、離線兩種模式,QLib預設的是啟用離線模式,該模式下,所有的回測資料的儲存與讀取都將在本地進行,而線上模式的資料將會部署在微軟的伺服器端。我們更推薦大家使用離線模式來進行策略研發,第一是策略資料一次落地即可使用,無需反覆傳輸,無網路時同樣可以測試;第二是策略程式碼完全在本地執行,保證了策略的安全性。
我們以離線模式為例,為大家展示QLib的資料準備過程。QLib包中提供了從雅虎財經獲取金融資料的指令碼,只需要在控制檯呼叫對應的Python指令碼,制定資料的儲存路徑,就能將資料下載到本地了。
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn
我們將程式碼儲存在家目錄下的qlib_data資料夾內,完成下載後,我們檢視對應目錄,找到對應的資料位置。
下一步,我們呼叫QLib庫中的相關方法,嘗試讀取我們剛才下載到本地的資料,並嘗試讀取CIS300指數的成分股。
import qlib
from qlib.data import D
qlib.init(provider_uri='~/.qlib/qlib_data/cn_data')
instruments = D.instruments(market='csi300')
D.list_instruments(instruments=instruments, start_time='2010-01-01', end_time='2017-12-31', as_list=True)[:20]
workflow配置
在資料落地到本地,並且成功使用QLib庫讀取到本地資料之後,我們再來看QLib中最重要的一個配置檔案,該配置檔案叫做workflow。workflow中需要配置資料集地址、策略回測引數、訓練模型引數、模型儲存地址等,在整個測試過程中的關鍵配置。我們來看QLib一個完整的workflow配置示例。該示例包含兩部分程式碼,我們分別展示,首先是qlib_init部分。
qlib_init:
provider_uri: "~/.qlib/qlib_data/cn_data"
region: cn
market: &market csi300
benchmark: &benchmark SH000300
data_handler_config: &data_handler_config
start_time: 2008-01-01
end_time: 2020-08-01
fit_start_time: 2008-01-01
fit_end_time: 2014-12-31
instruments: *market
port_analysis_config: &port_analysis_config
strategy:
class: TopkDropoutStrategy
module_path: qlib.contrib.strategy.strategy
kwargs:
topk: 50
n_drop: 5
backtest:
verbose: False
limit_threshold: 0.095
account: 100000000
benchmark: *benchmark
deal_price: close
open_cost: 0.0005
close_cost: 0.0015
min_cost: 5
qlib_init部分的關鍵配置引數包括:回測資料儲存路徑(provider_uri),即我們剛才下載資料的路徑;market:股票池的選股範圍是csi300;benchmark:策略比較基準是滬深300指數;start_time、end_time代表策略測試的起始、終止時間,而fit_start_time、fit_end_time代表訓練樣本的起始、終止時間;strategy:策略的選股規則,我們採用TopkDropoutStrategy,即選中topk的股票,並去掉n_drop數量;backtest是歷史回測的引數,包括策略閾值、初始資金、成交價格、手續費等的設定。然後,我們來看第二部分,task部分的配置程式碼。
task:
model:
class: LGBModel
module_path: qlib.contrib.model.gbdt
kwargs:
loss: mse
colsample_bytree: 0.8879
learning_rate: 0.0421
subsample: 0.8789
lambda_l1: 205.6999
lambda_l2: 580.9768
max_depth: 8
num_leaves: 210
num_threads: 20
dataset:
class: DatasetH
module_path: qlib.data.dataset
kwargs:
handler:
class: Alpha158
module_path: qlib.contrib.data.handler
kwargs: *data_handler_config
segments:
train: [2008-01-01, 2014-12-31]
valid: [2015-01-01, 2016-12-31]
test: [2017-01-01, 2020-08-01]
record:
- class: SignalRecord
module_path: qlib.workflow.record_temp
kwargs: {}
- class: PortAnaRecord
module_path: qlib.workflow.record_temp
kwargs:
config: *port_analysis_config
task部分,包含三個小類別的配置,分別是model(模型相關)、dataset(訓練測試集相關)、record(模型儲存相關)。在model的配置中,這裡我們採用了lgb的模型,並在後續制定了關鍵的模型引數,比如誤差衡量指標、學習率等等;而在dataset的配置中,我們採用了系統內建的Alpha158常用因子,並且將整體資料按時間分成了訓練集、驗證集和測試集三部分;最後一個record的配置,主要記錄了訓練過程、訓練模型的儲存路徑,方便後續策略構建完畢的展示與評估。
我們只需要將qlib_init、task兩部分程式碼合併儲存到同一個檔案下,檔案字尾.yaml,例如我們將配置檔案儲存為test.yaml,再使用QLib庫中的qrun函式呼叫.yaml的配置檔案,即可完成整個策略執行過程了。
qrun test.yaml
示例策略
最後,我們為大家執行一個QLib官方提供的示例策略,向大家展示策略執行的完整過程。我們找到示例策略目錄examples下,選擇lightGBM模型構建的示例策略,並找到該示例策略的workflow,也就是我們在上一小節提到的.yaml檔案。
同樣的,對於配置好的workflow,採用qrun + workflow,一句話啟動策略運算。
qrun /examples/benchmarks/LightGBM/workflow_config_lightgbm_Alpha158.yaml
執行完成後,策略的關鍵結果會被記錄在workflow指定的儲存目錄中, 更多的過程資訊會被寫入主目錄下的workflow_by_code.ipynb 中,我們可以用Jupyter執行該檔案,檢視更豐富的策略報告。
仔細閱讀一下workflow_by_code中的程式碼,可以看到模型建立、執行、預測等全部資料都已經儲存完畢,我們只需要按順序執行程式碼,即可檢視策略的視覺化結果。包括策略的回測曲線、分組收益率、每期IC係數、IC月度均值及分佈等等。
當然,QLib的功能強大,能玩的策略、資料、輸出,遠遠不止我們上述舉例的這些,如果大家對於AI量化投資感興趣,可以嘗試用QLib做輪子,創造自己的AI策略。
想要獲取本次分享的完整程式碼,或是任何關於資料分析、量化投資的問題,歡迎新增技術宅微信:sljsz01,與我交流
往期乾貨分享推薦閱讀
Omega System Trading and Development Club內部分享策略Easylanguage原始碼
【數量技術宅|量化投資策略系列分享】基於指數移動平均的股指期貨交易策略
AMA指標原作者Perry Kaufman 100+套交易策略原始碼分享
【數量技術宅|金融資料系列分享】套利策略的價差序列計算,恐怕沒有你想的那麼簡單
【數量技術宅|量化投資策略系列分享】成熟交易者期貨持倉跟隨策略
【數量技術宅|金融資料分析系列分享】為什麼中證500(IC)是最適合長期做多的指數
商品現貨資料不好拿?商品季節性難跟蹤?一鍵解決沒煩惱的Python爬蟲分享
【數量技術宅|金融資料分析系列分享】如何正確抄底商品期貨、大宗商品