Section outline

  • 工作流:工作流管理


    简介

    Qlib 框架中的组件是松散耦合设计的。用户可以像示例中那样,使用这些组件构建自己的量化研究工作流。

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

    • 数据

      • 加载

      • 处理

      • 切片

    • 模型

      • 训练和推断

      • 保存和加载

    • 评估

      • 预测信号分析

      • 回测

    对于每一次执行Qlib 都有一个完整的系统来跟踪在训练、推断和评估阶段生成的所有信息和工件。有关 Qlib 如何处理这些内容的更多信息,请参阅相关文档:记录器:实验管理


    完整示例

    在深入细节之前,这里有一个 qrun 的完整示例,它定义了典型的量化研究工作流。以下是一个典型的 qrun 配置文件。

    YAML
    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 和代码是等价的。

    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
    
    Python
    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 初始化的基本参数。

    YAML
    provider_uri: "~/.qlib/qlib_data/cn_data"
    region: cn
    

    每个字段的含义如下:

    • provider_uri:类型为 strQlib 数据的 URI。例如,它可以是 get_data.py 加载数据后存储的目录。

    • region

      • 如果 region == "us"Qlib 将以美股模式初始化。

      • 如果 region == "cn"Qlib 将以 A股模式初始化。

    注意

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

    任务部分

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

    模型部分

    task 字段中,model 部分描述了用于训练和推断的模型的参数。有关基础 Model 类的更多信息,请参阅 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
    

    每个字段的含义如下:

    • class:类型为 str。模型类的名称。

    • module_path:类型为 str。模型在 qlib 中的路径。

    • kwargs:模型的关键字参数。有关更多信息,请参阅特定模型的实现:models

    注意

    Qlib 提供了一个名为 init_instance_by_config 的实用工具,用于使用包含 classmodule_pathkwargs 字段的配置来初始化 Qlib 中的任何类。

    数据集部分

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

    DataHandler 的关键字参数配置如下:

    YAML
    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 模块的配置,该模块将在训练和测试阶段负责数据预处理和切片。

    YAML
    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)回测

    以下脚本是回测及其使用的策略的配置:

    YAML
    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
    

    有关策略回测配置中每个字段的含义,用户可以查阅文档:策略回测

    这是不同记录模板(如 SignalRecordPortAnaRecord)的配置详细信息:

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

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