高频交易系统(14):高频交易中的行情数据

FinTechHi
2812-15 13:16

作者:FinTechHi

题图:FinTechHi微信公众号


先说点题外话。量化投资、高频交易并不是投资成功的唯一出路。

量化投资是金融市场多元投资体系中的重要分支,各类投资方法论本身并无优劣之分,核心评判标准在于能否实现长期、稳定的收益闭环。

无论是价值投资的深度基本面研判、技术分析的趋势跟踪逻辑,还是量化投资的系统化策略构建、高频交易的低延迟套利模式,均是经过市场长期验证的有效盈利路径,彼此并非对立关系,而是适应不同市场环境、风险偏好与资金属性的差异化选择。

对于个人投资者而言,理性的投资态度并非与成熟方法论对抗,而应是对市场主流盈利范式的深度认知与合理借力。

构建可穿越牛熊周期的稳定盈利体系,需要完备的信息获取渠道、扎实的专业知识储备、系统化的策略研发能力及严格的风险控制框架,这对于多数个人投资者而言门槛极高,难以与机构投资者的专业资源形成竞争。

因此,在自身条件允许的前提下,充分了解各类投资方法的核心逻辑与适用边界,将专业的投资决策委托给具备成熟体系与风控能力的专业机构或团队,实为更具效率的财富管理选择。

好,回归正题:level2。

量化投资会依赖于行情数据,短周期的高频交易一般情况下只依赖行情数据。

A股股票市场行情数据分level1和level2。

量化投研中一般需要用到:历史行情,按具体策略对应的模型要求,同市场上主流且获得交易所授权的行情资讯商采购专业的数据,并获得专业的服务。目前网上免费的行情,个人研究所用可以的,但如果要好好的做策略,这个钱还是需要花的。

量化策略实盘中一般使用:实时行情。实时行情接入要看具体证券或期货公司的具体接口。其他文章已表,不再赘述。

1.从level1到level2

level1是沪深交易所发布基本行情的统称,主要包括:静态信息和level1行情信息。

静态信息主要包括产品基础信息文件(股票的基本信息,如总股本,市值,上市时间等)、非交易基础信息文件(分红派息、送股等)、竞价行情文件(及大家常说的level1)以及债券行情文件等。

  • 其中集合竞价行情包括内容:证券代码、证券简称、前收盘价格、虚拟开盘价、虚拟匹配量、虚拟未匹配量和虚拟未匹配量的剩余方向等。
  • 其中证券快照行情(俗称为level1行情),对应的就是我们在PC或手机app交易终端看到的5档行情内容,主要包括了:证券代码、证券简称、前收盘价格、最新成交价格、当日最高成交价格、当日最低成交价格、当日累计成交量、当日累计成交金额、实时最高五个买入申报价格和数量、实时最低五个卖出申报价格和数量等。
  • 以及指数快照行情:包括证券代码、昨收盘价格、开盘价格、最高价格、最低价格、最新价格、收盘价格、成交量、成交金额以及成交时间等。

level1行情在连续竞价阶段是3秒发送一次,所以满打满算一直股票每天会有4800条level1快照行情,但因为个别股票存在临停、涨跌停等状态,或者是股票流动性不足交易不活跃,则每只股票实际的level1行情每日记录数是不同。基于level1数据,在量化投资中一般会使用不同频率的,对应到不同的策略上。比如聚合成1/5/10/15/30/60分钟/1Dk线(bar)等。

可以看到不同频率的行情,在信息层面,即包括的字段都一样,基本上围绕ohlc(高开低收以及成交量等字段)唯一区别就是数据量多少,而这正是我们构建模型相关性最高的其中一个因素(先不谈噪音)。特别对ML和DL而言,数据量必须足够才能保证模型的泛化能力。

针对level1行情能提供信息的有限性,所以对量化投资而言,我们就需要level12数据。level2数据沪深交易所对其使用授权有合规和标准的管理,获得授权的公司可以提供历史行情服务、实时行情转发、实时行情展示等。

level2行情主要包括4块内容:10档快照、委托队列(默认50档)、逐笔委托、逐笔成交。

我们通过APP客户端直观看下数据内容。

其中level2快照行情为3秒更新的10档快照,部分app终端会展示千档行情。行情档位代表着一个股票上的订单深度,展示的档位越多,越能看到某只股票上买卖双方在价格上的博弈情况,另外委托队列中可以看到某个档位下对应的所有委托量的构成,比如买1盘看到1万股,是由1个1万股构成的,还是由10个1000股构成的。

