量化研究提醒:回测与实盘,订单簿处理逻辑要保持统一

用户头像sh_**772oqg
2026-08-25 发布

在搭建盘口因子、短线仿真模型的过程中,很多策略研究者都会对接 A 股实时行情 API 获取 Level2 数据。早期我做工具开发时,关注点大多放在提取成交价、成交量这类基础指标,认为拿到接口返回数据,直接解析渲染就可以投入回测使用。

经过多组回测对比之后才意识到:盘口订单簿的结构化信息,是短线模型重要的数据输入源;解析逻辑的缺陷,会造成本地订单簿与真实市场盘口出现偏差,直接带来回测失真、实盘信号偏移的问题。

普通行情与 Level2 盘口的数据差异

普通行情接口输出字段较为精简,适合基础行情展示,核心字段包含最新成交价、累计成交量、涨跌幅等。

Level2 数据的核心价值在于还原订单簿状态,提供五档买卖价格、委托挂单量、成交方向、委托变动等深度信息,可用于观测多空委托力量的动态变化,是盘口因子、盘口压力模型的基础数据源。

这里存在一个容易被忽视的工程问题:不同 A 股实时行情 API 对外输出的盘口字段格式并不统一。部分接口将档位封装为数组返回,也有接口把买盘、卖盘拆分为独立字段。如果缺少统一的解析适配层,在回测、实盘两套环境切换数据源时,盘口指标、多空力量的计算逻辑极易出现不一致。

标准五档盘口报文一般包含标的代码、买盘数组、卖盘数组、时间戳。在我的处理流程中,会将买盘、卖盘做分离解析:

  • 买盘维度:提取买一价格、买一挂单量,统计买方整体委托深度
  • 卖盘维度:提取卖一价格、卖一挂单量,评估卖方抛压水平

买卖盘分开处理,便于后续盘口失衡、深度斜率等因子的计算,也便于开展单元调试,降低回测环境下的数据 bug 排查成本。

原始 Level2 报文不可直接用于模型计算,标准化是必要环节

无论是回测回放历史 Level2 数据,还是实盘接收实时推送,都不建议直接使用原始接口报文参与模型运算,必须完成数据标准化处理。

原始报文可能存在档位排序异常、字段格式不统一等情况。经过标准化之后,才可以统计买卖盘总委托量,计算盘口失衡等中间指标,作为模型输入特征。需要注意,单一盘口指标无法独立作为交易依据,模型构建时仍要结合成交速率、价格序列、市场环境做多维度约束。

盘口档位更新频次很高,HTTP 轮询可以实现单次数据查询,但高频轮询会消耗接口配额,同时容易丢失盘中瞬时的订单簿变化。面向实盘监控、实时信号生成的场景,WebSocket 推送模式更适合。

在方案验证阶段,订阅 A 股 Level2 数据流,接收推送报文完成盘口结构解析。

import websocket
import json

def on_message(ws, message):
    data = json.loads(message)
    symbol = data.get("symbol")
    bids = data.get("bid")
    asks = data.get("ask")
    print("股票:", symbol)
    print("买盘档位:", bids)
    print("卖盘档位:", asks)

def on_open(ws):
    sub_payload = {
        "action": "subscribe",
        "symbol": "600000",
        "type": "level2"
    }
    ws.send(json.dumps(sub_payload))

if __name__ == "__main__":
    ws_app = websocket.WebSocketApp("wss://api.alltick.co/stock/websocket",
                                    on_open=on_open,
                                    on_message=on_message)
    ws_app.run_forever()

⚠️说明:以上为最小演示代码。用于回测回放、实盘策略系统,需要补充断线重连、重复报文过滤、时间戳校验逻辑。一旦发生报文丢失,订单簿状态会出现断层,后续因子计算、信号输出全部失效。

Level2 盘口解析,容易影响回测与实盘结果的关键细节

在盘口因子开发、历史数据回放的过程中,有三类问题会悄悄干扰模型输出,需要重点处理:

  1. 价格精度处理:A 股不同标的最小变动价位存在差异。直接使用浮点数运算,会引入隐性浮点误差,造成档位匹配错误,回测中会出现本不该触发的信号。建议统一转为整数(分 / 厘单位)进行比较运算。
  2. 报文时序校验:网络传输会造成报文乱序,程序接收数据的顺序不等于行情真实发生顺序。不能按照接收顺序更新订单簿,必须以报文自带时间戳作为时序基准,该规则在回测回放与实盘环境都要保持一致。
  3. 数据存储管控:Level2 推送密度极高,全量存储会带来巨大存储开销。需要根据模型需求设计采样、落库策略,无差别全量保存会抬高回测的数据维护成本。

我的实践方案:优先完成字段归一化,输出统一结构的订单簿对象,再交付给因子计算、存储模块。这样后续切换行情数据源,上层回测模型、策略逻辑不需要大规模修改,保证回测与实盘逻辑一致性。

研究总结

Level2 盘口解析的难点,不在于读取 JSON 字段,而在于理解订单簿背后的资金博弈逻辑,同时保证回测、实盘两套环境的数据处理逻辑完全对齐

单独的价格、挂单量只是离散数字,组合之后可以提取盘口深度、多空失衡等特征,为短线模型提供输入。对于策略研究者而言,将杂乱的原始行情,加工为结构稳定、逻辑统一的数据集,其重要性不亚于获取行情数据本身。

时间戳校验、数据清洗、订单簿解析这些底层工作处理到位,能够有效降低未来因子开发、回测仿真、实盘运行中各类隐性 bug

评论