我做了快五年量化策略研究,前两年还沉迷在挖掘传统因子里,后来发现自己一直在跟换手率和拥挤度较劲。真正让我转向强化学习(RL)方向的契机,是某次实盘复盘时发现:同一个因子组合,在高频场景下用不同方式进单,收益差距能达到一倍以上。那一刻我才意识到,预测信号和交易决策之间有一条巨大的鸿沟,而订单簿数据恰好是这条鸿沟上最关键的桥梁。
这篇文章想跟你聊聊我过去一年多在“RL + 订单簿建模”这个方向上踩过的坑、验证过的思路、以及最终沉淀下来的一套可复用的工程方法。核心会聚焦在:订单簿数据如何用结构化方式送进RL模型、状态动作空间怎么设计才不反直觉、回测时哪些隐患最容易被忽视。无论你是刚开始接触量化的新手,还是已经在传统模型里打转很久的从业者,这篇文章都值得你花二十分钟读完,它至少能帮你省掉我当初几个月的弯路。
严格来说,“RL+订单簿”不是单一技术问题,而是一个包含数据工程、环境设计、奖励塑形和风险管理四个子问题的系统。我见过太多人把精力全花在模型结构上,结果数据预处理粗糙、奖励函数漏洞百出,最后Models怎么调都赚不了钱。下面我按实际操作流程,从数据到部署逐个环节展开讲。
1. 订单簿数据到底长什么样:Level 2结构的工业级拆解
想用RL做订单簿建模,第一个绕不开的问题就是:你说的“订单簿”究竟是哪一层数据?很多刚入门的同学以为订单簿就是买一卖一价,实盘数据拿到手才发傻——量级完全不同。
1.1 从Level 1到Level 3:你能拿到什么数据
Level 1是最常见的行情快照,通常只有最优买价/卖价、最优买卖量、最新成交价和成交量。这类数据做简单的盘口方向判断勉强够用,但喂给RL模型就太单薄了——你对市场微观结构的观察维度严重缺失。
Level 2是逐笔委托数据的聚合视图,包含从买一档到买N档、卖一档到卖N档的价格和挂单量,每笔订单的增删改事件也能通过增量数据还原出来。我实盘项目里用的就是Level 2的十档行情,每秒大约有10到20个快照,加上增量更新,一天的原始数据量在2到5GB左右。
Level 3则更进一步,能精确到每个订单的ID、时间、价格、数量、方向以及它是新单、撤单还是成交。数据量级比Level 2再大几十倍,很多券商接口虽然声称支持,实际推送延迟和丢包率你都未必扛得住。我的建议是:个人研究阶段不要碰Level 3,先把Level 2用扎实已经能跑出很漂亮的结果了。
1.2 订单簿快照的字段语义与更新机制
Level 2快照数据里最容�易被忽视的是时间戳精度和更新类型。不同交易所的时间戳粒度差异很大,有的是秒级,有的是毫秒级,少数支持微秒级,这个差异直接影响你计算订单簿变化速度的准确性,比如说订单到达速率、撤单比例、价差变动频率这些特征,时间戳一粗糙全都不准。
第二个容易忽略的点是快照数据的“脏”现象。交易所推送快照时,偶尔会出现买卖价倒挂(买一价高于卖一价,通常是极速行情下中间价跳动导致的串帧)、挂单量为负(增量更新未对齐)、或者买卖盘口为空(熔断停牌时)等异常。这些脏数据对传统因子模型影响有限,因为你有各种去极值手段,但对RL模型是致命的,直接喂进去可能会让模型学到疯狂报买单的错误策略。
所以工业级订单簿建模的第一步不是特征工程,而是数据清洗:剔除价差为负的快照、填补缺失档位、对挂单量做异常值截断。我自己的流水线里还会记录每个清洗动作的次数,作为数据质量监控指标——如果某天异常比例突然升高,大概率是上游数据源出问题了。
1.3 多品种订单簿的横截面拼接问题
如果你想做多品种联合建模,比单品种复杂得多。核心问题在于不同标的的订单簿深度、价格水平、交易时段差异很大,直接把不同品种的订单簿特征拼成一个状态向量喂给模型,模型会花大量容量去学习标的不相关规律。
我在实际项目里采用的方案是:先对每个品种单独做标准化,再通过一个代理变量(比如中间价的日波动率)将不同品种映射到同一量纲下,最后用“相对深度”(每档挂单量除以过去某个窗口的平均挂单量)替代绝对深度。这样横截面拼接的可行性会大幅提升,模型泛化能力也更好。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么RL能驾驭高频订单簿:传统监督学习的三个盲区
在讨论如何建模之前,先花点篇幅说说为什么基于订单簿的交易问题天然适合RL框架,而传统监督学习在这里有难以逾越的盲区。理解了这一点,你才能在设计模型时做出正确取舍。
2.1 传统模型预测的是“值”,RL优化的是“决策”
传
