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