嘗鮮!微軟首個AI量化投資開源平臺Qlib上手體驗!

近日,微軟亞洲研究院正式發(fā)布了業(yè)內首個AI量化投資開源平臺Qlib,發(fā)布一個月以來已經在GitHub收獲2.3k+star!
值得關注的一點就是這套量化系統(tǒng)的框架分為多層,每層由多個松散耦合的模塊組成,因此每個模塊用戶都可以自行修改、定制、使用,如下圖所示
通過這樣的方式,可以讓用戶更快的了解整個工作流程,并靈活的進行調整,同時也支持在線和離線兩種模式,嗯,本地取數(shù)據(jù)、本地跑策略,隱私上也有一定的提升。
更多的宣傳點,本文不再過多介紹,下面將從用戶使用的角度講解如何安裝配置Qlib并構建一個量化交易模型。
安裝
安裝Qlib其實和其他第三方庫安裝類似,但畢竟要跑模型,并且依賴較多,所以可能會由于不同機器環(huán)境的問題,導致不同的錯誤,首先還是嘗試直接pip安裝
pip install pyqlib
當然我建議從GitHub上把源碼拉下來安裝
git clone https://github.com/microsoft/qlib.git && cd qlib
pip install .
我分別在macOS Big Sur和centos7下測試,在配置anaconda環(huán)境下,均出現(xiàn)不同的報錯,如果出現(xiàn)任何類似如下報錯
Failed building wheel for xxx
command 'x86_64-apple-darwin13.4.0-clang' failed with exit status 254
大概率是gcc編譯出現(xiàn)問題,可以先在shell中用gcc -v查看gcc的版本信息,之后在mac下可以嘗試檢查Xcode是否安裝并升級GCC版本之后嘗試如下代碼
export CC=gcc
export CXX=g++
如果提示任何與PyYAML包安裝失敗相關的報錯,可以嘗試自己手動卸載sudo pip uninstall PyYAML這個包再重新安裝。
為了更好的使用,我們還需要安裝配置好redis并啟動,此處不做更多講解,同時一定要注意,對照requires.txt,將版本不對的包進行升級,我就是由于pandas和numpy版本過低,導致無法啟動,最后聯(lián)系開發(fā)者才發(fā)現(xiàn)問題!
總之安裝過程中,可能會出現(xiàn)不同的問題,我們只要耐下心來,仔細閱讀報錯代碼,一點一點解決,總能成功安裝好。
配置數(shù)據(jù)
下載與初始化
在安裝好pyqlib后,我們還需要準備數(shù)據(jù),官方提供了從Yahoo Finance爬數(shù)據(jù)的方法,可以在命令行進入之前從GitHub拉下來的文件夾后執(zhí)行如下命令
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn
等待一會即可,之后我們可以進入~/.qlib/qlib_data/目錄下檢查數(shù)據(jù)是否被正確存儲
在搞定數(shù)據(jù)之后,在使用之前還需要進行初始化,進入Python后執(zhí)行如下命令
import qlib
# region in [REG_CN, REG_US]
from qlib.config import REG_CN
provider_uri = "~/.qlib/qlib_data/cn_data" # target_dir
qlib.init(provider_uri=provider_uri, region=REG_CN)
數(shù)據(jù)查詢
在上一步我們成功下載并配置好數(shù)據(jù)之后,現(xiàn)在可以進行一些基本的查詢,我們可以啟動jupyter notebook,首先還是初始化
import qlib
qlib.init(provider_uri='~/.qlib/qlib_data/cn_data')
之后可以像pandas一樣,創(chuàng)建指定格式的時間序列
from qlib.data import D
D.calendar(start_time='2010-01-01', end_time='2017-12-31', freq='day')[:5]
提取指定時間范圍內滬深300的股票代碼
instruments = D.instruments(market='csi300')
D.list_instruments(instruments=instruments, start_time='2010-01-01', end_time='2017-12-31', as_list=True)[:20]
也可以根據(jù)名稱動態(tài)過濾加載數(shù)據(jù)
更多有關數(shù)據(jù)查詢的操作本文就不再一一示例,感興趣的話可以查閱官方數(shù)據(jù)API!
工作流
基本介紹
現(xiàn)在,終于來到最核心的部分——workflow,我們只需要在工作流中構建數(shù)據(jù)集,訓練模型,回測和評估,之后就可以使用qrun自動運行整個工作流程,并在jupyter notebook中給出圖形報告分析。
在一個完整的工作流中應包含以下幾個部分
“”
數(shù)據(jù)
加載數(shù)據(jù) 處理數(shù)據(jù) 數(shù)據(jù)切片 模型
訓練與推導 保存與加載 評價
預測信號分析 回測
下面我們來看一個完整的最典型的工作流部分代碼,之后進行解讀
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
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
現(xiàn)在我們來看一下這部分代碼,讀懂最簡單的之后才方便后面構建自己的模型。
初始化
首先是初始化部分,和之前一致,主要是對數(shù)據(jù)進行配置,
qlib_init:
provider_uri: "~/.qlib/qlib_data/cn_data"
region: cn
market: &market csi300
benchmark: &benchmark SH000300
provider_uri是數(shù)據(jù)存放位置,region代表地區(qū)
-
cn表示Qlib將以中國股票模式初始化 -
us表示Qlib將以美國股票模式初始化
market參數(shù)指定市場為滬深300
接下來一直到task之前,就是對數(shù)據(jù)、資產、策略等信息的詳細配置,這部分和大多數(shù)量化平臺的方法類似,本文不做過多敘述。
任務task
現(xiàn)在來到最關鍵的部分task,其中包含三個不同的主要參數(shù)Model,Dataset和Record。
在model中我們需要指定使用的模型及相關參數(shù)
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部分中,需要指定數(shù)據(jù)來源已經數(shù)據(jù)如何切分成訓練集、測試集等
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部分,它主要負責跟蹤訓練過程和結果,并記錄相關重要的指標信息,方便之后進行展示與評估,下面是record的配置模版
record:
- class: SignalRecord
module_path: qlib.workflow.record_temp
kwargs: {}
- class: PortAnaRecord
module_path: qlib.workflow.record_temp
kwargs:
config: *port_analysis_config
現(xiàn)在只需要將以上代碼保存為configuration.yaml,并進入對應目錄下執(zhí)行以下命令
qrun configuration.yaml
就可以執(zhí)行我們的策略。以上每一個部分的詳細配置在官方文檔中都非常豐富的介紹與示例,本文不再過多介紹,感興趣的讀者可以自己查閱!
啟動
運行單個模型
在寫完模型之后,啟動方式一共有三種:
“”
使用 Qilb內置的qrun運行上面的workflow參考examples中workflow_by_code腳本,在Notebook中執(zhí)行 參考run_all_model.py,寫一個Python腳本,從命令行中使用 python run_all_model.py --models=lightgbm執(zhí)行
運行多個模型
在Qlib中,我么可以使用run_all_model.py運行多個模型進行多次迭代,不過當前只能在Linux下執(zhí)行,并且該腳本將為每個模型創(chuàng)建一個唯一的虛擬環(huán)境,并在訓練后刪除該環(huán)境。使用如下命令即可執(zhí)行
python run_all_model。py 10
一個例子
最后,讓我們運行一個官方提供的示例策略,位置于examples目錄下
可以看到,官方對常見的算法都提供了示例代碼,我們選擇跑一個LightGBM,在命令行執(zhí)行
qrun /Users/liuhuanshuo/Downloads/qlib-main/examples/benchmarks/LightGBM/workflow_config_lightgbm_Alpha158.yaml
啟動瞬間,風扇就開始轉了
經過一段時間等待后,終端會打印出執(zhí)行過程中的關鍵參數(shù)與一些日志,除了命令行輸出的這些信息之外,更多的過程信息會被寫入主目錄下的workflow_by_code.ipynb,我們啟動Jupyter Notebook看一下

