工作流:工作流管理
简介
Qlib 框架中的组件采用松耦合方式设计。用户可以像示例中那样,使用这些组件构建自己的量化研究工作流。
此外,Qlib
提供了更友好的接口,称为 qrun
,可用于根据配置自动运行整个工作流。运行整个工作流的过程称为一次 执行。通过使用 qrun
,用户可以轻松启动一次 执行,其包含以下步骤:
- 数据
加载
处理
切片
- 模型
训练与推理
保存与加载
- 评估
预测信号分析
回测
对于每一次 执行,Qlib
都有一套完整的系统来追踪训练、推理和评估阶段生成的所有信息及产物。有关 Qlib
如何处理这些内容的更多细节,请参阅相关文档:Recorder:实验管理。
完整示例
在深入细节之前,以下是一个典型的量化研究中 qrun
的完整示例。下面是 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:
start_time: 2017-01-01
end_time: 2020-08-01
account: 100000000
benchmark: *benchmark
exchange_kwargs:
limit_threshold: 0.095
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
如果用户希望在调试模式下使用 qrun
,请使用以下命令:
python -m pdb qlib/workflow/cli.py examples/benchmarks/LightGBM/workflow_config_lightgbm_Alpha158.yaml
注意
安装 Qlib
后,qrun 将被放置在您的 $PATH 目录中。
注意
yaml 文件中的符号 & 表示某个字段的锚点,当其他字段需要将该参数作为其值的一部分时非常有用。以以上配置文件为例,用户可直接修改 market 和 benchmark 的值,而无需遍历整个配置文件。
配置文件
本节将详细介绍 qrun
。在使用 qrun
之前,用户需要准备一个配置文件。以下内容将说明如何准备配置文件的各个部分。
配置文件的设计逻辑非常简单:它预定义了固定的工作流,并通过该 yaml 接口让用户定义如何初始化每个组件。这一设计遵循 init_instance_by_config 的模式,用于定义 Qlib 各组件的初始化方式,通常包括类名及其初始化参数。
例如,以下 yaml 配置和代码是等价的。
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 初始化部分
首先,配置文件需要包含若干用于 Qlib 初始化的基本参数。
provider_uri: "~/.qlib/qlib_data/cn_data"
region: cn
各字段含义如下:
- provider_uri
类型:str。Qlib 数据的 URI。例如,可以是通过
get_data.py
加载的数据存储位置。
- region
如果 region == “us”,则
Qlib
将以美股模式初始化。如果 region == “cn”,则
Qlib
将以 A 股模式初始化。
注意
region 的值应与存储在 provider_uri 中的数据保持一致。
任务部分
配置中的 task 字段对应一个任务(task),其中包含三个子部分的参数:Model(模型)、Dataset(数据集)和 Record(记录)。
模型部分
在 task 字段中,model 部分描述了用于训练和推理的模型参数。有关基础 Model
类的更多信息,请参阅 Qlib 模型。
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
各字段含义如下:
- 类
类型:str。模型类的名称。
- module_path
类型:str。模型在 qlib 中的路径。
- kwargs
模型的关键字参数。请参考具体模型的实现以获取更多信息:models。
注意
Qlib
提供了一个名为 init_instance_by_config
的工具,用于根据包含 class、module_path 和 kwargs 字段的配置初始化 Qlib
内的任意类。
数据集部分
dataset 字段描述了 Dataset
模块以及 DataHandler
模块在 Qlib
中的参数。有关 Dataset
模块的更多信息,请参阅 Qlib 数据。
DataHandler
的关键字参数配置如下:
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
用户可参考 DataHandler 文档了解配置中各个字段的具体含义。
以下是 Dataset
模块的配置,该模块将在训练和测试阶段负责数据预处理和切片。
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
模块在 Qlib
中的参数。Record
负责以标准格式跟踪训练过程和结果,例如 信息系数(IC) 和 回测。
以下脚本是 回测 及其使用的 策略 的配置:
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
有关 strategy 和 backtest 配置中各字段含义的更多详细信息,用户可查阅文档:Strategy 和 Backtest。
以下是不同记录模板的配置详情,例如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
有关Record
模块在Qlib
中的更多信息,用户可参考相关文档:Record。