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

數量技術宅發表於2021-04-07

更多精彩內容,歡迎關注公眾號:數量技術宅,也可新增技術宅個人微訊號: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爬蟲

相關文章