最近被各种销售忽悠,被各种数据方的SDK和API虐,被各种风格迥异的交易柜台血虐,今晚梳理一下真实的交易和行情是怎么一回事,这是一个非常重要但常常被忽略的事。
在上海证券交易所和深圳证券交易所,产生股票价格的方式有两种,其一是在开盘时的集合竟价,另外就是开盘后的连续竟价。
1.集合竟价
集合竟价是将数笔委托报价或一时段内的全部委托报价集中在一起,根据不高于申买价和不低于申卖价的原则产生一个成交价格,且在这个价格下成交的股票数量最大,并将这个价格作为全部成交委托的交易价格,一般是在9点25的时候成交。集合竟价的基本过程如下: 假设股票G在开盘前分别有5笔买入委托和6笔卖出委托,根据价格优先的原则,按买入价格由高至低和卖出价格由低至高的顺序将其分别排列如下:
序号 委托买入价数量 (手) 序号 委托卖出价数量 (手)
买入 卖出
1 3.80 2 - 1 3.52 5
2 3.76 6 - 2 3.57 1
3 3.65 4 - 3 3.60 2
4 3.60 7 - 4 3.65 6
5 3.54 6 - 5 3.70 6
6 3.75 3
按不高于申买价和不低于申卖价的原则,首先可成交第一笔,即3.80元买入委托和3.52元的卖出委托, 若要同时符合申买者和申卖者的意愿,其成交价格必须是在3.52元与3.80元之间, 但具体价格要视以后的成交情况而定。这对委托成交后其它的委托排序如下:
序号委托买入价数量(手)序号委托卖出价数量(手)
1 1 3.52 3
2 3.76 6 2 3.57 1
3 3.65 4 3 3.60 2
4 3.60 7 4 3.65 6
5 3.54 6 5 3.70 6
6 3.75 3
在第一次成交中,由于卖出委托的数量多于买入委托,按交易规则,序号1的买入委托2手全部成交, 序号1的卖出委托还剩余3手。 第二笔成交情况:序号2的买入委托价格为不高于3.76元,数量为6手。 在卖出委托中,序号1—3的委托的数量正好为6手,其价格意愿也符合要求,正好成交, 其成交价格在3.60元—3.76元的范围内,成交数量为6手。应注意的是, 第二笔成交价格的范围是在第一笔成交价格的范围之内,且区间要小一些。 第二笔成交后剩下的委托情况为:
序号委托买入价数量(手)序号委托卖出价数量(手)
3 3.65 4
4 3.60 7 4 3.65 6
5 3.54 6 5 3.70 6
6 3.75 3
第三笔成交情况:序号3的买入委托其价格要求不超过3.65元,而卖出委托序号4的委托价格符合要求,这样序号3的买入委托与序号4的卖出委托就正好配对成交,其价格为3.65元,因卖出委托数量大于买入委托,故序号4的卖出委托仅只成交了4手。第三笔成交后的委托情况如下:
序号委托买入价数量(手)序号委托卖出价数量(手)
4 3.60 7 4 3.65 2
5 3.54 6 5 3.70 6
6 3.75 3
完成以上三笔委托后,因最高买入价为3.60元,而最低卖出价为3.65,买入价与卖出价之间再没有相交部分,所以这一次的集合竟价就已完成,最后一笔的成交价就为集合竟价的平均价格。剩下的其他委托将自动进入开盘后的连续竟价。 在以上过程中,通过一次次配对,成交的价格范围逐渐缩小,而成交的数量逐渐增大,直到最后确定一个具体的成交价格,并使成交量达到最大。在最后一笔配对中,如果买入价和卖出价不相等,其成交价就取两者的平均。
在这次的集合竟价中,三笔委托共成交了12手,成交价格为3.65元,按照规定,所有参与这次集合竞价并成交的,其成交价都定为3.65元,交易所发布的股票G的开盘价就为3.65元,成交量12手。
当股票的申买价低而申卖价高而导致没有股票成交时,上交所就将其开盘价空缺,将连续竟价后产生的第一笔价格作为开盘价。而深交所对此却另有规定: 若最高申买价高于前一交易日的收盘价,就选取该价格为开盘价;若最低申卖价低于前一交易日的收盘价,就选取该价格为开盘价;若最低申买价不高于前一交易日的收盘价、最高申卖价不低于前一交易日的收盘价,则选取前一交易日的收盘价为今日的开盘价。
2.连续竞价
首先,而且连续竞价不可能有order之间的价格交叉,一旦形成交叉必然就成交了,因为没有做市商制度,如果没有对手盘,理论上是一直都不会有成交的,价格也会一直不变。
然后就形成了上面这幅图,首先卖买的五档明细是进入等待席进行公示的价格,并不是说只有这五档order,比如新浪的level2行情就有十档明细。
交易次序的规则:
- 1.价格优先— — 较高价格买进申报优先于较低价格买进申报, 较低价格卖出申报优先于较高价格卖出申报;
- 2.时间优先— — 买卖方向、价格相同的, 先申报者优先於后申报者。
成交价格的规则为:
- 1.最高买入申报与最低卖出申报价位相同,以该价格为成交价,并形成实时价格,该行情为中性盘。
- 2.买入申报价格高于即时揭示的最低卖出申报价格时,以即时揭示的最低卖出申报价格为成交价(即卖一价格),该行情为外盘。
- 3.卖出申报价格低于即时揭示的最高买入申报价格时,以即时揭示的最高买入申报价格为成交价(即买一价格),该行情为内盘。
还是那幅图。比如我要不进入等待席直接买入1000手,如果我报价4.30,那么此时将会以4.30成交587手,并且形成4.30的即时价格,剩下的413手则会成为买一进入等待席,原来的买一就成了买二,卖二成了卖一。但如果我报价4.31,那么先以4.30成交587手,然后再以4.31成交413手,形成4.31的即时价格,买五档都没变,卖一变成了4.31 97的状态。
委比和委差:
- 委差 = 委买手数-委卖手数
- 委比=(委买手数-委卖手数)/(委买手数+委卖手数)×100%。
这里计算的order都只算五档,我自己算了一下确实是这样。
3.行情数据
因为最近要给公司选数据供应商,所以粗略地研究了一下现在的行情数据。
一:什么是快照数据与交易所数据的一些细节
打一个比喻,交易数据可以想象为河流,快照就是这个河流在某个横截面的数据。对于国外的高频tick数据,有完整的order数据的过程,因此你可以利用这些order数据来复原快照数据。
国内的两大股票和四大期货理论上讲都是快照数据。比如说典型的数据字段包括
开盘价 最高价 最低价 最新价 成交量 成交额
这里的最高(低)价就从开盘到现在成交发生过的最高(低)价,假设你有详细的每笔成交的明细,其实这个数据是可以用max(min)推算的,所以国外的tick数据里面一般是没有这个字段的。
同样的成交量和成交额代表的意思不是这个时刻的成交量和成交额而是这个时刻开盘到现在的累计成交额和成交量。
从理论上讲:T时刻的累计成交量减去T-1时刻的累计成交量就是T时刻的成交量,但是这里的"成交量"其实是T-1到T时刻的汇总成交量,其实是有很多笔组成的。
期货的level2相比level1只是频率和报价深度上有些许区别。更有意义的是股票level2数据
从表结构来看股票level2主要有三块内容:快照、逐笔成交和挂单
快照类似前述的level1的快照 不过是把5档换成了10档另外还有一些比如所有挂单和数量等字段,深交所和上交所有略微差异。
逐笔成交就类似国外的tick数据,确实是发生过的真正的每笔成交情况,时间戳精细到10ms。但是问题在于这个数据也是3s一次发出来,发给你0-3s这期间的tick数据而不是实时发送给你,因此这里并不能把他定义为真正的tick数据。
Level2里面的挂单只有买卖一档的Top50并不是全部挂单,另外理论上数据是纪录这些挂单的增删(挂单没有改一说),但是从实际数据来看,交易所的数据并不是增量增量增量这种方式发送,而是夹杂着全量挂单和增量数据的方式,所以也不是完整的挂单动作。可以用这系列推算挂单情况但是挂单变化情况只是有时能推算出来。
二:什么是好的数据
既然都是交易所发送出来的,为什么会有数据的差异?
交易所比喻成一个电视台,他不断的给客户发送信号。绝大多数客户只装了电视机,收看电视。而数据提供商装的是录像机需要录数据,然后把录像带卖给客户。
典型的有几类原因导致数据的差异:
1. 数据记录方式
比如拿股票的Level1的数据为例,交易所发布一个dbf文件,记录着所有证券最新的状态数据,dbf文件是不断的自动刷新的。那么数据提供商或者记录数据的人需要做的时候就是每隔一段时间读取这个文件,然后把所有的数据放入数据库,但是因为交易所更新数据的频率不是一个唯一值,所以为了不错过数据,最好的办法就是你读取的频率高于他更新的频率。这样问题就来了,因为你读取很多如果每次都记录下来一来数据很大,二来很多重复数据。所以大家往往使用的办法就是当这条数据有变化的时候我才放入数据库。
因为有这样一条规则,所以你看到的一些非活跃成交的证券数据量会少于活跃成交的证券,远期的期货数据少于近期的,时间戳不同步等等,你以为是数据问题,其实不然。
2. 运维问题
这个是真正的数据提供商或者记录数据的问题,比如某些原因如断网或者程序错误等造成了一大段的数据丢失。按照前面所述的数据机制,其实对于Level1数据T和T+1时刻是没有任何逻辑关联的,假设缺失了你不可能从数据本身发现,因此大量的缺失其实都是这些原因造成的,而且无法弥补!就好比早期的电视录像带很不清晰,但是过去已经过去你已经无法补救。
3. 程序导致的数据错误
我遇到过一些比较异常的错误,比如说某些类型股票的价格出现异常,空等等,绝大部分是因为录数据的程序的错误造成的,为什么会出现?反正理由也很多,你记住会出现就可以了。少部分是因为交易所的问题,比如说交易所曾经把Level2数据的开盘价发错了。
因此原则上不能信任任何数据,一定要做数据方面的规则检验,包括对股票个数、间隔时间、数据是否在正常范围进行检验和清洗。