第二章:订单流数据基础
做订单流交易,说白了就是跟数据打交道。你得先搞清楚这些数据长什么样,才能谈得上用它赚钱。
我个人习惯把订单流数据分成四大块:逐笔成交、买卖盘口深度、Time & Sales、市场深度(DOM)。这四块数据,就像汽车的四个轮子,缺一个都跑不稳。
2.1 逐笔成交数据(Tick Data)
逐笔成交,也叫Tick数据。它记录的是每一笔真实的成交。
举个例子,你看到盘口上有人挂了100手买单,突然成交了50手。这50手是谁买的?价格是多少?时间精确到哪一秒?这些信息,就是逐笔成交数据告诉你的。
核心字段:
- 时间戳(精确到毫秒甚至微秒)
- 成交价格
- 成交量
- 成交标识(买盘主动成交还是卖盘主动成交)
我在项目中遇到过一个问题:有些交易所的Tick数据,时间戳只精确到秒。这就麻烦了。同一秒内成交了100笔,你根本分不清先后顺序。所以,我建议你尽量用毫秒级的数据源。
避坑指南:我曾经用过一个数据源,它的Tick数据里成交标识经常标错。明明是买方主动吃单,它标成卖方。后来我花了整整一周时间,写了个校验程序,才把数据洗干净。所以,拿到数据先做校验,别直接拿来用。
2.2 买卖盘口深度(Order Book Depth)
盘口深度,就是挂在上面还没成交的订单。它告诉你:在什么价格上,有多少人想买,有多少人想卖。
你想想看,如果买一价位挂了1000手,卖一价位只挂了10手。这说明什么?说明卖方力量很弱,价格大概率要往上走。这就是盘口深度的价值。
盘口深度通常分五档、十档,甚至全量。我个人习惯用全量数据,虽然数据量大,但信息更完整。
| 档位 | 买价 | 买量 | 卖价 | 卖量 |
|---|---|---|---|---|
| 1 | 100.00 | 500 | 100.05 | 200 |
| 2 | 99.95 | 800 | 100.10 | 600 |
| 3 | 99.90 | 1200 | 100.15 | 400 |
嗯,这里要注意:盘口数据是快照数据,不是流数据。它每隔几毫秒更新一次。如果你做高频交易,这个更新频率可能不够用。
2.3 时间与销售数据(Time & Sales)
Time & Sales,简称T&S。它跟Tick数据有点像,但侧重点不同。
T&S更关注的是「谁在推动价格」。它会把每一笔成交标记为「买盘推动」或「卖盘推动」。怎么判断的?很简单:如果成交价等于卖一价,那就是买方主动吃单;如果等于买一价,那就是卖方主动砸盘。
关键指标:
- Delta = 买盘成交量 - 卖盘成交量
- Cumulative Delta = 累计Delta值
- Volume Profile = 成交量分布
我记得有一次,一个学员问我:「老师,为什么价格没怎么动,但Cumulative Delta一直在涨?」我告诉他:「这说明有人在偷偷吸筹。价格不动,是因为他们在用冰山订单,把大单拆成小单吃。」这就是T&S数据的妙用。
注意:T&S数据里有个坑——「被动成交」和「主动成交」的区分。有些交易所会把Maker订单的成交也算进去,导致Delta失真。我建议你只用Taker成交的数据。
2.4 市场深度(DOM)
DOM,全称Depth of Market。它跟盘口深度有点像,但更全面。
DOM不仅显示当前的价格和挂单量,还会显示每个价位的「订单数量」。比如,买一价位有500手,但这500手是10个订单还是1个订单?DOM会告诉你。
为什么这个信息重要?因为订单数量能帮你判断「大资金」的意图。如果一个价位上只有1个订单挂了500手,那很可能是机构在挂单。如果500手分散在50个订单里,那多半是散户。
我个人习惯把DOM数据做成热力图。价格在左边,订单数量在右边,用颜色深浅表示挂单量大小。一眼就能看出哪里是「压力位」,哪里是「支撑位」。
2.5 四类数据的关系
这四类数据不是孤立的。它们互相印证,共同构成订单流分析的基础。
举个例子:
- Tick数据告诉你「成交了」
- 盘口深度告诉你「还有多少没成交」
- T&S告诉你「谁在推动」
- DOM告诉你「大资金在哪」
四者结合,你才能看清市场的全貌。
2.6 数据获取与处理
说了这么多,数据从哪来?
我常用的数据源有这几个:
- 交易所API(如Binance、Coinbase的WebSocket接口)
- 第三方数据商(如Bloomberg、Reuters)
- 自建爬虫(适合小众市场)
拿到数据后,第一件事不是分析,而是清洗。我写了个简单的Python脚本,用来校验数据完整性:
def validate_tick_data(df):
# 检查时间戳是否连续
time_gaps = df['timestamp'].diff().dt.total_seconds()
if (time_gaps > 1).any():
print('警告:存在超过1秒的时间间隔')
# 检查价格是否在合理范围
if (df['price'] <= 0).any():
print('错误:存在非正价格')
# 检查成交量是否异常
if (df['volume'] <= 0).any():
print('错误:存在非正成交量')
return True
嗯,这个脚本虽然简单,但能帮你省掉很多麻烦。我建议你把它加到数据管道的入口处。
个人经验:数据清洗这件事,花再多时间都不为过。我曾经因为一个字段类型错误,导致整个回测结果全错了。从那以后,我每条数据进来都要过三关:格式校验、逻辑校验、业务校验。
2.7 本章小结
订单流数据基础,说白了就是四个字:看清真相。Tick数据告诉你成交细节,盘口深度告诉你挂单结构,T&S告诉你买卖力量,DOM告诉你大资金动向。
把这四块数据吃透了,你就能看到别人看不到的东西。比如,为什么价格在某个位置反复震荡?为什么突然放量突破?这些问题的答案,都藏在订单流数据里。
下一章,我们会聊怎么把这些数据变成交易信号。但在此之前,我建议你先找个数据源,亲手拉一份数据看看。纸上得来终觉浅,绝知此事要躬行。