用图神经网络建模订单簿:从盘口地形到微观结构预测

发布时间:2026/10/22 3:17:31

用图神经网络建模订单簿:从盘口地形到微观结构预测 1. 从逐笔委托到“微观地形图”订单簿为什么天生是一张图接触量化交易有些年头的人大概都有这种感觉盯盘盯久了盘口不是一条条冷冰冰的委托记录而是有自己的“呼吸”的。买一卖一的价格上下跳动挂单量像人的肺活量一样时深时浅某个价位突然被砸穿又在几百毫秒内被新的委托补回来。这种节奏和张力构成了订单簿微观结构最迷人的部分。过去处理订单簿最常见的做法是把档位数据拉平成矩阵扔给CNN或者LSTM。但实际用下来你会发现一个根本性的错位订单簿并不是规则网格它的结构是动态变化的。买单在买三价挂了500手这个档位可能下一瞬间就没了卖二价原本只有薄薄一层撮合几笔后成了新的支撑。档位会“消失”、会“插入”、会在价格轴上左右移动这种非欧几里得结构恰恰不是卷积核能优雅表达的。我当时一直在想能不能找到一种模型天然尊重订单簿这种拓扑关系而不是强行把它压扁。后来读到一些关于图神经网络GNN处理社交网络和分子结构的论文脑子里那根弦突然就搭上了订单簿不就是一张动态图吗价位是节点相邻档位之间有空间连接买卖两侧之间存在竞争关系同一个价位在不同时刻的快照之间有时间延续。委托的聚合与撤单本质上就是在图上进行的“生长”和“消亡”。这个项目标题我写完就放不下手因为它不是套个GNN外壳的噱头——订单簿的生成机制本身就在讲故事。我们用图来建模其实是把市场的“呼吸”翻译成模型能听懂的语言。整篇文章会围绕我个人的实现路径展开怎么把原始数据变成图怎么设计边和节点特征怎么选GNN架构训练中踩了哪些很隐蔽的坑以及最后实盘时发现回测与真实交易之间的落差在哪里。如果你正准备用图模型做高频或中频的微观结构预测这篇东西应该能帮你省下不少试错的时间。2. 图构建三步走节点定义、边规则和特征注入2.1 节点怎么定从单档委托到订单簇的聚合逻辑订单簿原始数据是逐笔委托级别的Level-2快照里每个价位都有若干委托单挂着价格、数量、时间戳、买卖方向都有。直接把每个委托单当节点图规模会爆炸而且委托单本身极其不稳定撤单频繁纯合成节点的生命周期太短消息传递根本学不到稳定的结构。我最后采用的是“价位簇”方案把一个快照里价格轴上的每个档位视为一个候选节点然后按照聚合逻辑将相邻且同向的小委托合并成订单簇。这里的合并不是简单相加而是保留簇内委托数量的分布特征——比如簇内是否有超大单、委托笔数是几十笔还是几笔、平均单笔大小是多少。这样每个节点既保留了价位上的总挂单压力又携带了委托结构的细节。具体参数我调过好几轮最终固定成买卖两侧各取15档合计最多30个节点。更深档位并不是没有信息但噪声占比太高而且交易执行很少会触及15档之外。快照频率用的50毫秒也就是说我喂给模型的每个图代表的就是某合约在某一个瞬间的盘口地形。节点特征方面我用了6个维度对数挂单量、该价位相对买一价的偏移、挂单量的一阶差分、该价位近10个快照的撤单频率、委买委卖之间的净压力、以及委托笔数的熵值。这套特征是从“地形”角度设计的——既要描述海拔也要描述坡度和地貌变化。2.2 边怎么连空间邻接、买卖竞争和订单生命周期节点有了边才是图和普通矩阵的真正分水岭。我设计了三种边构成一张复合图。第一种是空间邻接边。把同一侧相邻档位连起来捕捉价格轴上的压力传导。买一被吃穿买二立刻变成新的买一这种“接力”通过邻接边可以被消息传递层直接捕获。第二种是对立竞争边连接同一价格水平上的买方节点和卖方节点模拟买卖双方的互相钳制关系。这部分信息是多头对抗的核心比单纯看价差要丰富得多。第三种是时间延续边。同一个价位簇在相邻快照之间是有关联的——如果买二价某个簇在上一帧还存在下一帧被撤掉模型应该知道这个节点是“死亡了”而不是“消失了”。我在时间边上做了两件事一是记录跨快照存活状态如果某个节点从当前快照到下一快照消失打上移除标记二是用滑动窗口5步的时间边把节点在不同时刻的表示串起来让GNN能沿着时间维度做消息传递。2.3 特征注入的一个大坑别用全局归一化特征工程的细节决定成败这里我必须单独拎出来说。订单簿的价格和挂单量数值在一天之内波动极大——早盘流动性稀疏价格跳动剧烈午盘相对平稳收盘前又会放量。如果你把一整天的数据收集完用全局最小值最大值做归一化就等于让模型站在未来看过去训练时会引入严重的前视偏差实盘一定翻车。我改成了滚动标准化对每个特征只用当前时刻之前的一个时间窗口内的均值和标准差做归一化。窗口长度设为最近200个快照大约是10秒。这样特征漂移的问题被基本压住而且模型在不同市场环境下的输入分布会更稳定。提示如果你拿到的是分钟级订单簿数据节点数会成倍增加时间边窗口建议相应拉长。日线以下级别的数据用这套图构建方法效果会明显打折扣因为它缺失了逐笔委托层面的微观结构细节。3. GNN层怎么选从消息传递到时序池化3.1 消息传递机制如何模拟盘口“呼吸”GNN的核心机制是消息传递每个节点聚合邻居节点的特征更新自身的表示。这跟订单簿的微观结构天然匹配——一个价位上的交易压力变化会直接影响相邻价位消息传递恰好让信息在图上沿着边“流动”起来。我最初尝试了三种图卷积层GCN、GAT和GIN。GCN最稳定训练收敛快但它的聚合权重是固定的不太能区分哪些邻居更重要。GAT引入了注意力机制让每个节点学会给不同邻居分配权重——这一点在订单簿上很关键因为买二对买一的影响在不同市场状态下权重完全不同趋势市里买一更依赖买二的承接力震荡市里则对卖侧的压制更敏感。但GAT训练时容易震荡需要把学习率压得很低。GIN理论上表达能力强可我实测中它对噪声的容忍度太差盘口数据本身信噪比不高GIN很容易把撤单噪声当成有效信号。最终我选择了GAT为主干但做了一些改进在注意力计算里加入了边属性把空间边、竞争边、时间边各自编码成不同的边特征让注意力层能感知“这条边是买卖对抗还是时间延续”。实测下来这个加权方式对模型的短期波动率预测有明显提升。3.2 图快照序列单张图不够要会“呼吸”单张图只能代表某一瞬间的盘口状态但市场微观结构本质上是时间序列过程。因此我采用了“图快照序列”方案每50毫秒生成一张图连续10张图组成一个输入序列。每张图经过GNN编码后得到一个图级别的表示向量再将这10个向量送入一个GRU模型进行时序编码。这样设计的好处是GNN负责空间拓扑建模GRU负责时间依赖建模两者各司其职。如果用纯LSTM或Transformer来建模时间序列它们对订单簿空间结构的感知是盲的——虽然可以输入多档数据但无法理解“买一被吃穿后买二补位”这种结构性的变化。反过来如果只用GNN处理所有时刻消息传递会把时间维度上的噪声放大模型复杂度也会急剧上升。GRU的隐藏层我设为64GNN层的输出维度也是64最后接入池化层对整个序列的表示进行融合。池化方式我试过最大池化、平均池化和注意力池化最终用的是注意力池化——让模型自己决定在预测时刻应该重点关注哪几个快照。这个操作在盘口变化剧烈的时段尤其有效。3.3 动态图池化的最后一个细节模型最后需要输出预测结果所以我必须把整段序列的图表示压缩成一个向量。动态图池化在这里不是简单地把所有节点表示做平均而是分层处理先对每个快照内部的节点表示做基于注意力的软池化得到该快照的图级表示再把序列中10个快照的图级表示通过另一个注意力层加权融合。这个“两次注意力池化”的设计让模型既能捕捉某一瞬间盘口内部的结构特征又能理解整个时间窗口内哪些时刻更重要。实际操作中我发现如果不加第二次时序注意力模型对趋势转换点的反应会迟钝很多——因为平均池化会把转折点前后的信息互相稀释而注意力池化能突出转折点本身。4. 训练中的“隐形阻力”样本组织、标签设计和过拟合防线4.1 时间序列样本切分避免特征穿越是头等大事图模型本身没有记忆功能但它依赖连续多帧快照构成的序列这就带来一个天然风险训练集和验证集如果按时间顺序连续切分两边的分布几乎一样模型看着像学到了东西实则可能只是“背”下了临近时刻的模式。我采用的方案是按时间块而非逐样本切分把连续交易的日志按小时划分成多个块随机抽取70%的块作为训练集15%作为验证集15%作为测试集。关键是保证在同一个时间块内部的样本是连续的但不同块之间可以跳跃。这样测试集和训练集之间的时间间隔是不规则的能更真实地反映模型面对未见过市场状态的泛化能力。另一个容易被忽视的坑是特征标准化。如果你用整个训练集计算均值方差再对测试集做标准化其实已经引入了泄漏。我改成了“训练集内滚动统计”——每一个样本的特征标准化参数只由它之前的数据计算。这会让训练速度稍微变慢但换来的是评估结果的可信度。同行的反馈也证实很多看起来效果不错的GNN模型一旦改成滚动标准化就原形毕露精度掉下来10%到15%这才是真实的泛化水平。4.2 标签生成预测未来60毫秒的方向性变动标签的设计直接决定模型学什么。我最初的实验是预测未来若干档位的挂单量变化但发现这种回归目标噪声极大而且挂单量变化和价格变动之间存在非线性关系。之后我改成两个任务兼顾主任务是预测未来60毫秒内最优买卖价中点mid price的变动方向三分类——上涨、下跌、不变辅助任务是预测未来60毫秒的成交量用于判断预测的可信度。60毫秒这个窗口是经过对比得出来的不是拍脑袋。10毫秒窗口内价格方向几乎接近随机噪声30毫秒窗口的预测置信度不足120毫秒开始掺入明显的外生信息。60毫秒是微观结构信号还未完全消散、且仍有交易意义的时间尺度。标签生成中还有一个细节不能直接用tick数据的最后成交价作为标签依据因为最后成交价受盘口边缘的噪音影响太大。我使用的是中间价值——即买一价和卖一价的平均值作为基准。中间价值的变动更平滑也更能反映订单簿本身的供需变化。4.3 过拟合防线Dropout、早停法和剪枝策略GNN模型的参数量其实不大但在订单簿这种海量样本上过拟合的还是很快。我试过加深GNN层数从2层加到3层验证集效果提升微弱但训练集逼近100%准确率明显进入记忆状态。最后我固定为2层消息传递并在每层后加了dropout概率0.3。早停法配合按时间块的验证集效果很好。我观察验证集的F1分数连续20个epoch不改善就停止训练然后回滚到最佳权重。这个过程中有一个值得注意的现象验证集的F1在第30到第50个epoch之间有时会小幅震荡需要耐心等待过早停止可能错过次优解。另外一个容易被忽略的防过拟合策略是节点剪枝在训练过程中随机丢弃10%的节点及其连边。这和传统的dropout不同它让模型不能过度依赖某几个核心档位的特征必须学习整体结构的模式。这个策略对盘口数据的鲁棒性提升帮助明显尤其是在测试集碰到极端行情时。5. 回测与实盘的落差特征衰减、滑点与流动性自适应5.1 回测曲线很好看为什么实盘“见光死”这是整个项目最扎心的部分。回测里GNN模型确实跑出了一条漂亮的净值曲线夏普比率接近3但拿到模拟盘上一跑就露馅了。主要有两个原因。第一个是可交易深度。回测时假设模型预测的方向上挂单量就是可成交的但实际盘口在模型信号触发的那一刻可能已经被其他资金抢先反应你看到的买一价挂单在几毫秒后就变成了更薄的单子。模型预测得越准触发信号的越快意味着你跟市场的其他参与者抢的是同一批单子。滑点一算进去收益就被削掉一大块。第二个是特征衰减。市场微观结构参与者的构成是动态变化的当某种套利策略失效后部分做市商退出订单簿的撤单频率、挂单深度分布都会发生系统性变化。我最初训练的模型在第40天时还表现不错到第60天精度就开始下滑到第90天几乎退化到随机水平。这不是模型自身的问题而是它赖以建模的“市场基础设施”变了。5.2 执行可行性过滤让模型学会“看一下再说”针对实盘兑付落差我做了一个关键改动给信号加了执行可行性过滤。模型连续两个快照输出同方向预测且预测置信度超过阈值这时才触发交易逻辑。这个过滤器大幅减少了无效交易次数虽然单次策略收益没有明显提升但手续费和冲击成本的占比急剧下降净收益反而变好。阈值的选择我用的是动态阈值根据当天盘口的平均价差和挂单深度动态调整——价差变宽时提高阈值深度变薄时降低阈值。这样在流动性好的时段表现更积极在流动性差的时段更保守。5.3 按市场状态分模型开盘、震荡与放量另一个实盘前确认关键改动是市场状态自适应。同一套模型在处理开盘集合竞价后的混乱阶段、午盘平稳阶段和收盘前放量跳变阶段时效果差异很大。我一度怀疑是GNN层数不够后来对比了不同时段的数据分布才发现是模型根本没有学到不同状态的差异化特征。解决方案比较朴素但有效把数据按波动率分位和成交量分位划分成三个状态区间分别训练三套模型参数实盘时根据当前市场状态即时切换。这个“分而治之”的方案工程实现上多维护了两套参数但确实把F1分数从0.52提升到了0.59左右。你如果做类似的GNN建模我强烈建议把市场状态分段当作前置步骤而不是让模型自己去适应否则训练时间会成倍增加但效果还是平庸。6. 我踩过的几个坑和能直接抄的建议6.1 坑一撤单事件被当成普通负样本最初我在节点特征里记录了撤单数量但消息传递层会把撤单和新增委托一并当成邻居信息聚合。结果模型对撤单尤其密集的时段反应怪异经常输出假信号。后来我单独把撤单事件编码成边属性——当一条时间边连接的节点在下一帧被撤销在这条边上打上撤销标记而不是把撤单量塞进节点特征里。改动很小但模型对“正在消失的支撑位”的判断一下变准了。6.2 坑二图采样破坏了连通性为了加速训练我最初对订单簿做了子图采样——随机抽取一部分节点。结果很多本应连通的买卖竞争关系被硬生生切断了模型学到的图结构是残破的。后来改成连通子图采样策略只从时间维度做滑动窗口的折叠不随机裁剪图节点空间。这样图的连通性保留住了训练时间虽然增加了25%但模型输出的稳定性显著提高。6.3 坑三复权问题导致训练集分布漂移我前期忽略了分红、合约换月、隔夜跳空等因素对特征分布的影响导致训练集前半段和后半段的特征均值显著不同。GNN模型以为自己学到了规律其实是在跟时间玩“跷跷板”。后来我在数据预处理阶段增加了复权对齐和隔夜跳空标记把跳空时段单独作为标记特征喂给模型。这个细节让回测曲线变得平滑很多。6.4 一个可以救命的工作习惯记录注意力权重用GAT做模型有个额外好处——注意力权重可解释。我在训练时定期导出模型对某个时间窗口内注意力最高的节点分布画成热力图。这不仅用于分析模型关注哪些价位更重要的是用来诊断数据问题。有一次热力图上全是最低价附近节点一查发现是数据源的中间价值在某时段出现跳变导致特征污染。没有这个可视化工具我可能又要多花几天排查。6.5 重训频率别等到过拟合后才动手模型上线后重训策略需要提前定好。我试过每天重训和每周重训最终选择的是“阈值触发加定时重训”的结合方案每天收盘后检测模型在当日数据上的F1分数如果环比下降超过8%就触发额外训练。这种方案既避免了频繁重训导致模型对短期噪声过敏又能在市场风格突变时及时跟进。最后再说两句我的实际体会如果回头看这个项目我最大的感受是GNN在这里的价值不是“用了多先进的模型”而是它尊重了订单簿自身的生成逻辑。图的结构让模型知道相邻价位会相互作用、买卖存在对抗、时间有连续性——这些东西在常规矩阵表达里是被稀释掉的。真正让项目跑起来的反而不是模型层而是图构建时对数据生成机制的敬畏。我最后分享一个小技巧如果你要复现这套方案先别急着上全量数据。拿一个流动性相对温和的合约只建空间邻接边先跑通单快照预测再加上时序模块。每一步改动都能看清增量在哪里。这个顺序能帮你快速判断是图结构带来的提升还是模型本身在拟合噪声。
延伸阅读

