工作流:工作流管理

简介

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 文件中的符号 & 表示某个字段的锚点,当其他字段需要将该参数作为其值的一部分时非常有用。以以上配置文件为例,用户可直接修改 marketbenchmark 的值,而无需遍历整个配置文件。

配置文件

本节将详细介绍 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 的工具,用于根据包含 classmodule_pathkwargs 字段的配置初始化 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

有关 strategybacktest 配置中各字段含义的更多详细信息,用户可查阅文档:Strategy 和 Backtest。

以下是不同记录模板的配置详情,例如SignalRecordPortAnaRecord

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