基础 - 工作流
Published on
简介
Qlib中设计了很多模块/组件,在进行实验时需要将多个组件组成一个工作流。组成工作流的方式有两种:
- 使用python代码将组件组合成工作流(例子)
- 使用Qlib提供的
qrun
程序,它可以根据配置文件自动运行整个工作流
一个完整的qrun
工作流包括以下步骤:
- 数据
- 加载
- 处理
- 切片
- 模型
- 训练与推理
- 保存与加载
- 评估
- 预测信号分析
- 回测
Qlib还有一套完整的记录系统用于记录训练、推理与评估阶段的所有信息与结果。
完整例子
下面是qrun
的一个典型的配置文件,定义了量化研究的典型工作流:
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
signal: <PRED>
backtest:
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
将该配置保存为configuration.yaml文件后,可以使用如下命令运行工作流:
qrun configuration.yaml
如需使用debug模式运行,使用如下命令:
python -m pdb qlib/workflow/cli.py configuration.yaml
配置文件说明
配置文件的设计逻辑非常简单:它预定义了固定的工作流,并通过配置文件定义如何初始化每个组件。配置中通常包括类名与初始化参数,可以转换为等价的python代码。例如,下面的配置与代码是等价的:
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
from qlib.contrib.model.gbdt import LGBModel
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,
}
LGBModel(kwargs)
初始化部分
配置文件中首先需要包含一些基本参数用于初始化Qlib:
provider_uri: "~/.qlib/qlib_data/cn_data"
region: cn
字段含义:
- provider_uri:数据地址。例如可以为使用
get_data.py
下载的数据路径 - region:可为
us
或cn
,表示使用美国股票模式还是中国股票模式
任务部分
此部分对应一个任务,包含模型、数据集、记录三个子部分。
模型部分
此部分定义了用于训练和推理的模型参数:
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
字段含义:
- class:模型类名
- module_path:模型类在Qlib库中的路径
- kwargs:模型的关键词参数。具体内容与模型的实现有关
数据集部分
此部分定义数据集模块与数据处理器模块的参数。
数据处理器模块的关键词参数:
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
数据集模块负责进行训练与测试阶段的数据预处理与切片:
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]
记录部分
此部分定义记录模块的参数,该模块负责使用标准格式记录训练的过程与结果(信息系数与回测结果等)。
下面是回测及策略的配置:
port_analysis_config: &port_analysis_config
strategy:
class: TopkDropoutStrategy
module_path: qlib.contrib.strategy.strategy
kwargs:
topk: 50
n_drop: 5
signal: <PRED>
backtest:
limit_threshold: 0.095
account: 100000000
benchmark: *benchmark
deal_price: close
open_cost: 0.0005
close_cost: 0.0015
min_cost: 5
下面是不同记录模板如SignalRecord
和PortAnaRecord
的配置细节:
record:
- class: SignalRecord
module_path: qlib.workflow.record_temp
kwargs: {}
- class: PortAnaRecord
module_path: qlib.workflow.record_temp
kwargs:
config: *port_analysis_config