Wang's blog

基础 - 工作流

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:可为uscn,表示使用美国股票模式还是中国股票模式

任务部分

此部分对应一个任务,包含模型、数据集、记录三个子部分。

模型部分

此部分定义了用于训练和推理的模型参数:

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

下面是不同记录模板如SignalRecordPortAnaRecord的配置细节:

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