行情接入:从模拟行情源切换到交易所直连行情

做市系统从模拟盘迁移到实盘,最刺激的一步就是行情切换。模拟盘时你用的可能是自己造的假数据,或者从历史库里回放的老数据。但实盘不一样,交易所的行情是活的,而且L1和L2的数据差异,搞不好会让你整个策略崩掉。

我个人习惯,先把行情源分清楚。模拟行情源通常长这样:

  • 本地CSV文件回放
  • 数据库里存的TICK快照
  • 第三方模拟网关(比如CTP的模拟环境)

而实盘直连,你得面对交易所的行情网关。拿国内期货市场举例,就是CTP的行情前置机。嗯,这里要注意,CTP的行情接口和交易接口是分开的,别搞混了。

L1和L2到底差在哪?

说白了,L1是快照行情,L2是逐笔行情。我在项目中遇到过不止一次,有人把L1当L2用,结果策略在实盘里频繁报单又撤单,手续费亏得比利润还多。

来看个对比表:

维度 L1(Level 1) L2(Level 2)
数据频率 约500ms-3s一次快照 逐笔成交,微秒级
盘口深度 通常只有买卖5档 买卖10档甚至全量
成交量 累计成交量 每笔成交明细
订单信息 逐笔委托(部分市场)
延迟 较高,适合低频策略 极低,适合高频做市

做市系统,说白了就是靠吃盘口差价活着。你用L1的500ms快照去算中间价,等你算出来,行情早变了。所以实盘做市,L2是标配。

切换时最容易踩的坑

我曾经在切换行情源时,没注意时间戳的精度。模拟行情的时间戳是毫秒级的,但CTP的L2行情是微秒级。我的策略里有个订单簿重建逻辑,直接用时间戳做排序,结果微秒和毫秒混在一起,订单簿乱成一锅粥。

避坑指南:

  • 时间戳统一用纳秒或微秒,别混用
  • L2的逐笔成交和L1的快照,要分开处理
  • 行情网关断线重连后,要清空旧数据重建订单簿

代码层面的切换要点

我一般会封装一个行情抽象层。模拟和实盘都实现同一个接口,切换时改个配置就行。给你看个简化版:

// 行情接口抽象
interface IMarketDataFeed {
    // 订阅合约
    void Subscribe(string symbol);
    // 取消订阅
    void Unsubscribe(string symbol);
    // 注册行情回调
    void OnMarketData(Action<MarketData> callback);
}

// 模拟行情实现
class SimMarketDataFeed : IMarketDataFeed {
    // 从CSV文件读取数据,按时间戳回放
    // 注意:模拟时速度可以调快,但实盘必须实时
}

// 实盘CTP行情实现
class CTPMarketDataFeed : IMarketDataFeed {
    // 直连CTP行情前置机
    // 处理心跳、重连、数据校验
}

为什么这样做?你想想看,模拟盘和实盘切换时,最怕的就是改代码。你改一行,可能引入十个bug。抽象层隔离后,切换就是改个配置文件的事。

L2数据的特殊处理

L2行情里有个东西叫「逐笔成交」,它和L1的累计成交量不一样。逐笔成交是每一笔实际成交的明细,包括价格、数量、时间、买卖方向。

我在做市策略里,会用逐笔成交来估算瞬时流动性。比如某只股票,L2显示最近1秒内有10笔大单买入,那说明买方力量强,我的做市报价就要往卖盘倾斜。

小技巧:L2的逐笔成交数据量很大,别直接丢到策略里算。我习惯先做一层聚合,比如按100ms窗口聚合出买卖压力指标,再喂给策略。这样既保留了L2的精度,又不会让策略被高频噪声干扰。

行情网关的容错设计

实盘行情网关不是100%可靠的。CTP偶尔会断线,交易所也会维护。你的系统必须能优雅处理。

我建议的容错策略:

  • 双行情源:主用CTP,备用其他行情商(比如万得、彭博)
  • 断线检测:连续3秒没收到行情,触发重连
  • 数据校验:收到行情后,检查价格是否在合理范围(比如涨跌停内)
  • 降级处理:如果L2断了,自动降级到L1,但策略要降低报单频率

嗯,这里有个血泪教训。我曾经只依赖一个行情源,结果交易所网关升级,断线了5分钟。那5分钟里我的做市系统还在按旧行情报价,直接被人套利套走了十几万。从那以后,双行情源就成了我的标配。

知识体系结构图

下面这张图,概括了行情接入的核心逻辑:

行情接入核心逻辑 模拟行情源 交易所直连行情 切换 L1 快照行情 频率:500ms-3s 深度:买卖5档 L2 逐笔行情 频率:微秒级 深度:买卖10档+逐笔成交 行情抽象层(IMarketDataFeed) 做市策略引擎

从图里你能看到,行情源切换不是简单的换根网线。它涉及数据格式、频率、深度、容错等多个维度的变化。我建议你在模拟盘阶段,就先把L2的代码写好,用历史L2数据回放测试。等模拟盘跑顺了,再切到实盘L2,这样风险最小。

核心总结:行情接入是模拟盘到实盘迁移的第一道坎。L1和L2的数据差异,直接影响你的做市策略能不能赚钱。用抽象层隔离变化,用双行情源保证可用性,用逐笔聚合提升策略质量。这三件事做好了,行情切换就稳了。


公众号:蓝海资料掘金营,微信deep3321