从零搭建:数据看板实时行情接口全流程示范

Posted by YCT612 加密视角 on September 5, 2025

关键词:实时行情接口、WebSocket行情、数据看板、Python金融数据、可视化图表、金融科技、实时行情API、市场数据订阅


背景:为什么「实时行情接口」已成金融科技标配?

过去,金融仪表盘只能展示 15 分钟延迟行情,用户总是慢半拍。现在,任何一家希望提升用户粘性的 fintech 团队,都在升级「实时行情API」
通过 WebSocket 秒级推送,股票、外汇、加密货币和贵金属价格可以毫秒级呈现在数据看板中,帮助交易员、分析师以及普通投资者实现“所见即所得”的决策环境。

本文用 100% 可落地的 Python 代码,带你学完:

  1. 建立 WebSocket 连接
  2. 订阅指定行情
  3. 动态解析行情 JSON
  4. Matplotlib 实时可视化
  5. 线上部署注意事项

技术前置:准备环境

项目 说明
Python 版本 ≥ 3.8
主要库 websocket-client, matplotlib, pandas
网络要求 稳定 HTTPS/WSS 出网环境
API Token 需在提供商平台申请,替换代码里的 您的token

👉 立即查看如何白嫖完整 Token 与示例仓库


第一步:创建 WebSocket 连接并订阅行情

1.1 核心代码(可直接复制运行)

import json, websocket  # pip install websocket-client

class RealtimeFeed:
    def __init__(self, token: str):
        self.url = f"wss://quote.tradeswitcher.com/quote-stock-b-ws-api?token={token}"
        self.ws = None

    def on_open(self, ws):
        subscribe = {
            "cmd_id": 22002,
            "seq_id": 123,
            "trace": "3baaa938-uuid-timestamp",
            "data": {
                "symbol_list": [
                    {"code": "700.HK",   "depth_level": 5},
                    {"code": "UNH.US",   "depth_level": 5}
                ]
            }
        }
        ws.send(json.dumps(subscribe))
        print(">>> 已发送订阅请求")

    def on_message(self, ws, message):
        tick = json.loads(message)
        print(">>> 收到实时数据:", tick)
        # 此处可回传 DataBoard 进行绘图
        self.push_to_dashboard(tick)

    def on_error(self, ws, error):
        print(">>> 连接错误:", error)

    def on_close(self, ws, code, msg):
        print(">>> 连接关闭:", code, msg)

    def run(self):
        self.ws = websocket.WebSocketApp(
            self.url,
            on_open=self.on_open,
            on_message=self.on_message,
            on_error=self.on_error,
            on_close=self.on_close
        )
        self.ws.run_forever()

    @staticmethod
    def push_to_dashboard(tick):
        # 仅打印,稍后接入可视化
        pass

if __name__ == "__main__":
    RealtimeFeed(token="你的TOKEN").run()

1.2 代码细节拆解(小白也看得懂)

  1. cmd_id = 22002:表示订阅深度行情;如要 tick 级逐笔数据可改为 22001
  2. symbol_list 支持同时订阅多个市场代码,股票后缀区分沪深(.SS.SZ)、港股(.HK)、美股(.US)。
  3. 若网络异常,可在 on_error 里增加重连逻辑,如 ws.run_forever(reconnect=5)

第二步:把实时行情解析成“人话”

收到服务器的 JSON 原始格式示例:

{
  "trace": "3baaa938-uuid",
  "data": {
    "700.HK": {
      "snapshot": {
        "last": 251.80,
        "volume": 8152962,
        "depth": { "ask": [...], "bid": [...] }
      }
    }
  }
}

替换 push_to_dashboard 函数,暴露最新成交价与成交量,供下一步使用:

class RealtimeFeed:
    ...
    @staticmethod
    def push_to_dashboard(tick):
        symbol = next(iter(tick["data"]))
        snap   = tick["data"][symbol]["snapshot"]
        price  = snap["last"]
        volume = snap["volume"]
        Board.update(symbol, price, volume)

第三步:Matplotlib 实时刷新的极简仪表盘

3.1 单图动态更新版本

import matplotlib.pyplot as plt
from datetime import datetime
import threading

class DataBoard:
    lock = threading.Lock()
    cache = {}  # symbol -> (prices[], timestamps[])

    @classmethod
    def update(cls, symbol: str, price: float, _volume):
        with cls.lock:
            x_series, y_series = cls.cache.setdefault(symbol, ([], []))
            x_series.append(datetime.now())
            y_series.append(price)
            cls.drawing(symbol)

    @classmethod
    def drawing(cls, symbol):
        plt.clf()
        x, y = cls.cache[symbol]
        plt.plot(x[-100:], y[-100:], label=symbol)  # 仅画最近 100 点
        plt.pause(0.01)

plt.ion()

draw_show 放在主线程末尾:

if __name__ == "__main__":
    threading.Thread(target=RealtimeFeed(token="你的TOKEN").run, daemon=True).start()
    plt.show(block=True)

3.2 多产品分图示例(进阶)

若想一次监控多只股票,可替换为 plt.subplot,每个窗口动态更新对应符号,适合横向对比。

👉 点击获取完整可视化仓库+更多插件方案


线上部署锦囊

  1. 心跳维持:每 30 秒发一次 {"cmd_id":22000},否则服务端 60 秒无心跳将强制断链。
  2. 断线重连:在生产环境可使用 tenacity 库自动指数退避。
  3. 数据延迟监控:开线程对比本地时间戳与行情上游时间戳,确保无明显 LAG。
  4. 行情过滤:对采购逻辑不需要的字段使用稀疏采样,降低 CPU 与带宽压力。
  5. 安全策略:Token 必须读取自环境变量或密钥管理器,禁止硬编码到仓库。

场景扩展:从「数据看板」到「事件驱动策略」

  • Level-2 深度+订单流:结合深度 5 档行情,实时计算委托失衡 IOI,再触发下单。
  • 跨市场套利:同时订阅比特币现货与永续合约价差,超过阈值即报警。
  • 风控看板:在源码层增加风险指标预警,当某股票一分钟跌幅 >2% 自动闪红灯。

常见问题 FAQ

Q1:免费额度与付费方案差距有多大?
免费版一般限制并发 1 路 WebSocket,每分钟 100 条推送;付费可按并发数与频道数拆分套餐,根据 MAU 调整。

Q2:Python 图表是否卡?
Matplotlib 适合轻量级演示,处理上千 tick/s 可用 Dash+PlotlyStreamlit 框架做集群可视化。

Q3:为什么连接立刻被 close?
确认 token 是否激活目标频道,并核对远端域名是不是生产地址(部分沙箱 token 仅能连 sandbox.xxx.com)。

Q4:能否拿到历史 K 线回补?
WebSocket 仅实时推送,历史数据需通过 RESTful 接口 https://api.xxx.com/v1/klines 获取并进行拼接回放。

Q5:内地网络会不会微信封闭 WSS?
建议将行情服务器选在离用户骨干网最近的节点;企业用户可申请带宽保障或第三方 CDN 加速。

Q6:如何监听“交易所休市”噪声?
对接收到的消息类型号进行判断,休市时期服务端会主动下发 {"cmd_id":90001, "status":"market_close"},避免无意义绘制空图表。


一句话总结

只要 30 行代码 + 一个可用 Token,就能把“实时行情接口”无缝嵌入任何数据看板——把“行情延后 15 分钟”的时代彻底终结。