第三章:美股市场微观结构——订单簿、数据层级与交易时间
做高频交易,说白了就是跟市场微观结构打交道。你如果不懂订单簿怎么运作,不知道Tick数据和分钟数据差在哪,那策略写得再漂亮也是空中楼阁。这一章,我带你把这些基础打扎实。
3.1 订单簿(Order Book)原理
订单簿是什么?就是交易所用来记录所有未成交买单和卖单的电子账本。你可以把它想象成一个实时更新的拍卖场——买家喊价,卖家要价,成交了就撤单。
我个人习惯把订单簿分成两个核心部分:
- 买盘(Bid Side):按价格从高到低排列,最高价叫“最佳买价”(Best Bid)。
- 卖盘(Ask Side):按价格从低到高排列,最低价叫“最佳卖价”(Best Ask)。
最佳买价和最佳卖价之间的差距,就是价差(Spread)。价差越小,流动性越好。我在做纳指ETF回测时发现,开盘后前30分钟的价差经常是收盘前的3倍以上——嗯,这时候做高频策略要格外小心。
这个中间价常被用作“公平价格”的参考,但注意——它不代表真实成交价。
订单簿的深度(Depth)也很关键。深度指的是每个价位上的挂单数量。举个例子:
卖盘(Ask):
价格 100.05 数量 200
价格 100.04 数量 150
价格 100.03 数量 100
---
买盘(Bid):
价格 100.02 数量 80
价格 100.01 数量 120
价格 100.00 数量 300
你看,100.02这个价位只有80股买单。如果你要卖出1000股,很可能把价格砸到100.00甚至更低。这就是为什么大单交易要考虑“市场冲击成本”。
3.2 Tick数据与分钟数据的区别
这个问题,我几乎每次培训都会被问到。说白了,它们就是两种不同粒度的数据。
| 特性 | Tick数据 | 分钟数据 |
|---|---|---|
| 记录方式 | 每笔交易或每次报价变动 | 每分钟聚合(开、高、低、收、量) |
| 数据量 | 一天几百万条(高频股) | 一天390条(美股常规交易) |
| 信息含量 | 包含订单流、买卖方向 | 丢失了微观结构信息 |
| 存储成本 | 高(1只股票1年约10GB) | 低(1只股票1年约100MB) |
你想想看,分钟数据把1分钟内的所有交易压缩成了4个数字。这中间丢失了什么?举个例子:
- 这一分钟里,价格是先涨后跌,还是先跌后涨?——分钟数据看不出来。
- 大单是在开盘时砸的,还是收盘前拉的?——分钟数据也看不出来。
- 买卖订单的到达顺序是怎样的?——分钟数据更不可能告诉你。
我做过一个实验:同一个均值回归策略,用Tick数据回测年化收益18%,用分钟数据回测只有11%。为什么?因为分钟数据把很多微小的套利机会给“平均”掉了。
3.3 Level 1 / Level 2 数据
这两个术语,新手容易搞混。我简单解释一下:
Level 1 数据:只显示最佳买价和最佳卖价,以及当前最后一笔成交价。这是最基础的数据,大部分散户用的就是这个。
Level 2 数据:显示订单簿的多档深度。比如前10档的买盘和卖盘,甚至能看到每个价位的挂单量。做高频交易,Level 2是标配。
我记得刚入行时,公司为了省钱只买了Level 1数据。结果我们做的订单流策略(Order Flow Imbalance)完全跑不起来——因为Level 1根本看不到订单簿的变化过程。后来咬牙上了Level 2,策略才真正开始赚钱。
Level 2数据里有个很重要的指标叫订单簿不平衡(Order Book Imbalance):
Imbalance = (Bid Volume - Ask Volume) / (Bid Volume + Ask Volume)
正值表示买盘强,负值表示卖盘强。
取值范围:-1 到 +1
这个指标在预测短期价格方向时非常有用。我习惯用前5档的挂单量来计算,效果比只用最佳价位好很多。
3.4 交易时间与节假日处理
美股的交易时间,比A股复杂得多。你得搞清楚这几个时间段:
- 盘前交易(Pre-market):美东时间 4:00 - 9:30
- 常规交易(Regular):美东时间 9:30 - 16:00
- 盘后交易(After-hours):美东时间 16:00 - 20:00
注意,盘前和盘后的流动性很差,价差可能大到离谱。我见过有些股票盘前价差是常规交易时的10倍。所以我的策略默认只跑常规交易时段。
节假日处理更是坑多。美股不像A股那样固定休市,它有个专门的节假日日历。比如:
| 节日 | 休市情况 |
|---|---|
| 元旦 | 1月1日全天休市 |
| 马丁·路德·金纪念日 | 1月第三个周一全天休市 |
| 感恩节 | 11月第四个周四全天休市,周五提前收盘 |
| 圣诞节 | 12月25日全天休市 |
我曾经犯过一个低级错误:直接用Python的pandas_market_calendars库获取交易日历,结果没注意到感恩节后的周五是提前收盘(13:00就关了)。我的策略在14:00还在发单,全部被拒。从那以后,我每次回测前都会手动核对一遍节假日日历。
import pandas_market_calendars as mcal
# 获取纽交所日历
nyse = mcal.get_calendar('NYSE')
schedule = nyse.schedule(start_date='2024-01-01', end_date='2024-12-31')
# 检查某一天是否开市
print(nyse.valid_days(start_date='2024-11-28', end_date='2024-11-28'))
还有一个细节:夏令时和冬令时。美股交易时间在夏令时(3月第二个周日到11月第一个周日)是北京时间21:30开盘,冬令时则推迟到22:30。这个转换日期每年都变,千万别写死。
知识体系总览
下面这张图,我把本章的核心知识点串起来了。你可以把它当作一个快速索引:
订单簿、数据层级、交易时间——这三块是高频交易策略的基石。你只有把它们吃透了,才能在回测中避免那些“看起来很美、实盘就崩”的尴尬局面。