快速入门

QlibRL 提供了一个单资产订单执行任务的实现示例,下面是使用 QlibRL 进行训练的配置文件示例。

YAML
simulator:
    # 每一步包含 30 分钟
    time_per_step: 30
    # 交易量的上限,应为 null 或一个 0 到 1 之间的浮点数。
    # 如果是浮点数,表示上限是市场交易量的百分比
    vol_limit: null
env:
    # 并发环境工作者
    concurrency: 1
    # dummy、subproc 或 shmem。对应于 `tianshou 中的 parallelism <https://tianshou.readthedocs.io/en/master/api/tianshou.env.html#vectorenv>;`_。
    parallel_mode: dummy
action_interpreter:
    class: CategoricalActionInterpreter
    kwargs:
        # 候选行动,可以是一个长度为 L 的列表:[a_1, a_2,..., a_L],
        # 或一个整数 n,在这种情况下会自动生成一个长度为 n+1 的列表,
        # 即 [0, 1/n, 2/n,..., n/n]。
        values: 14
        # 总步数(上限估计)
        max_step: 8
    module_path: qlib.rl.order_execution.interpreter
state_interpreter:
    class: FullHistoryStateInterpreter
    kwargs:
        # 数据维度
        data_dim: 6
        # 等于总记录数。例如,在 SAOE 每分钟模式下,data_ticks 是以分钟为单位的一天时长。
        data_ticks: 240
        # 总步数(上限估计)。例如,390 分钟 / 30 分钟/步 = 13 步。
        max_step: 8
        # 已处理数据的提供者。
        processed_data_provider:
            class: PickleProcessedDataProvider
            module_path: qlib.rl.data.pickle_styled
            kwargs:
                data_dir: ./data/pickle_dataframe/feature
    module_path: qlib.rl.order_execution.interpreter
reward:
    class: PAPenaltyReward
    kwargs:
        # 短时间内大交易量的惩罚。
        penalty: 100.0
    module_path: qlib.rl.order_execution.reward
data:
    source:
        order_dir: ./data/training_order_split
        data_dir: ./data/pickle_dataframe/backtest
        # 时间索引数量
        total_time: 240
        # 开始时间索引
        default_start_time: 0
        # 结束时间索引
        default_end_time: 240
        proc_data_dim: 6
    num_workers: 0
    queue_size: 20
network:
    class: Recurrent
    module_path: qlib.rl.order_execution.network
policy:
    class: PPO
    kwargs:
        lr: 0.0001
    module_path: qlib.rl.order_execution.policy
runtime:
    seed: 42
    use_cuda: false
trainer:
    max_epoch: 2
    # 每个训练迭代中收集的 episode 数量
    repeat_per_collect: 5
    earlystop_patience: 2
    # 训练时每次收集的 episode 数量
    episode_per_collect: 20
    batch_size: 16
    # 每 n 个迭代执行一次验证
    val_every_n_epoch: 1
    checkpoint_path: ./checkpoints
    checkpoint_every_n_iters: 1

回测的配置文件如下:

YAML
order_file: ./data/backtest_orders.csv
start_time: "9:45"
end_time: "14:44"
qlib:
    provider_uri_1min: ./data/bin
    feature_root_dir: ./data/pickle
    # 由今天信息生成的特征
    feature_columns_today: [
        "$open", "$high", "$low", "$close", "$vwap", "$volume",
    ]
    # 由昨天信息生成的特征
    feature_columns_yesterday: [
        "$open_v1", "$high_v1", "$low_v1", "$close_v1", "$vwap_v1", "$volume_v1",
    ]
exchange:
    # 买卖股票限制的表达式
    limit_threshold: ['$close == 0', '$close == 0']
    # 买卖成交价格
    deal_price: ["If($close == 0, $vwap, $close)", "If($close == 0, $vwap, $close)"]
volume_threshold:
    # 交易量限制适用于买卖双方,"cum" 表示这是一个随时间累积的值
    all: ["cum", "0.2 * DayCumsum($volume, '9:45', '14:44')"]
    # 买入的交易量限制
    buy: ["current", "$close"]
    # 卖出的交易量限制,"current" 表示这是一个实时值,不会随时间累积
    sell: ["current", "$close"]
strategies:
    30min:
        class: TWAPStrategy
        module_path: qlib.contrib.strategy.rule_strategy
        kwargs: {}
    1day:
        class: SAOEIntStrategy
        module_path: qlib.rl.order_execution.strategy
        kwargs:
        state_interpreter:
            class: FullHistoryStateInterpreter
            module_path: qlib.rl.order_execution.interpreter
            kwargs:
            max_step: 8
            data_ticks: 240
            data_dim: 6
            processed_data_provider:
                class: PickleProcessedDataProvider
                module_path: qlib.rl.data.pickle_styled
                kwargs:
                data_dir: ./data/pickle_dataframe/feature
        action_interpreter:
            class: CategoricalActionInterpreter
            module_path: qlib.rl.order_execution.interpreter
            kwargs:
            values: 14
            max_step: 8
        network:
            class: Recurrent
            module_path: qlib.rl.order_execution.network
            kwargs: {}
        policy:
            class: PPO
            module_path: qlib.rl.order_execution.policy
            kwargs:
                lr: 1.0e-4
                # 本地到最新模型的路径。模型在训练期间生成,因此如果要使用训练好的策略运行回测,请先运行训练。
                # 您也可以删除此参数文件,以使用随机初始化的策略运行回测。
                weight_file: ./checkpoints/latest.pth
# 并发环境工作者
concurrency: 5

有了上述配置文件,您可以使用以下命令开始训练智能体:

python -m qlib.rl.contrib.train_onpolicy.py --config_path train_config.yml

训练完成后,您可以使用以下命令进行回测:

python -m qlib.rl.contrib.backtest.py --config_path backtest_config.yml

在这种情况下,SingleAssetOrderExecutionSingleAssetOrderExecutionSimple 是仿真器的示例,qlib.rl.order_execution.interpreter.FullHistoryStateInterpreterqlib.rl.order_execution.interpreter.CategoricalActionInterpreter 是解释器的示例,qlib.rl.order_execution.policy.PPO 是策略的示例,而 qlib.rl.order_execution.reward.PAPenaltyReward 是奖励的示例。对于单资产订单执行任务,如果开发者已经定义了他们的仿真器/解释器/奖励函数/策略,他们只需修改配置文件中相应的设置,即可启动训练和回测流程。有关此示例的详细信息可以在此处找到。

未来,我们将为更多不同的场景(例如基于强化学习的投资组合构建)提供更多示例。

Last modified: Monday, 4 August 2025, 12:13 PM