图片

下面是逐笔委托和逐笔成交,市场上每发生一笔报单或撤单,就会体现到逐笔委托中,有订单成交就会在逐笔成交中看到。因为涉及到沪深交易所发送逐笔的定义规则不同,以及分笔成交等,所以在界面中看到的信息不具有“唯一性”,比如无法直观区分是否分笔成交,无法直观看到撤单、无法直观看到成交单是主买单还是主卖单等。

图片

所以针对level2的界面展示信息,对日常投资中有用,但不多。

结合量化策略从level1行情的局限,到高频策略需要在更微观角度的分析,就衍生了高频交易中对于level2数据的需求。

通过level2,我们可以不仅仅局限于基于ohlc的纯量价角度做分析,可以基于逐笔数据挖掘撤单行为、主买主卖行为、大小单行为(各方力量的跟踪)、算法拆单跟踪(根据订单等差,等比等)等等。更丰富了量化因子挖掘的维度和思路。

另外基于逐笔行情,可以构建实时订单薄,可以发掘10档外的因子,预测的周期约端,相对来说,基于微观角度的变化越容易捕捉,比如某个大买单出现引起订单薄失衡,那在极端的时间中,价格一定会向一方移动,而这短暂的上涨和下跌就是高频交易捕捉的一次价差机会。

2.level2数据结构

基于PC或APP终端,无法捕捉level2的价值,所以在量化投资中,我们需要获取level2历史数据来进行量化研究,并在实盘中接入level2行情进行高频策略交易。

因市场上所有股票level2行情都来源于交易所,所以我们看一些交易所对level2行情的基础知识。

1)关于level2接收

接入用户通过会话将自身的系统(用户行情系统,简称“VSS”)连接到行情网关MDGW。该连接为标准的TCP/IP点对点连接。MDGW为用户行情系统提供两个服务端口,实时数据端口,重传服务端口。每一个端口只能建立一个TCP/IP连接。网络版行情网关提供重传服务端口。

行情网关与用户行情系统之间设有流量控制机制,如果用户行情系统不能够及时处理行情网关发送的数据,从而导致行情网关累积的待发送消息超过设定的阈值后,行情网关将会立即断开和用户行情系统的连接(注意:考验连续竞价开盘时或行情火爆后的行情峰值。)。在连接断开之后,用户行情系统应该尝试重新连接行情网关。

用户行情系统与行情网关间最多可建立两个会话:实时数据会话,用于传输实时数据;重传服务会话(网络版行情网关提供),用于重传缺失的数据。快照行情数据(包括证券实时状态)定时发布,不能重传。逐笔行情数据支持重传。

在行情网关发送的每个逐笔行情消息中,都会包含该消息所属的频道代码和消息记录号。消息记录号在一个频道内从1开始顺序递增,如出现记录号跳变的情况,说明逐笔行情消息出现丢失,用户行情系统可通过发送重传消息请求补传缺失的逐笔行情消息。沪深交易所都通过消息号+频道号 来确定逐笔数据的有序性。部分level2历史行情资讯商提供的数据中可能还会包含自己收取数据时记录的消息编号以及localtime。

对于逐笔行情数据通过频道代码和消息记录号判断是否有消息丢失,当收到的消息记录号<=本频道已经收到的最大消息记录号时,说明已经收到过该消息,此时应忽略该消息;当收到的消息序号>已经收到的最大消息记录号+1(如已收的最大消息记录号=10,新的消息记录号=12)说明发生了消息丢失,此时应通过重传服务请求丢失的数据。

2)逐笔行情

逐笔行情包括逐笔委托行情和逐笔成交行情,两者按照发生的顺序在一个数据流中发送。以深交所为例,同一个频道内的逐笔委托和逐笔成交消息的记录号(ApplSeqNum)统一连续编号。上交所以biz_index来作为消息编号。

逐笔行情支持两种不同的发送模式:模式一将逐笔委托和逐笔成交要分别打包到不同的STEP消息中,由于逐笔委托与逐笔成交消息会交替出现(极端情况下会出现一笔逐笔委托一笔逐笔成交交替),从而导致STEP消息头占用大量的负载,降低了FAST编解码效率,且增加了带宽占用。模式二通过将逐笔委托及逐笔成交合并到一条STEP消息中发送,从而降低STEP消息头占用的负载,提升了FAST编解码效率,降低了带宽占用。

