第一章:数据源与接入——主流美股Level2数据提供商对比
做美股量化交易,第一道坎就是数据。我见过太多人,策略写得漂漂亮亮,结果一上实盘就崩——为什么?数据源没选对。
Level2行情,说白了就是能看到订单簿的深度数据。普通散户看到的只有买一卖一,而Level2能让你看到整个委托队列。嗯,这里面的门道可不少。
1.1 主流数据提供商概览
目前市面上主流的Level2数据提供商,我按自己的使用经验排个序:
| 提供商 | 覆盖交易所 | 数据深度 | 延迟 | 月费(约) |
|---|---|---|---|---|
| Nasdaq TotalView | Nasdaq全市场 | 全深度(50档+) | <1ms | $150-300 |
| NYSE OpenBook | NYSE全市场 | 全深度(50档+) | <2ms | $200-400 |
| IEX | IEX交易所 | 全深度(免费) | <5ms | 免费 |
| Polygon.io | 多交易所聚合 | 10-20档 | 10-50ms | $99-199 |
| Alpaca | 多交易所聚合 | 5-10档 | 50-100ms | 免费-50 |
我个人习惯,做高频策略首选Nasdaq TotalView。为什么?因为Nasdaq的订单流最活跃,流动性最好。我在项目中遇到过用NYSE OpenBook做统计套利,结果发现NYSE的暗池订单太多,公开数据反而失真。
1.2 三大核心提供商深度解析
Nasdaq TotalView
这是目前最贵的,但也是最全的。它提供Nasdaq交易所所有股票的完整订单簿,包括隐藏订单和冰山订单。你想想看,做市商的大单往往藏在里面,普通数据根本看不到。
核心特点:
- 全深度数据:50档买卖盘口
- 包含隐藏订单信息
- 支持实时和盘后数据
- API延迟控制在1ms以内
NYSE OpenBook
NYSE的数据有个特点——它包含了很多机构订单。我记得有一次做订单流分析,发现NYSE的买卖价差经常比Nasdaq大,后来一查,原来是NYSE的做市商制度导致的。
注意:NYSE OpenBook不包含暗池数据。如果你做的是暗池策略,这个数据源就不太够用了。
IEX
IEX是个特例。它免费提供全深度数据,但只覆盖IEX自己的交易所。IEX的市占率大概只有2-3%,所以数据量不大。不过,对于学习Level2数据结构和做策略回测来说,IEX是个绝佳的起点。
我的建议:新手先用IEX免费数据练手,等策略成熟了再上TotalView。别一上来就花大钱买数据,容易亏。
1.3 API接入方式与认证
接入Level2数据,说白了就是两件事:拿到API Key,然后建立WebSocket连接。我见过有人用REST API轮询拿Level2数据,那延迟简直没法看。
WebSocket接入(推荐)
实时数据必须用WebSocket。下面是我常用的接入模板:
import websocket
import json
# 以Polygon.io为例
API_KEY = "your_api_key_here"
def on_message(ws, message):
data = json.loads(message)
# 处理Level2数据
print(f"收到订单簿更新: {data}")
def on_error(ws, error):
print(f"连接错误: {error}")
def on_close(ws, close_status_code, close_msg):
print("连接关闭")
def on_open(ws):
# 订阅AAPL的Level2数据
subscribe_msg = {
"action": "subscribe",
"params": "AM.AAPL" # AM = Aggregated Minute
}
ws.send(json.dumps(subscribe_msg))
websocket.enableTrace(True)
ws = websocket.WebSocketApp(
f"wss://socket.polygon.io/stocks",
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close
)
ws.run_forever()
认证方式
不同提供商的认证方式大同小异:
- API Key认证:最常用,放在请求头或URL参数里
- OAuth 2.0:部分机构要求,比如某些券商的数据接口
- IP白名单:Nasdaq TotalView要求绑定服务器IP
避坑指南:我曾经把API Key直接写在代码里,结果不小心上传到了GitHub。第二天就收到账单——有人用我的Key跑了大量数据。记住:API Key一定要用环境变量管理!
1.4 数据格式与解析
Level2数据最常见的格式是JSON和Protobuf。JSON可读性好,但解析慢;Protobuf快,但调试麻烦。
下面是一个典型的Level2数据快照:
{
"symbol": "AAPL",
"bids": [
{"price": 150.25, "size": 1000, "exchange": "NASDAQ"},
{"price": 150.24, "size": 500, "exchange": "NYSE"},
{"price": 150.23, "size": 2000, "exchange": "IEX"}
],
"asks": [
{"price": 150.26, "size": 800, "exchange": "NASDAQ"},
{"price": 150.27, "size": 1500, "exchange": "NYSE"}
],
"timestamp": 1700000000000
}
嗯,这里要注意:不同交易所的订单簿更新频率不一样。Nasdaq每秒能发几百次更新,而IEX可能只有几十次。做策略时一定要考虑这个差异。
1.5 知识体系总览
我把本章的核心逻辑画成了流程图,方便你理解数据接入的全貌:
1.6 实战建议
最后,我总结几条实战经验:
- 别贪多:一开始只接一个交易所的数据,把逻辑跑通了再说
- 做好重连机制:WebSocket断连是家常便饭,一定要有自动重连
- 数据校验:我吃过亏——接了数据没校验,结果策略跑了一周才发现数据有缺失
- 成本控制:TotalView一个月300美金,一年就是3600。小团队建议先用IEX或Polygon
小技巧:如果你只是想研究Level2数据结构,可以用IEX的免费数据写个本地模拟器。我当年就是这么入门的,省了不少钱。
好了,数据源和接入这块就聊到这儿。记住一句话:数据质量决定策略上限。别在数据上省钱,也别在数据上浪费钱。