更多相关文章

2026/10/22 3:17:31

以太网园区网络改造:IP地址规划与VIP虚拟IP高可用实践

做网络工程这些年,我经手过不少Ethernet以太网项目,但真正让我觉得“值回票价”的,往往是那些把IP规划和VIP高可用想明白了的工程。今天要聊的这个项目,是某园区网络的升级改造,核心就三件事:理清以太网基础…

2026/10/22 3:17:31

Python实战:百度指数数据抓取、清洗与趋势分析全流程

简介:这份Python完整示例代码面向具备基础语法、希望入门数据分析的开发者,围绕百度指数这一关键词热度工具,演示从数据获取到可视化呈现的完整流程。包内共6个文件,以2个py脚本为核心,配合1个csv数据文件、1个txt城市…

2026/10/22 3:12:31

5G NOMA功率分配仿真:SIC解码顺序与MATLAB实现

简介:面向5G通信与NOMA技术研究者,这份资源围绕非正交多址接入中的功率分配问题,提供从理论模型到仿真实现的完整参考,内容涵盖NOMA基本原理、基于用户SINR差异的功率约束策略、恒定与动态功率分配方法对比,并涉及干扰…

2026/10/22 4:22:37

Redis作为AI短期记忆中枢的三大协同模式与数据建模实践