逐笔行情在集合竞价9.25结束后批量发送,在连续竞价阶段实时发送,至少目前时间是毫秒,对量化研究会造成一小点问题。

3)深交所level2逐笔数据定义

以深交所官方的行情接口为例,其中逐笔委托核心业务字段(我只摘取核心字段)如下:

ChannelNo频道代码
ApplSeqNum消息记录号,从1开始计数
SecurityID证券代码
Price委托价格
OrderQty委托数量
Side买卖方向:1=买 2=卖
OrdType订单类别:1=市价 2=限价 U=本方最优

逐笔成交的核心业务字段如下:

ChannelNo频道代码
ApplSeqNum消息记录号,从1开始计数
BidApplSeqNum买方委托索引,从1开始计数,0表示无对应委托
OfferApplSeqNum卖方委托索引,从1开始计数,0表示无对应委托
SecurityID证券代码
LastPx成交价格
LastQty成交数量
ExecType执行类型,4=Cancelled, 主动或自动撤单执行报告,F=Trade, 成交执行报告。
TransactTime成交时间

二者关联的字段是:逐笔委托结构中ApplSeqNum和逐笔成交中BidApplSeqNum或OfferApplSeqNum。

以一笔集合竞价期间的逐笔成交为例:

['2015', '492923', '011', '329054', '250101', '300517', '102 ', '11.5000', '2500', '70', '09:25:00.000', '09:25:02.245', '478...']

释义如下:

  • ChannelNo=2015 频道下的成交记录
  • 成交的唯一序列号 ApplSeqNum=492923
  • 该成交由以下两个订单撮合成交:
    • 买方订单: BidApplSeqNum=329054 (对应order数据中ApplSeqNum=329054的买单)
    • 卖方订单: OfferApplSeqNum=250101 (对应order数据中ApplSeqNum=250101的卖单)
  • 成交价格 LastPx=11.5000 元,成交量 LastQty=2500 股
  • 成交类型 ExecType=70 表示正常成交
  • 成交时间 TransactTime=09:25:00.000 (开盘集合竞价)

下面是一笔连续竞价阶段的逐笔数据:

['2015', '513896', '011', '300517', '102 ', '11.6700', '1000', '49', '09:30:00.050', '50', '09:30:00.538', '494097', '']

释义如下:

  • 订单编号:ApplSeqNum=513896
  • 价格:11.6700元
  • 数量:1000股
  • 方向:Side=49(买单)
  • 时间:09:30:00.050(下单时间)
  • 订单类型:OrdType=50(限价单)

4)上交所level2逐笔数据定义

上交所之前逐笔数据是分开发送,自2023年11月27日对逐笔数据合并成一个数据结构来发送,具体定义如下:

BizIndex逐笔序号,从1开始,按Channel连续
Channel通道
SecurityID证券代码
TickTime订单或成交时间(百分之一秒),14302506表示14:30:25.06
Type类型:A-新增委托订单;D-删除委托订单;S-产品状态订单;T-成交
BuyOrderNO买方订单,若为产品状态订单或卖方订单无意义
SellOrderNO卖方订单,若为产品状态订单或买方订单无意义
Price价格(元),若为产品状态订单、删除订单无意义
Qty数量,若为产品状态订单无意义
TradeMoney新增委托:已成交的委托数量(精度三位);成交:成交金额(元,精度五位);其他无意义
TickBSFlag新增/删除委托:B-买单、S-卖单;产品状态:START/OCALL/TRADE/SUSP/CCALL/CLOSE/ENDTR;成交:B-外盘(主动买)、S-内盘(主动卖)、N-未知

两个交易的逐笔数据定义结构及字段略有不同。从重构订单薄角度来说,深交所的逐笔数据显然更好处理一点,但上交所发送数据的机制更科学。上交所逐笔数据重构订单薄关键一点是:对部分原始委托要进行还原,主要原因我们看官方文档中表述:

连续竞价阶段,同一笔委托产生的主动成交及剩余新增委托订单数据,先发送成交数据,再发送成交后的新增委托订单数据(对应委托量为首次撮合后的剩余委托量);之后再产生的剩余委托订单数据不再发布;若一笔订单被一次性全部撮合,将不会发布该笔订单的委托信息。

举几个典型的订单特征:

  • 五档即时成交剩余转限,type顺序为:T、A、T。
  • 五档即时成交剩余撤销,type顺序为:T、A、D。
  • 限价买入全部成交,type为:T,且一笔,全部分别成交则为连续几个T。
  • 限价买入且全部撤单成功,type顺序为:A,D,若部成部撤,则为A,T,D。

