笔者最近接手的项目是实现中国证券市场实时行情数据解析及推送服务,功能主要针对的沪深A股、股指、中小板、创业板和基金债券的盘中实时行情数据,其中的推送服务需要兼容既有系统实现。
对这部分业务有了解的同学应该知道其中的艰辛:那真是一入宫门深似海,再回首已百年身。每当我惊骇于两所(沪深交易所,下同)对于相同的业务数据给出完全不同的数据定义时,可敬的业务达人就会笑容可掬地告诉我一长串历史掌故、一系列系统变迁究竟是怎样塑造了当前的现实;而每当我表达绝望之情时,业务达人们还会宽慰地鼓励我说:“别灰心嘛,在码农里面你绝对算是业务知识丰富的,你至少已经掌握了全部业务知识的……0.1%啦”。
以两所定义的“指数当前成交量”为例:
沪市中是指数行情消息UA3113中的对应字段387,TotalVolumeTraded,参与计算相应指数的交易数量,单位手:
摘自《上海证券交易所LDDS系统Level-2行情接口说明书》P17,下载地址链接: https://pan.baidu.com/s/17PP_9zGwmnTmhYkfz2x-Yg 提取码: ew2q
对这个字段的描述如下:
摘自上证资源配置文件template.2.13.xml
深市中是对应字段是指数快照行情309011或者成交量统计指标快照行情309111(为啥有两个?别问,都是辛酸泪。自己百度置换指数吧……也许过几天有功夫能细聊下)中的对应字段TotalVolumeTrade,成交总量,单位股:
摘自《深圳证券交易所Binary行情数据接口规范》P20,下载地址链接:http://www.szse.cn/marketServices/technicalservice/column/interface/P020180829499274812145.pdf
对这个字段的描述如下:
摘自《深圳证券交易所Binary行情数据接口规范》P28,下载地址链同上
摘自《深圳证券交易所Binary行情数据接口规范》P24,下载地址链同上
好了总结一下,对于同一数据“指数当前成交量”:
沪市的定义是int64,单位手(100股)其中末尾5位为小数(前面2位小数表达股数);
深市的定义是int64,单位股,总长15位(不知道在int64类型约定下限定总长15位有何意义……),其中末尾2位为小数。
PS: 顺便吐槽一下我们项目需要兼容的“前辈”实时行情数据推送系统。在处理“指数当前成交量”时,这位“前辈”既不考虑数据精度,也不考虑单位统一,而是简单粗暴地截断所有小数,导致精度丧失;同时保留了两市数据的不同单位,把确定数据单位的工作甩锅给下游的数据消费者。个人认为这样的实现有违一个行情数据解码、推送服务应有的初衷:1. 无损地忠实于源数据; 2. 数据模型的整合统一;所以这种现状实在是应该改变的“陋规”。