行情數據用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,兩種方式都可以試用。