QlibRL框架

QlibRL包含了一个完整的组件集合,覆盖了RL流程的整个生命周期,包括构建市场模拟器、定义状态和动作、训练策略和在模拟环境中回测策略。

QlibRL主要基于Tianshou和Gym框架实现。下面展示了QlibRL的高层结构:

../../_images/QlibRL_framework.png

在这里,我们简要介绍图中的每个组件。

EnvWrapper

EnvWrapper是模拟环境的完整封装。它从外部(策略/代理/算法)接收动作,模拟市场的变化,并返回奖励和更新后的状态,形成一个交互循环。

在QlibRL中,EnvWrapper是gym.Env的子类,因此它实现了gym.Env的所有必要接口。任何接受gym.Env的类或流程也应该接受EnvWrapper。开发者不需要实现自己的EnvWrapper来构建自己的环境。而是只需要实现EnvWrapper的四个组件:

  • `Simulator`(模拟器)

    模拟器是负责环境仿真的核心组件。开发者可以按照自己的喜好在模拟器中实现与环境仿真直接相关的所有逻辑。在QlibRL中,已经为单资产交易实现了两种模拟器:1)``SingleAssetOrderExecution``,它基于Qlib的回测工具包构建,因此考虑了许多实际交易细节,但运行较慢。2)``SimpleSingleAssetOrderExecution``,它基于一个简化的交易模拟器构建,忽略了许多细节(例如交易限制、舍入),但运行速度很快。

  • `State interpreter`(状态解释器)

    状态解释器负责将原始格式(模拟器提供的格式)的状态解释为策略可以理解的格式。例如,将非结构化的原始特征转换为数值张量。

  • `Action interpreter`(动作解释器)

    动作解释器与状态解释器类似。但不是解释状态,而是解释策略生成的动作,从策略提供的格式转换为模拟器可接受的格式。

  • `Reward function`(奖励函数)

    奖励函数在策略执行动作后,返回一个数值奖励给策略。

EnvWrapper将有机地组织这些组件。这种分解在开发中可以提供更好的灵活性。例如,如果开发者希望在同一环境中训练多种类型的策略,他们只需设计一个模拟器,并为不同类型的策略设计不同的状态解释器/动作解释器/奖励函数。

QlibRL为这四个组件定义了明确的基类。开发者所需做的就是通过继承基类定义自己的组件,然后实现基类所需的所有接口。上述基本组件的API可以在`这里 <../../reference/api.html#module-qlib.rl>`__找到。

策略

QlibRL直接使用Tianshou的策略。开发者可以直接使用Tianshou提供的策略,也可以通过继承Tianshou的策略来实现自己的策略。

训练舰和训练器

正如它们的名称所示,训练舰和训练器是用于训练的辅助类。训练舰是一个包含模拟器/解释器/奖励函数/策略的船只,它控制与算法相关的训练部分。相应地,训练器负责控制训练的运行时部分。

正如你可能已经注意到的,训练舰本身持有构建EnvWrapper所需的所有组件,而不是直接持有EnvWrapper的实例。这样训练舰在必要时可以动态地创建EnvWrapper的副本(例如,在并行训练下)。

有了训练舰,训练器最终可以通过简单的、类似于Scikit-learn的接口(即``trainer.fit()``)启动训练流程。

有关训练器和训练舰的API可以在`这里 <../../reference/api.html#module-qlib.rl.trainer>`__ 找到。

RL模块的设计采用一种松耦合的方式。目前,RL示例与具体的业务逻辑集成在一起。但是,RL的核心部分比您看到的要简单得多。为了展示RL的简单核心,我们创建了一个专门的笔记本`这里 <https://github.com/microsoft/qlib/tree/main/examples/rl/simple_example.ipynb>`__,展示了没有业务损失的RL示例。