可以看到,模型建立、執(zhí)行、預測等全部內容都已經準備好了,我們只需要按照順序執(zhí)行一遍,就能看到更豐富的報告,比如回測、回報率、信息指數(shù)等?




以上只是部分過程(結果),實際給出的評估指標非常多,并且全部用plotly進行可視化,可以進行交互式查看!
離線模式
Qib的另一個特點是可以部署為離線或者在線模式,默認是使用離線模式啟動,在此模式下,數(shù)據(jù)將在本地部署。如果使用在線模式,數(shù)據(jù)將會部署在服務器,根據(jù)官方文檔,使用在線模式會有以下好處
-
集中管理數(shù)據(jù)。用戶不必管理不同版本的數(shù)據(jù) -
減少緩存占用 -
使數(shù)據(jù)可以通過遠程方式訪問
這一塊我沒有具體研究,畢竟Qlib和其他量化平臺相比,支持離線模式就很香了,如果想進一步學習可以查閱官方文檔。
本文的分享就到此為止,其實自發(fā)布以來關于Qlib的評價目前也褒貶不一,但AI量化注定是趨勢,大家可以自己上手體驗一下方能做出對比與選擇!
參考資料
Qlib: https://github.com/microsoft/qlib
[2]Qlib docs: https://qlib.readthedocs.io/en/latest/index.html
[3]微軟也搞AI量化平臺?還是開源的1:https://mp.weixin.qq.com/s/47bP5YwxfTp2uTHjUBzJQQ
-END-
文末推薦一本書Python高手修煉之道,本書系統(tǒng)介紹了如何入門Python并利用Python進行數(shù)據(jù)處理與機器學習實戰(zhàn)。本書從Python的基礎安裝開始介紹,系統(tǒng)梳理了Python的入門語法知識,歸納介紹了圖像處理、數(shù)據(jù)文件讀寫、數(shù)據(jù)庫操作等Python基本技能;然后詳細講解了NumPy、Matplotlib、Pandas、Scipy、Scikit-learn等在數(shù)據(jù)處理、機器學習領域的應用。點擊下方小程序可以查看詳情,給早起投稿可以直接獲得本書(詳情點擊閱讀原文)!