1. 为什么 Redis 突然成了 AI 系统的“记忆中枢”?最近在几个技术交流群里,频繁看到有人发截图:某大模型服务的响应延迟从 800ms 骤降到 120ms,监控图上 Redis 的 QPS 曲线同步冲高;另一份内部架构文档里,“…

2026/10/22 4:22:37

河北专升本汇编第四章:伪指令与程序设计核心考点突破

1. 为什么第四章是专升本汇编的分水岭1.1 从“能看懂”到“能写出来”的跨越河北专升本计算机专业的微机原理与接口技术这门课,很多人的复习轨迹是这样的:前三章学CPU结构、寄存器、存储器寻址,跟着视频课划划重点,做做选择题&…

2026/10/22 4:22:37

MediaPipe手部关键点实时跟踪:从零上手到手势识别实战

1. 从零上手MediaPipe手部关键点实时跟踪第一次接触MediaPipe是在一个体感交互的Demo项目里,当时需要在不依赖深度相机的前提下,仅用普通RGB摄像头完成手部21个关键点的实时定位。试过OpenPose的手部模型,帧率掉到个位数;也试过自…

2026/10/22 4:22:37

可预见误用的工程化:基于仿真的SOTIF误用场景构建与风险闭环

我在一次内部项目评审会上,身边一位产品负责人问了我一个问题:车辆已经发出接管的明确警告,前方也是施工路段的锥桶,驾驶员却低头刷了十分钟手机,最后车辆冲进锥桶堆,这个锅到底算谁的?当时会议…

