Qlib QlibRL 使用指南:面向不同背景开发者的强化学习量化策略上手路径
Qlib QlibRL 使用指南面向不同背景开发者的强化学习量化策略上手路径【免费下载链接】qlibQlib is an AI-oriented Quant investment platform that aims to use AI tech to empower Quant Research, from exploring ideas to implementing productions. Qlib supports diverse ML modeling paradigms, including supervised learning, market dynamics modeling, and RL, and is now equipped with https://github.com/microsoft/RD-Agent to automate RD process.项目地址: https://gitcode.com/GitHub_Trending/qli/qlib本文基于 Qlib 官方文档中的 QlibRL Guidance 指南编写面向三类读者RL 新手、RL 算法研究者、量化研究员给出各自定制化的 QlibRL 学习路径并结合 examples/rl_order_execution/ 中单资产订单执行SAOE示例的配置文件与 qlib/rl/order_execution/ 下的 MDP 组件源码帮助你在读完之后掌握按自身背景选路径 → 跑通训练与回测 → 自定义 State/Action/Reward 等组件的完整实操能力。QlibRL 是什么为哪类人解决什么问题QlibRL 是 Qlib 中的强化学习Reinforcement Learning, RL工具包用于帮助用户快速上手、便捷地实现基于 RL 算法的量化策略。与一锅端的教程不同官方指南docs/component/rl/guidance.rst的核心思路是按读者的知识背景给出差异化路径。不同读者在RL 算法知识与金融领域知识两个维度上的储备不同需要补齐的东西也不同读者类型已具备需要补齐指南推荐路径强化学习算法新手基本编程/量化常识RL 基础、RL 适用场景、QlibRL 框架基础 → 场景 → 示例 → 框架与定制RL 算法研究者RL 算法知识金融交易领域知识场景 → 跑通示例 → 改写 policy 注入自己的算法量化研究员金融领域知识、编码能力RL 算法、MDP 建模方法基础 → 场景 → 示例 → 框架 → 选算法 → 设计 MDP下面按路径中的每一步展开先讲 RL 基础与适用场景对应 part1/part2再讲如何跑通官方示例对应 part3最后讲框架结构与组件级定制对应 part4。Part 1RL 基础——四个要素与试错学习这一部分继承自指南的 part1docs/component/rl/overall.rst。与分类、回归等监督学习任务不同RL 是机器学习的另一大范式智能体agent通过与环境的直接交互来优化累积的数值奖励信号并通常在马尔可夫决策过程MDP等假设下建模问题。一个 RL 系统由四个要素构成Agent智能体决策主体Environment环境智能体交互的对象Policy策略智能体据以对环境影响采取动作的规则Reward奖励信号环境反馈给智能体的标量信号。整体上智能体感知并解释环境、执行动作、并通过奖励学习以求长期总奖励最大化为目标。与监督学习从标签学习不同RL 通过试错采样动作观察哪些动作带来期望结果从而得到能产生最优动作的策略——奖励是一个延迟标签告诉我们当前结果是好是坏。一句话概括RL 的目标就是采取行动使奖励最大化。Part 2RL 在量化交易中的潜在应用场景这一部分继承自指南的 part2docs/component/rl/overall.rst。投资本质上是一个持续决策过程投资者通过买卖行为管理持仓与持股并在每次决策前评估市场状态与个股信息——这正是与交互环境驱动的连续决策也是 RL 的优势场景。文档归纳了两类典型场景订单执行Order Execution订单执行任务要求在执行订单时综合考虑最优价格、最小化交易成本、降低市场冲击、最大化订单完成率fill rate、在指定时间窗口内完成执行。RL 的做法是把这些目标全部编码进奖励函数与动作选择过程智能体与市场环境交互、从市场信息中观察状态、决定下一步执行量通过试错学习最优执行策略以最大化期望累积奖励。其一般化 MDP 设定为Environment环境订单执行发生的金融市场包含订单簿动态、流动性、价格波动与市场状态等变量State状态某时刻智能体可用的信息通常包括订单簿状态买卖价差、订单深度、历史价格、历史成交量、市场波动率等Action动作基于观察状态做出的决策包括选择下单量、价格与执行时机Reward奖励指示动作效果的标量信号通常同时考虑最大化价格优势、最小化交易成本手续费与滑点、降低市场冲击、提高完成率等多个目标。具体场景又分两种单资产订单执行Single-asset order execution针对某一特定资产股票或加密货币执行单笔订单目标是在价格优势、成本、冲击与完成率之间取得最优多资产订单执行Multi-asset order execution同时对组合中多个资产执行订单除了单笔订单效率还要管理资产间相互作用与依赖以及现金约束、市场条件与交易成本目标是在单资产效率与组合整体目标之间取得平衡。组合构建Portfolio Construction组合构建是选取与配置资产的过程。RL 提供与市场交互、在考虑风险管理的前提下最大化长期收益的决策优化框架一般设定为State市场与组合的当前信息如历史价格与成交量、技术指标等Action向不同资产分配资本量的决策即各资产的权重或比例Reward评估组合表现的指标可以定义为总收益、风险调整后收益或最大化夏普比率、最小化回撤等目标。按市场可细分为股票市场、加密货币市场、外汇市场等。文档同时提醒基础设定与算法的选择取决于具体任务需求、可用数据与期望的性能目标。Part 3跑通官方示例——单资产订单执行SAOE指南中三类读者都要经过的一步运行示例part3docs/component/rl/quickstart.rst用 RL 解决一个真实交易问题。当前 QlibRL 实现了两个场景示例订单执行与算法交易其中单资产订单执行示例最完整配套代码与配置位于 examples/rl_order_execution/。数据准备根据 examples/rl_order_execution/README.md先下载 5 分钟级数据再将其处理为 pickle 格式并生成训练订单python -m qlib.cli.data qlib_data --target_dir ./data/bin --region hs300 --interval 5min python scripts/gen_pickle_data.py -c scripts/pickle_data_config.yml python scripts/gen_training_orders.py python scripts/merge_orders.py完成后data/下应有bin、orders、pickle三个目录分别对应训练配置中data_dir、order_dir、feature_root_dir引用的路径。训练配置详解下面是 quickstart 文档给出的训练配置文件对应仓库中的 exp_configs/train_ppo.yml 等实际配置每个键位直接映射到一个 MDP 组件simulator: # Each step contains 30mins time_per_step: 30 # Upper bound of volume, should be null or a float between 0 and 1, if it is a float, # represent upper bound is calculated by the percentage of the market volume vol_limit: null env: # Concurrent environment workers. concurrency: 1 # dummy or subproc or shmem. parallel_mode: dummy action_interpreter: class: CategoricalActionInterpreter kwargs: # Candidate actions: a list [a_1..a_L] or an integer n, in which case # [0, 1/n, 2/n, ..., n/n] is auto-generated. values: 14 # Total number of steps (an upper-bound estimation) max_step: 8 module_path: qlib.rl.order_execution.interpreter state_interpreter: class: FullHistoryStateInterpreter kwargs: data_dim: 6 # Number of dimensions in data. data_ticks: 240 # Equal to the total number of records (SAOE per minute: day length in minutes). max_step: 8 # 390min / 30min-per-step ≈ 13 steps此处按订单窗口取 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 # The penalty for a large volume in a short time. module_path: qlib.rl.order_execution.reward data: source: order_dir: ./data/training_order_split data_dir: ./data/pickle_dataframe/backtest total_time: 240 # number of time indexes default_start_time: 0 # start time index default_end_time: 240 # end time index 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 repeat_per_collect: 5 # Number of episodes collected in each training iteration earlystop_patience: 2 episode_per_collect: 20 # Episodes per collect at training. batch_size: 16 val_every_n_epoch: 1 # Perform validation every n iterations checkpoint_path: ./checkpoints checkpoint_every_n_iters: 1配置中的几个关键取舍可以从源码得到解释time_per_step: 30data_ticks: 240每步覆盖 30 分钟、一天共 240 个一分钟 tickmax_step是对总步数的上界估计390 分钟交易时段 / 30 分钟每步values: 14动作离散化为 15 个候选比例[0, 1/14, ..., 1]由CategoricalActionInterpreter自动生成见下节源码解析class: PPO/class: DQNQlibRL 当前基于 tianshou 支持 PPO 与 DQN 两类策略指南原文如此对应 qlib/rl/order_execution/policy.py 中的PPO与DQN封装类。启动训练python -m qlib.rl.contrib.train_onpolicy --config_path exp_configs/train_ppo.yml示例同时提供了两篇论文的复现任务PPOIJCAI 2020 An End-to-End Optimal Trade Execution Framework based on Proximal Policy Optimization与 OPDSAAAI 2021 Universal Trading for Order Execution with Oracle Policy Distillation二者的主要差别在于奖励函数可分别查看 exp_configs/train_ppo.yml 与 exp_configs/train_opds.yml。训练指标、日志与 checkpoint 会输出到配置指定的outputs/目录。回测配置与命令训练完成后可用训练好的策略做回测quickstart 给出的回测配置结构如下真实配置见 exp_configs/backtest_ppo.ymlorder_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 generated by todays information feature_columns_today: [$open, $high, $low, $close, $vwap, $volume] # feature generated by yesterdays information feature_columns_yesterday: [$open_v1, $high_v1, $low_v1, $close_v1, $vwap_v1, $volume_v1] exchange: # the expression for buying and selling stock limitation limit_threshold: [$close 0, $close 0] # deal price for buying and selling deal_price: [If($close 0, $vwap, $close), If($close 0, $vwap, $close)] volume_threshold: # volume limits are both buying and selling, cum means cumulative value over time all: [cum, 0.2 * DayCumsum($volume, 9:45, 14:44)] buy: [current, $close] 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 # Local path to the latest model. The model is generated during training, # so please run training first if you want to run backtest with a trained # policy. You could also remove this parameter file to run backtest # with a randomly initialized policy. weight_file: ./checkpoints/latest.pth # Concurrent environment workers. concurrency: 5回测命令python -m qlib.rl.contrib.backtest --config_path exp_configs/backtest_ppo.yml一个值得注意的实现细节来自 examples/rl_order_execution/README.md训练与回测使用不同的模拟器。训练阶段为了效率使用简化版SingleAssetOrderExecutionSimple不限制交易数量订单总能完全成交回测阶段则使用更贴近现实的SingleAssetOrderExecution考虑成交量必须是最小交易单位整数倍等真实约束因此回测结果与训练期测试阶段结果可能存在偏差。若想让回测与训练期测试完全一致可用python -m qlib.rl.contrib.train_onpolicy --config_path PATH/TO/CONFIG --run_backtest --no_training仅运行回测段并在配置的policy.kwargs中加上weight_file: PATH/TO/CHECKPOINT。Part 4理解 QlibRL 框架并改写组件做定制指南的最后一步part4docs/component/rl/framework.rst面向想要做定制的用户先理解框架再按需重写具体组件。框架总览EnvWrapper 与四个可插拔组件QlibRL 提供了覆盖 RL 全生命周期的组件集合构建市场模拟器、构造状态与动作、训练策略、在模拟环境中回测。它在 Tianshou 与 Gym 之上实现核心抽象是EnvWrapper——对模拟环境的完整封装它接收外部policy/strategy/agent的动作、模拟市场变化、返回奖励与更新后的状态形成交互闭环。EnvWrapper 是gym.Env的子类实现其全部接口因此任何接受gym.Env的类或流水线也能接受 EnvWrapper。开发者不需要自己实现 EnvWrapper只需实现它的4 个组成部分Simulator模拟器环境模拟的核心组件所有与环境模拟直接相关的逻辑都可放入其中。QlibRL 针对单资产交易提供了两个实现SingleAssetOrderExecution基于 Qlib 回测工具链考虑了大量真实交易细节但较慢SimpleSingleAssetOrderExecution基于简化交易模拟器忽略细节如交易限制、取整但速度快。对应源码分别为 qlib/rl/order_execution/simulator_qlib.py 与 qlib/rl/order_execution/simulator_simple.pyState interpreter状态解释器把模拟器原始格式的状态翻译成策略可理解的格式例如把非结构化原始特征转换为数值张量Action interpreter动作解释器方向相反把策略输出的动作从策略格式转换为模拟器可接受的格式Reward function奖励函数策略每执行一次动作后返回一个数值奖励。EnvWrapper 会把这四部分有机关联起来。这种解耦带来的灵活性是同一个环境一个模拟器可以搭配不同的状态解释器/动作解释器/奖励函数训练多种类型的策略。所有组件都有定义良好的基类定制方式就是继承基类并实现其要求的接口基类 API 见 qlib/rl/interpreter.pyStateInterpreter、ActionInterpreter与 qlib/rl/reward.pyReward。指南点名的 MDP 模块逐一解析指南针对量化研究员设计 MDP这一步给出了订单执行示例中需要对照修改的 7 个模块及其源码位置。下面结合源码逐一说明它们在 MDP 建模中承担的角色1. State状态—— SAOEStateSAOEState是一个NamedTuple是模拟器输出的原始状态结构包含当前订单order、当前时间cur_time、当前步数cur_step、剩余待执行量position、历史成交明细history_exec、历史各步统计history_steps、结算后才有的日度指标metrics、回测数据backtest_data以及ticks_per_step、ticks_index、ticks_for_order等时间刻度信息。注意源码注释特别强调解释器使用这些数据时要小心理解未来数据泄漏——FullHistoryStateInterpreter正是通过_mask_future_info把当前时刻之后的数据置零来保证这一点。2. Metrics指标—— SAOEMetricsSAOEMetrics定义了按period一天、30 分钟窗口或逐分钟累积的交易指标市场侧的market_volume/market_price策略侧的amount/inner_amount/deal_amount/trade_price/trade_value/position以及累积指标ffr订单完成度与pa相对于 TWAP 基线的价格优势单位为 BP。这里的pa就是训练日志中reward/pa的来源也是示例中挑选 checkpoint 的评价指标。3. ActionInterpreter动作解释器—— CategoricalActionInterpreter把策略的离散动作转换为连续交易量values若为整数n则自动生成[0, 1/n, 2/n, ..., 1]共n1个候选比例解释时输出min(position, order.amount * action_values[action])即本步最多交易剩余仓位且不超过订单量的候选比例。若已到max_step的最后一步则直接返回全部剩余仓位position强制收尾。此外还有 TwapRelativeActionInterpreter把连续动作解释为相对剩余时段 TWAP 量的倍数适合想让策略学习偏离 TWAP 多少的场景。4. StateInterpreter状态解释器—— FullHistoryStateInterpreter把SAOEState翻译成策略可消费的观测字典输出包含截至当前的当日处理数据data_processed未来信息被 mask、昨日数据data_processed_prev、方向acquiring、当前 tick/step、总步数num_step、目标量target、剩余仓位position与仓位历史position_history。其observation_space属性声明了对应的 Gym 空间如data_processed为(data_ticks, data_dim)的 Box供 tianshou 策略自动构建网络。若策略只依赖最新状态可改用更轻量的 CurrentStepStateInterpreter。5. Reward奖励—— PAPenaltyReward奖励公式为每步PA_t * vol_t / target - vol_t^2 * penalty鼓励更高的价格优势同时对在极短时间内堆量施加二次惩罚penalty默认 100.0还有scale系数整体缩放奖励。同文件还提供 PPOReward——按 IJCAI 2020 PPO 论文设计在订单完成或到达最后一步时用实际 VWAP 与 TWAP 基线价格的比值给出 -1/0/1 的离散奖励。这也解释了示例中 PPO 与 OPDS 两个训练任务主要差别在奖励函数的说法OPDS 配置使用 OPDS 相关奖励PPO 配置使用 PPOReward。6. Observation观测—— FullHistoryObs观测是状态解释器输出的最终数据契约TypedDict规定了策略输入必须包含的 8 个键。定制新状态解释器时可以参照它定义自己的观测结构键名、张量形状与observation_space保持一致即可再配合 network.py 中的Recurrent默认输出维度 32或Attention等网络构建策略输入通路。7. Simulator模拟器—— simulator_simple.py前文已述训练用SingleAssetOrderExecutionSimple快、简化回测用 simulator_qlib.py 的SingleAssetOrderExecution慢、含真实交易细节。定制新交易场景如换市场、改撮合规则时模拟器是改动量最大、也最需要谨慎的组件。策略Policy层的定制入口指南对RL 算法研究者给出的建议是跑通示例后修改 policy 部分把自家 RL 算法接进来。从源码看qlib/rl/order_execution/policy.py 中PPO是 tianshouPPOPolicy的封装L102-L158自动创建 actor/critic 网络仅支持离散动作空间、对 actor/critic 公共参数去重、支持weight_file加载 checkpoint并暴露lr、discount_factor、eps_clip、gae_lambda、max_batch_size等常用超参默认值DQN同样是DQNPolicy的封装L164-L208支持discount_factor、estimation_step、is_double等参数。此外还有不可学习的基线策略AllOne输出恒定值用于实现 TWAP 等规则基线L46-L63。要接入新算法如 SAC、TD3 变体或自研算法继承 tianshou 对应 policy 并按PPO/DQN的模式做封装、然后在配置里以class/module_path指向即可无需触碰模拟器与解释器。三类读者的推荐执行顺序小结把指南原文的推荐序列落到可执行的清单上RL 算法新手在 overall 文档 学习 RL 基础四要素、试错学习在 overall 文档 理解 RL 可应用的交易场景订单执行、组合构建的 State/Action/Reward 一般设定按 quickstart 文档 与 examples/rl_order_execution/ 跑通示例想进一步定制时先理解 framework 文档 的 EnvWrapper 四组件结构再按需重写对应组件。RL 算法研究者先理解交易场景overall 文档 part2 章节选择一个场景当前实现有订单执行与算法交易两个示例跑通 quickstart 示例修改 policy.py 接入自己的 RL 算法。量化研究员学习 RL 基础part1与交易场景part2跑通 quickstart 示例理解 framework 文档的框架结构按问题特性选择算法当前 QlibRL 基于 tianshou 支持PPO 与 DQN基于市场交易规则与待解问题设计 MDP参照订单执行示例修改 7 个模块SAOEStatestate.py#L70、SAOEMetricsstate.py#L18、CategoricalActionInterpreterinterpreter.py#L199、FullHistoryStateInterpreterinterpreter.py#L68、Rewardreward.py、FullHistoryObsinterpreter.py#L44、Simulatorsimulator_simple.py。最后文档还指出 QlibRL 模块以松耦合方式设计核心 RL 部分比示例呈现的更简洁如果不关心具体业务逻辑可以配合 examples/rl/simple_example.ipynb 这个无业务损失的专用 notebook 来理解 RL 内核。文档同时预告未来会提供更多场景示例如基于 RL 的组合构建。适用前提提醒以上示例与命令均以当前仓库中examples/rl_order_execution与qlib.rl模块的实际代码为准且需要依赖 tianshou、gym 与 PyTorch 环境可参考 examples/rl_order_execution/ 下的配置与 qlib/rl/contrib/ 的训练入口确认参数细节。【免费下载链接】qlibQlib is an AI-oriented Quant investment platform that aims to use AI tech to empower Quant Research, from exploring ideas to implementing productions. Qlib supports diverse ML modeling paradigms, including supervised learning, market dynamics modeling, and RL, and is now equipped with https://github.com/microsoft/RD-Agent to automate RD process.项目地址: https://gitcode.com/GitHub_Trending/qli/qlib创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考