工作流:工作流管理

介绍

Qlib框架中的组件是以松耦合的方式设计的。用户可以使用这些组件构建自己的量化研究工作流程,如示例所示。

此外,Qlib 提供了更用户友好的接口,名为 qrun,用于自动运行由配置定义的整个工作流程。运行整个工作流程被称为 执行。 使用 qrun,用户可以轻松启动一个 执行,其中包括以下步骤:

  • Data
    • 加载中

    • 处理

    • 切片

  • Model
    • 训练和推理

    • 保存与加载

  • Evaluation
    • 预测信号分析

    • 回测

对于每次执行Qlib都有一个完整的系统来跟踪所有信息以及在训练、推理和评估阶段生成的工件。有关Qlib如何处理此问题的更多信息,请参阅相关文档:Recorder: Experiment Management

完整示例

在深入了解细节之前,这里有一个完整的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:
        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

如果用户想在调试模式下使用 qrun,请使用以下命令:

python -m pdb qlib/workflow/cli.py examples/benchmarks/LightGBM/workflow_config_lightgbm_Alpha158.yaml

注意

qrun 在安装 Qlib 时将被放置在你的 $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 将在中国股票模式下初始化。

    注意

    region 的值应与存储在 provider_uri 中的数据一致。

任务部分

配置中的task字段对应一个task,它包含三个不同子部分的参数:ModelDatasetRecord

模型部分

task字段中,model部分描述了用于训练和推理的模型的参数。有关基础Model类的更多信息,请参阅Qlib Model

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

    类型:str。模型类的名称。

  • module_path

    类型:str。qlib中模型的路径。

  • kwargs

    模型的关键字参数。请参考特定模型的实现以获取更多信息:models

注意

Qlib 提供了一个名为 init_instance_by_config 的工具,用于初始化 Qlib 中的任何类,配置包括以下字段:classmodule_pathkwargs

数据集部分

数据集字段描述了QlibDataset模块以及DataHandler模块的参数。有关Dataset模块的更多信息,请参阅Qlib Data

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 字段是关于 QlibRecord 模块的参数。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配置中每个字段含义的更多信息,用户可以查阅文档:StrategyBacktest

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

record:
    - class: SignalRecord
      module_path: qlib.workflow.record_temp
      kwargs: {}
    - class: PortAnaRecord
      module_path: qlib.workflow.record_temp
      kwargs:
        config: *port_analysis_config

有关QlibRecord模块的更多信息,用户可以参阅相关文档:Record