行情数据用WebSocket还是REST API?一文讲清两者区别与选型

行情数据用WebSocket还是REST API?一文讲清两者区别与选型
对接行情数据服务时,通常有两种选择:REST API 和 WebSocket API。两者提供的价格相同,但工作方式截然不同——选择会影响延迟、成本、调用限额以及你需要写多少代码。
REST 如何工作
REST 是请求-响应模式。应用发送 HTTP 请求("给我 AAPL 最新报价"),服务器响应一次,连接即结束。
客户端 --GET /stock/quote?code=AAPL--> 服务器
客户端 <------------ JSON ------------ 服务器
要看到新价格就必须再次请求(轮询)——每秒、每分钟或按需。
WebSocket 如何工作
WebSocket 是持久的双向连接。只需连接一次并订阅标的,服务器会在行情变化时主动推送每一次更新。
客户端 ==== 连接 + 订阅(AAPL, TSLA) ====> 服务器
客户端 <=== quote === <=== tick === <=== depth === 服务器(持续推送)
WebSocket 与 REST 对比
| REST API | WebSocket API | |
|---|---|---|
| 模式 | 拉取(请求-响应) | 推送(流式) |
| 连接 | 每次新建请求 | 一个长连接 |
| 延迟 | 轮询间隔 + 往返时间 | 事件发生后毫秒级 |
| 实时数据效率 | 浪费——重复请求头,常返回未变化数据 | 高效——只推送变化 |
| 调用限额 | 每次调用都计数 | 按订阅计,而非调用 |
| 复杂度 | 非常简单 | 需处理重连、心跳与状态 |
| 适合 | 快照、历史数据、参考数据 | 实时价格、逐笔、盘口 |
什么时候用 REST
- 历史数据: 为回测下载 OHLCV K线(历史行情数据API)。
- 快照: 页面加载时展示一次价格。
- 参考数据: 股票代码列表、交易所信息等。
- 低频任务: 日终报表、定时脚本。
- 无服务器环境: 无法保持长连接的场景。
什么时候用 WebSocket
- 实时行情与自选列表需要即时刷新。
- 交易机器人需要响应每一笔成交或报价。
- 盘口(Level 2)展示每秒变化多次,参见 Level 1、Level 2 与 Level 3 行情的区别。
- 同时关注大量标的,逐个轮询会耗尽调用额度。
生产环境常用的混合模式
- 启动时用 REST 加载历史数据(如最近 500 根K线)与初始快照。
- 之后通过 WebSocket 订阅并应用实时更新。
- 重连后再用 REST 补齐断线期间的数据缺口。
Python 示例
import json
import requests
import websocket # pip install websocket-client
TOKEN = "YOUR_API_TOKEN"
H = {"accept": "application/json", "token": TOKEN}
# 1) REST 快照
snap = requests.get("https://api.itick.org/forex/quote",
params={"region": "GB", "code": "EURUSD"}, headers=H, timeout=10).json()
print("快照:", snap)
# 2) WebSocket 实时推送
def on_open(ws):
ws.send(json.dumps({"ac": "subscribe", "params": "EURUSD$GB,XAUUSD$GB", "types": "quote,tick"}))
def on_message(ws, message):
print("更新:", json.loads(message))
def on_close(ws, *args):
print("连接断开 - 重连后用 REST 补齐缺口")
ws = websocket.WebSocketApp("wss://api.itick.org/forex", header={"token": TOKEN},
on_open=on_open, on_message=on_message, on_close=on_close)
ws.run_forever(ping_interval=20, reconnect=5)
行情 WebSocket 最佳实践
- 发送心跳(
ping_interval),避免代理断开空闲连接。 - 指数退避重连,每次重连后重新订阅。
- 快速处理消息——把耗时逻辑放入队列,避免阻塞连接。
- 记录每个标的最后时间戳,用于发现和补齐缺口。
- 只订阅需要的标的,节省带宽和套餐额度。
常见问题
WebSocket 比 REST 快吗? 对实时数据来说是的,更新一发生就会送达,无需等待下一次轮询。
只用 REST 能做实时行情吗? 可以轮询,但会增加延迟、更快触达调用限额,并传输更多冗余数据。
用了 WebSocket 还需要 REST 吗? 需要——用于历史数据、快照和断线补数。
一个服务商同时提供两种接口
iTick 提供 REST 与 WebSocket 接口,股票、外汇、加密货币、指数、期货和基金使用相同的代码与 JSON 结构。免费获取 API Key,两种方式都可以试用。