官方文档是最优价值含量的文档,每次认真读,都会找到更深刻的理解。

3.level2数据涉及的开发工作

1)历史行情的存储和读取

在高频交易场景中,历史行情数据属于典型的冷数据,访问特征以“读为主、写极少”,其技术方案设计的核心目标是兼顾查询便捷性与检索效率,同时适配数据量的规模化增长。

从数据量级来看,纯股票Level-2原始数据单日约为数十GB,虽经压缩可降至数GB级别,但高频交易投研过程中需频繁查询特定标的、特定时间段的明细数据(如逐笔委托、逐笔成交、盘口快照等),压缩存储会引入额外的解压开销,反而降低查询效率。随着数据累积(如数年沉淀),整体数据量将达到TB级规模,对存储架构的扩展性与检索性能提出更高要求。

当前主流的存储与查询方案需结合实际数据量规模及投研业务需求选型,并在实践中动态优化,主要包括以下三类:

1. 文件级分拆存储方案:按证券代码(code)维度聚合,将单只证券对应的Level-2全量四类数据(逐笔委托、逐笔成交、盘口快照、委托队列)存储为单个H5文件,便于按标的快速定位;或进一步按“证券代码+数据类型”二维分拆,将四类数据分别存储为Feather/Parquet格式文件,利用列式存储特性提升单类数据的检索速度与过滤效率。

2. 列式数据库方案:直接采用专业列式数据库(如ClickHouse、Apache Doris、dolphindb等)存储结构化行情数据,借助数据库的索引优化、分区策略(如按时间/证券代码分区)及并行查询能力,支持复杂条件下的高效过滤与聚合查询,适配TB级数据的规模化检索场景。

2)基于逐笔行情构建订单薄

具体订单薄的构建方法参考我订单簙系列文章:限价订单薄系列(9)订单薄结构小结

  • 要构建特定市场的订单薄,则需要结合特定市场的逐笔数据特定,一个概要的思路是:
  • 确定原始逐笔数据中包括委托、撤单、成交->
  • 把3类数据看做是3个事件:委托、撤单、成交,其中委托,撤单影响订单簙变动,成交不影响订单簙变动,只影响档位的量。
  • 把所有事件按股票为单位处理成一个消息流。
  • 按订单簙构建的标准流程进行。


3)基于level2行情或订单簙行情因子依赖数据的抽象

因子研究中会用到原始数据,为避免因子中直接处理数据逻辑,可对一些共用的数据定义成标准的数据接口。

4)基于level2数据或订单簙的行情回放及高精准回测

行情回放主要考虑的是多股票池(如几千个)下,连续几个月的模拟回测的效率问题。回测的效率越高,投研效率就越高,越可以把研究成果尽快更新到实盘验证。


免责声明:
您在阅读本内容或附件时,即表明您已事先接受以下“免责声明”之所载条款:
1、本文内容源于作者对于所获取数据的研究分析,本网站对这些信息的准确性和完整性不作任何保证,对由于该等问题产生的一切责任,本网站概不承担;阅读与私募基金相关内容前,请确认您符合私募基金合格投资者条件。
2、文件中所提供的信息尽可能保证可靠、准确和完整,但并不保证报告所述信息的准确性和完整性;亦不能作为投资决策的依据,不能作为道义的、责任的和法律的依据或者凭证。
3、对于本文以及文件中所提供信息所导致的任何直接的或者间接的投资盈亏后果不承担任何责任;本文以及文件发送对象仅限持有相关产品的客户使用,未经授权,请勿对该材料复制或传播。侵删!
4、所有阅读并从本文相关链接中下载文件的行为,均视为当事人无异议接受上述免责条款,并主动放弃所有与本文和文件中所有相关人员的一切追诉权。

0
好投汇
第一时间获取行业新鲜资讯和深度商业分析,请在微信公众账号中搜索「好投汇」,或用手机扫描左方二维码,即可获得好投汇每日精华内容推送和最优搜索体验,并参与编辑活动。

推荐阅读

0
0

评论

你来谈谈?
发表

联系我们

邮箱 :help@haotouxt.com
电话 :0592-5588692
地址 :福建省厦门市湖里区航空商务广场7号楼10F
好投汇微信订阅号
扫一扫
关注好投汇微信订阅号
Copyright © 2017-2025, All Rights Reserved 闽ICP备19018471号-6