2026/10/22 4:22:37

uniapp+Java选课系统实战:含MySQL事务、RBAC权限与真机调试

简介:本资源是一套面向高校计算机专业本科生的毕业设计/课程设计级移动端选课系统完整实现,聚焦教育信息化场景,解决传统选课流程中学生选退课不便、教师课程管理低效、教务数据分散等实际问题。资源包共978个文件,32.87MB&#x…

2026/10/22 4:17:36

从零手写AI艺术生成器:扩散模型DDPM原理与实现

朋友问我用什么AI工具画画,我一开始支支吾吾答不上来。不是不会用,而是我就会按几个按钮,底下的原理一问三不知。后来我较上劲了:直接用 Python 和深度学习,从零写一个 AI 艺术生成器——不调现成的图像生成接口&#…

2026/10/21 4:53:08

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/22 0:01:49

电商智能运营体系从0到1:架构设计、落地步骤与避坑指南

前两年我们团队接了一个电商平台的运营中台项目,目标很直白:把过去靠运营拍脑袋做的选品、定价、发券、推活动这些事,逐步用数据算法和自动化流程代替。项目名字内部就叫“电商智能运营体系”。最近有不少朋友问我当时是怎么设计的、踩过哪些…

2026/10/22 0:01:49

若依框架AI代码生成不稳定?用Agent Skill三层结构+五步法搞定

最近一段时间,我一直想把后台管理系统里那些机械重复的增删改查代码交给AI去写。框架用的是若依,按理说这类业务代码模式非常固定,应该是AI最擅长的事情。可真试下来却不是那么回事——你让AI生成一个用户管理模块,它给出的Contro…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