QlibRL 框架
QlibRL 包含一整套组件,覆盖 RL 流水线的整个生命周期,包括构建市场模拟器、塑造状态和动作、训练策略(策略)以及在模拟环境中回测策略。
QlibRL 基本上是在 Tianshou 和 Gym 框架的支持下实现的。QlibRL 的高层结构如下所示:
在这里,我们简要介绍图中的每个组件。
EnvWrapper
EnvWrapper 是模拟环境的完整封装。它接收来自外部(策略/策略/代理)的动作,模拟市场的变化,然后回复奖励和更新的状态,从而形成一个交互循环。
在 QlibRL 中,EnvWrapper 是 gym.Env 的子类,因此它实现了 gym.Env 所需的所有接口。任何接受 gym.Env 的类或流水线也应该接受 EnvWrapper。开发人员无需实现自己的 EnvWrapper 来构建自己的环境。相反,他们只需实现 EnvWrapper 的 4 个组件:
- 模拟器
模拟器是负责环境模拟的核心组件。开发人员可以以任何方式在模拟器中实现与环境模拟直接相关的所有逻辑。在 QlibRL 中,已经有两个用于单资产交易的模拟器实现:1)``SingleAssetOrderExecution``,基于 Qlib 的回测工具包构建,因此考虑了许多实际交易细节,但速度较慢。2)``SimpleSingleAssetOrderExecution``,基于简化的交易模拟器构建,忽略了许多细节(例如交易限制、四舍五入),但速度相当快。
- 状态解释器
状态解释器负责将原始格式(由模拟器提供的格式)中的状态 "解释" 为策略可以理解的格式的状态。例如,将非结构化的原始特征转换为数值张量。
- 动作解释器
动作解释器类似于状态解释器。但它解释的是由策略生成的动作,而不是状态,从策略提供的格式到模拟器可接受的格式。
- 奖励函数
奖励函数在策略每次采取行动后返回一个数值奖励给策略。
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。