十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Qlib 高频交易(High-Frequency Trading)嵌套决策执行框架:从日频组合到分钟级下单的联合回测设计

Qlib 高频交易(High-Frequency Trading)嵌套决策执行框架:从日频组合到分钟级下单的联合回测设计 Qlib 高频交易High-Frequency Trading嵌套决策执行框架从日频组合到分钟级下单的联合回测设计【免费下载链接】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 中用于支持多层级Multi-Level联合交易回测的嵌套决策执行Nested Decision Execution框架。文章以 docs/component/highfreq.rst 为主线结合 examples/nested_decision_execution/workflow.py 与 executor 源码 展开读完后你将理解日频组合管理 日内订单执行为何必须在一个框架内联合建模、框架的Trading Agent/Execution Env分层抽象如何落地并能基于仓库自带的workflow.py复现 day → 30min → 5min 三级嵌套回测、理解全部关键配置参数。1 背景日频与日内交易为何需要联合回测传统的量化研究中日频交易例如组合管理、调仓与日内交易例如订单执行、算法交易通常被当作两个独立课题分别研究。但在真实投资链路中两者的收益是耦合的日频调仓的下单最终要在日内完成日内执行质量滑点、冲击成本会反作用于组合层面的真实收益不同层级策略的最优化并不是独立的例如当订单执行策略被改进后高换手率的组合策略可能反而成为更优选择docs/component/highfreq.rst 原文论证。要得到日频 日内的联合交易绩效就必须让两层策略互相交互并联合回测Joint Backtest而当时公开的高频回测框架均不支持多层级联合交易导致上述回测并不准确。为此 Qlib 设计了一套考虑层间交互的嵌套决策执行框架它既支撑不同频率策略在同一回测中嵌套运行也天然为跨层级联合优化例如用强化学习同时优化组合与执行策略提供统一环境。2 框架总览Trading Agent 与 Execution Env 的分层嵌套框架的总体设计如下黄色中间部分即嵌套决策执行框架本体每一层都由一个Trading Agent交易代理与一个Execution Env执行环境构成见 docs/component/highfreq.rst 的设计说明Trading Agent自带三个模块Information Extractor数据/信息处理模块负责从行情、因子、事件等原始数据中抽取特征Forecast Model预测模块输出价格趋势、收益等预测信号Decision Generator决策生成器基于预测信号产生交易决策订单、调仓目标等。Execution Env接收交易算法Trading Algorithm产出的决策返回执行结果成交价格、成交量、费用等。该框架强调三个维度的可定制性交易算法的频率日内 / 日频 / 周频、决策内容、以及执行环境均可由用户自定义。关键之处在于执行环境内部可以再嵌套更细粒度的交易算法与执行环境即图例中的 sub-workflow / 子流程——例如把日频订单通过日内切分转化为更细粒度的决策。这种嵌套灵活性使研究者能够直接探索不同层级交易策略组合的效果打破各层级交易算法之间被割裂的优化边界。框架整体的联合优化可由QlibRL支持docs/component/rl/overall.rst相关 API 可参考 docs/reference/api.rst。仓库 examples/nested_decision_execution/workflow.py 提供了完整的可运行示例运行方式见后文第 5 节。3 源码级拆解Executor 的分层执行机制3.1 三层执行器体系BaseExecutor / NestedExecutor / SimulatorExecutor在 Qlib 回测体系中执行环境的具体承载者是位于 qlib/backtest/executor.py 的执行器Executor其继承结构为BaseExecutor所有执行器的基类。它按time_per_step粒度生成交易日历TradeCalendarManager管理交易账户trade_account并负责在每步结束后更新组合指标update_bar_end与推进日历trade_calendar.step()。NestedExecutor(BaseExecutor)嵌套执行器是本框架的核心实现。当它被调用执行一个trade_decision时会调用内层的inner_strategy与inner_executor在更高频率的环境中对上层决策进行再执行。SimulatorExecutor(BaseExecutor)最底层的原子模拟器直接对订单列表向Exchange撮合成交deal_order支持serial/parallel两种撮合顺序见 qlib/backtest/executor.py 的TT_SERIAL/TT_PARAL定义。每个执行器的一步有多大完全由time_per_step如day、30min、5min决定不同频率的数据则由CommonInfrastructure/LevelInfrastructure中的多频率日历与行情Exchange提供。3.2 NestedExecutor 的核心执行循环NestedExecutor._collect_dataqlib/backtest/executor.py实现了层间交互的核心逻辑流程可概括为初始化子交易_init_sub_trading把内层执行器重置到外层当前这一步的时间窗口内inner_executor.reset(start_time, end_time)并把当前层级的 LevelInfra 下传给内层策略。子级循环在while not self.inner_executor.finished()中反复更新上层决策trade_decision.update(...)外层策略有机会逐步更新决策让内层策略inner_strategy.generate_trade_decision(...)生成更细粒度的子决策把子决策交给inner_executor.collect_data(...)执行并累加execute_result与内层订单指标inner_order_indicators。收尾钩子内层循环结束后调用inner_strategy.post_upper_level_exe_step()与post_exe_step(...)让内层策略感知外层执行完成便于维护跨层状态。两个对使用很关键的布尔参数构造参数见 executor.py 中NestedExecutor.__init__skip_empty_decisionTrue当上层决策为空时跳过内层循环但当决策会被逐步更新或内层执行器可能不跟随外层决策时须置为False。align_range_limitTrue强制对齐trade_range决策的时间窗range_limit由外层策略给出跳过窗口外的子步骤。跨层级账户的处理有一个精妙设计executor.py 源码注释内层执行器通过copy_trade_accountTrue浅拷贝共享外层账户——持仓positions在各层间共享而组合指标与交易指标portfolio trading metrics各层独立记账从而能同时得到 day/30min/5min 三个频率各自的绩效报表这正是示例能输出三套分析结果的原因。此外NestedExecutor.get_all_executors()会递归收集自身及所有内层执行器供统一管理与指标输出。3.3 决策与订单的数据结构决策链路的下游是 qlib/backtest/decision.py 中定义的Order数据类与OrderDir枚举OrderDir.SELL/OrderDir.BUY。Order记录标的stock_id、数量amount、买卖方向direction、订单区间start_time/end_time成交后由回测系统回填deal_amount与factor无法成交时deal_amount 0且factor is None例如停牌导致整单失败。amount_delta/deal_amount_delta/sign属性统一了买卖的方向语义供上层策略与账户结算复用。4 关键配套策略TWAP 与 SBB规则型日内执行在嵌套框架里把上层订单转成细粒度执行决策的任务落在各类策略上策略基类为 qlib/strategy/base.py 的BaseStrategy。高频/执行场景常用到 qlib/contrib/strategy/rule_strategy.py 中的两个规则型策略TWAPStrategy时间加权平均价格策略把外层订单order.amount在决策允许的trade_len个交易步内均匀切分成交amount_expect order.amount / trade_len * (rel_trade_step 1)并按交易单位trade_unitA 股为 100 股/手取整、在最后一步把余量全部出清同时会跳过停牌标的、依据execute_result回填已成交量避免重复下单。SBBStrategyEMA(S)elect the (B)etter one among every two adjacent trading (B)ars即基于EMA 信号在相邻两根交易 bar 中挑更好的一根执行用于日内择时。其信号为EMA($close,10) - EMA($close,20)构造参数freq指定信号的取样频率默认day可与执行器的time_per_step不同instruments限定信号覆盖的标的池如csi300。另外日频调仓层的典型外层策略是 qlib/contrib/strategy/signal_strategy.py 中的TopkDropoutStrategy它按模型预测信号维持一个 Top-K 股票池并定期调出掉队标的——在示例中它负责日频组合生成这一层。5 实战示例日频组合 分钟级执行的联合回测5.1 三段式执行链day → 30min → 5min仓库自带示例 examples/nested_decision_execution/workflow.py类NestedDecisionExecutionWorkflow演示了完整用法外层用TopkDropoutStrategy在日频生成组合调仓决策然后经由三段嵌套执行器把订单拆解到30 分钟直至5 分钟级别撮合层级执行器time_per_step内层策略inner_strategy职责外层NestedExecutordaySBBStrategyEMAfreq1min日频调仓决策在盘内按 1min 级信号择时执行中层NestedExecutor30minTWAPStrategy把 30min 粒度的订单按时间均匀拆分内层SimulatorExecutor5min——最细粒度撮合、生成组合与交易指标示例完整的执行器/回测配置如下节选自 workflow.py 的port_analysis_configport_analysis_config { executor: { class: NestedExecutor, module_path: qlib.backtest.executor, kwargs: { time_per_step: day, # 外层每步 1 个交易日 inner_executor: { class: NestedExecutor, module_path: qlib.backtest.executor, kwargs: { time_per_step: 30min, # 中层每步 30 分钟 inner_executor: { class: SimulatorExecutor, # 内层原子撮合器 module_path: qlib.backtest.executor, kwargs: { time_per_step: 5min, # 最细执行粒度 5 分钟 generate_portfolio_metrics: True, verbose: True, indicator_config: {show_indicator: True}, }, }, inner_strategy: { # 中层把订单均分到 5min class: TWAPStrategy, module_path: qlib.contrib.strategy.rule_strategy, }, generate_portfolio_metrics: True, indicator_config: {show_indicator: True}, }, }, inner_strategy: { # 日频层做日内择时 class: SBBStrategyEMA, module_path: qlib.contrib.strategy.rule_strategy, kwargs: {instruments: csi300, freq: 1min}, }, track_data: True, # 收集逐笔决策供 RL 训练使用 generate_portfolio_metrics: True, indicator_config: {show_indicator: True}, }, }, backtest: { start_time: 2020-09-20, end_time: 2021-05-20, account: 100000000, # 初始资金 1 亿元 exchange_kwargs: { freq: 1min, # 行情数据频率 limit_threshold: 0.095, # 涨跌停阈值A 股约 ±9.5% 留缓冲 deal_price: close, open_cost: 0.0005, # 开仓成本双边费率习惯性拆分 close_cost: 0.0015, min_cost: 5, # 单笔最低佣金 }, }, }外层策略训练好的模型 数据集作为信号在backtest()方法中注入strategy_config { class: TopkDropoutStrategy, module_path: qlib.contrib.strategy.signal_strategy, kwargs: {signal: (model, dataset), topk: 50, n_drop: 5}, } self.port_analysis_config[strategy] strategy_config self.port_analysis_config[backtest][benchmark] SH000300 # 沪深300模型侧复用 Qlib 的标准训练链路数据集使用Alpha158因子 DatasetH模型使用LGBModelqlib.contrib.model.gbdt配置见 workflow.py 中 task 定义时间分段为 train(2007-01-01 至 2014-12-31)/valid(2015-2016)/test(2020-01-01 至 2021-05-31)并用SignalRecord生成预测、PortAnaRecord生成组合绩效分析qlib.workflow.record_temp。5.2 多频率数据初始化provider_uri 按频率映射由于联合回测同时需要日频与分钟频数据示例的_init_qlib()做了两件关键事情可对照 qlib/config.py 的HIGH_FREQ_CONFIG理解provider_uri_day ~/.qlib/qlib_data/cn_data # 日频数据 GetData().qlib_data(target_dirprovider_uri_day, regionREG_CN, versionv2, exists_skipTrue) provider_uri_1min HIGH_FREQ_CONFIG.get(provider_uri) # ~/.qlib/qlib_data/cn_data_1min 分钟频数据 GetData().qlib_data(target_dirprovider_uri_1min, interval1min, regionREG_CN, versionv2, exists_skipTrue) provider_uri_map {1min: provider_uri_1min, day: provider_uri_day} qlib.init(provider_uriprovider_uri_map, dataset_cacheNone, expression_cacheNone)即qlib.init的provider_uri支持传入{频率: 数据目录}字典让不同频率的数据与交易日历按需加载。HIGH_FREQ_CONFIGqlib/config.py给出了分钟频数据目录与DiskExpressionCache缓存的推荐默认值。5.3 运行方式进入示例目录后直接执行示例 READMEpython workflow.py backtest # 启动联合回测并输出 1day/30minute/5minute 三级绩效 python workflow.py collect_data # 按步收集 trade_decision供 RL 训练等下游使用执行后PortAnaRecord会在 Qlib 的 MLflow 记录器Experiment 2中分别保存port_analysis_1day.pkl、port_analysis_30minute.pkl、port_analysis_5minute.pkl与indicator_analysis_*.pkl三组工件。示例源码 docstring 记录了某次历史运行的输出当前版本数据/模型下数值可能有差异仅作结果形态示意频率benchmark 年化收益benchmark 信息比率超额年化含费超额信息比率含费1day0.1549670.8054220.2642802.26139230minute0.1487870.9352520.2945362.0188605minute0.1721701.1034390.2815361.866091同时输出各层的交易指标ffr 成交满足率 / pa 价格优势 / pos 交易正向率。在示例的历史输出中1day 的ffr≈0.946、30minute≈0.983、5minute≈0.991——执行粒度越细、成交满足率越高直观体现了日内拆单对执行效果的改善。另外workflow.py还提供了两个内部校验方法check_diff_freq()把 30minute/5minute 的账户净值重采样到日频后与 1day 层对齐断言多级间资金核算一致性校验backtest_only_daily()运行纯日频单层回测用于对比嵌套与单层执行是否有严重偏差。5.4 执行指标indicator_config配置说明示例在所有层级都开启了show_indicatorTrue其定义与可选参数见 BaseExecutor 构造文档show_indicator是否输出指标指标包括pa价格优势成交价相对基准价更优的程度、pos正向率、ffr成交满足率。pa_config.base_price价格优势的基准价twap时间加权均价默认或vwap成交量加权均价。pa_config.weight_method与ffr_config.weight_method多订单聚合加权方式mean默认/amount_weighted按数量加权/value_weighted按成交额加权。{ show_indicator: True, pa_config: {agg: twap, price: $close}, ffr_config: {weight_method: value_weighted}, }5.5 track_data 与强化学习联动注意示例在日频层执行器设置了track_data: True。这在 executor.py 的collect_data实现中体现为当track_data为真时执行器每步会yield trade_decision使外部驱动方如 RL 训练循环能拿到逐决策数据执行器还返回每步的decision_list与inner_order_indicators。同时源码针对 RL 场景做了专门适配通常Qlib 策略 ↔ Qlib 执行器的嵌套循环可以切换为RL Policy ↔ RL Env[内嵌 Qlib Executor]的写法即内层策略作为代理策略通过yield from把控制权交给 RL Env 等待策略动作——这让嵌套执行框架能够直接对接强化学习联合优化源码注释见 executor.pyNestedExecutor._collect_data入门资料见 docs/component/rl/quickstart.rst。6 仓库内的高频量化配套资源除了嵌套决策执行当前仓库还沉淀了一批高频相关模块与示例可与此框架组合使用高频数据预测基准examples/highfreq/目录提供基于 1 分钟数据的预测工作流workflow.py、highfreq_handler.py、highfreq_processor.py、highfreq_ops.py及配置文件workflow_config_High_Freq_Tree_Alpha158.yaml其底层处理器HighFreqHandler/HighFreqBacktestHandler与高性能算子位于 qlib/contrib/data/highfreq_handler.py、qlib/contrib/ops/high_freq.py。它使用的HIGH_FREQ_CONFIG与本文示例同源。无固定频率的特征抽取examples/orderbook_data/提供从盘口/订单簿数据中按事件而非固定频率抽取特征的方法见 README。基于强化学习的高频订单执行examples/rl_order_execution/提供基于 RL 的订单执行示例train_ppo.yml、backtest_ppo.yml等配置与数据生成脚本见 README与本文框架的 RL 集成点一脉相承。RL 框架文档整体方案与 API 详见 docs/component/rl/overall.rst、docs/component/rl/framework.rst。7 小结Qlib 的嵌套决策执行框架把日频组合决策与日内订单执行放进同一个可递归嵌套的执行器体系中每层由Trading Agent信息抽取、预测、决策与Execution Env执行器 内层策略组成通过NestedExecutor的递归循环把上层订单逐级拆解到更细的时间粒度并以共享持仓、分层记账的方式输出各频率独立的绩效与交易指标。相比日频、日内分开回测的传统做法该设计能更真实地评估多层级策略的联合表现并为基于强化学习的跨层级联合优化提供了统一、可控的训练环境。想要快速上手可直接阅读并运行 examples/nested_decision_execution/workflow.py想深入源码则建议从 qlib/backtest/executor.py 中NestedExecutor的_collect_data循环读起再对照 docs/component/highfreq.rst 的框架图理解层级语义。【免费下载链接】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),仅供参考
返回列表