三分鐘玩轉微軟AI量化投資開源庫QLib

更多精彩內容,歡迎關注公眾號:數量技術宅,也可添加技術宅個人微訊號:sljsz01,與我交流。

微軟QLib簡介

微軟亞洲研究院發布了 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,與我交流

 

 


往期乾貨分享推薦閱讀

分享一個年化15%以上的無風險套利機會

網格交易系統開發

通過深度學習股價截面數據分析和預測股票價格

Omega System Trading and Development Club內部分享策略Easylanguage源碼

一個真實數據集的完整機器學習解決方案(下)

一個真實數據集的完整機器學習解決方案(上)

如何使用交易開拓者(TB)開發數字貨幣策略

股指期貨高頻數據機器學習預測

如何使用TradingView(TV)回測數字貨幣交易策略

如何投資股票型基金?什麼時間買?買什麼?

【數量技術宅|量化投資策略系列分享】基於指數移動平均的股指期貨交易策略

AMA指標原作者Perry Kaufman 100+套交易策略源碼分享

【 數量技術宅 | 期權系列分享】期權策略的「獨孤九劍」

【數量技術宅|金融數據系列分享】套利策略的價差序列計算,恐怕沒有你想的那麼簡單

【數量技術宅|量化投資策略系列分享】成熟交易者期貨持倉跟隨策略

如何獲取免費的數字貨幣歷史數據

【數量技術宅|量化投資策略系列分享】多周期共振交易策略

【數量技術宅|金融數據分析系列分享】為什麼中證500(IC)是最適合長期做多的指數

商品現貨數據不好拿?商品季節性難跟蹤?一鍵解決沒煩惱的Python爬蟲分享

【數量技術宅|金融數據分析系列分享】如何正確抄底商品期貨、大宗商品

【數量技術宅|量化投資策略系列分享】股指期貨IF分鐘波動率統計策略

【數量技術宅 | Python爬蟲系列分享】實時監控股市重大公告的Python爬蟲