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

  1. iTick
  2. 市场数据
行情数据用WebSocket还是REST API?一文讲清两者区别与选型 - iTick
行情数据用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 APIWebSocket API
模式拉取(请求-响应)推送(流式)
连接每次新建请求一个长连接
延迟轮询间隔 + 往返时间事件发生后毫秒级
实时数据效率浪费——重复请求头,常返回未变化数据高效——只推送变化
调用限额每次调用都计数按订阅计,而非调用
复杂度非常简单需处理重连、心跳与状态
适合快照、历史数据、参考数据实时价格、逐笔、盘口

什么时候用 REST

  • 历史数据: 为回测下载 OHLCV K线(历史行情数据API)。
  • 快照: 页面加载时展示一次价格。
  • 参考数据: 股票代码列表、交易所信息等。
  • 低频任务: 日终报表、定时脚本。
  • 无服务器环境: 无法保持长连接的场景。

什么时候用 WebSocket

  • 实时行情与自选列表需要即时刷新。
  • 交易机器人需要响应每一笔成交或报价。
  • 盘口(Level 2)展示每秒变化多次,参见 Level 1、Level 2 与 Level 3 行情的区别。
  • 同时关注大量标的,逐个轮询会耗尽调用额度。

生产环境常用的混合模式

  1. 启动时用 REST 加载历史数据(如最近 500 根K线)与初始快照。
  2. 之后通过 WebSocket 订阅并应用实时更新。
  3. 重连后再用 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,两种方式都可以试用。