关键词:实时行情接口、WebSocket行情、数据看板、Python金融数据、可视化图表、金融科技、实时行情API、市场数据订阅
背景:为什么「实时行情接口」已成金融科技标配?
过去,金融仪表盘只能展示 15 分钟延迟行情,用户总是慢半拍。现在,任何一家希望提升用户粘性的 fintech 团队,都在升级「实时行情API」。
通过 WebSocket 秒级推送,股票、外汇、加密货币和贵金属价格可以毫秒级呈现在数据看板中,帮助交易员、分析师以及普通投资者实现“所见即所得”的决策环境。
本文用 100% 可落地的 Python 代码,带你学完:
- 建立 WebSocket 连接
- 订阅指定行情
- 动态解析行情 JSON
- Matplotlib 实时可视化
- 线上部署注意事项
技术前置:准备环境
项目 | 说明 |
---|---|
Python 版本 | ≥ 3.8 |
主要库 | websocket-client , matplotlib , pandas |
网络要求 | 稳定 HTTPS/WSS 出网环境 |
API 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 代码细节拆解(小白也看得懂)
cmd_id = 22002
:表示订阅深度行情;如要 tick 级逐笔数据可改为22001
。symbol_list
支持同时订阅多个市场代码,股票后缀区分沪深(.SS
、.SZ
)、港股(.HK
)、美股(.US
)。- 若网络异常,可在
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
,每个窗口动态更新对应符号,适合横向对比。
线上部署锦囊
- 心跳维持:每 30 秒发一次
{"cmd_id":22000}
,否则服务端 60 秒无心跳将强制断链。 - 断线重连:在生产环境可使用
tenacity
库自动指数退避。 - 数据延迟监控:开线程对比本地时间戳与行情上游时间戳,确保无明显 LAG。
- 行情过滤:对采购逻辑不需要的字段使用稀疏采样,降低 CPU 与带宽压力。
- 安全策略:Token 必须读取自环境变量或密钥管理器,禁止硬编码到仓库。
场景扩展:从「数据看板」到「事件驱动策略」
- Level-2 深度+订单流:结合深度 5 档行情,实时计算委托失衡 IOI,再触发下单。
- 跨市场套利:同时订阅比特币现货与永续合约价差,超过阈值即报警。
- 风控看板:在源码层增加风险指标预警,当某股票一分钟跌幅 >2% 自动闪红灯。
常见问题 FAQ
Q1:免费额度与付费方案差距有多大?
免费版一般限制并发 1 路 WebSocket,每分钟 100 条推送;付费可按并发数与频道数拆分套餐,根据 MAU 调整。
Q2:Python 图表是否卡?
Matplotlib 适合轻量级演示,处理上千 tick/s 可用 Dash+Plotly
或 Streamlit
框架做集群可视化。
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 分钟”的时代彻底终结。