告别高延迟高消耗:A 股分钟级行情订阅终极方案
做 A 股行情分析或基金研究相关开发的朋友,大概率都踩过实时数据获取的坑:用 HTTP 接口轮询抓行情,要么延迟高错过关键点位,要么高频请求把服务器 CPU 跑满,就算把轮询频率拉到极致,也做不到真正的 “实时”—— 尤其是做基金标的动态监控时,这个问题简直是致命的。
今天就跟大家分享一下我在实际开发中,从踩坑轮询模式到用 WebSocket 实现分钟级行情订阅的完整过程,代码可直接复用,适配基金研究、行情看板等常见场景。
一、先说说轮询模式的那些坑
刚开始做行情获取时,我也是用最基础的 HTTP 轮询,结果踩了一堆坑,总结下来主要有 3 点:
- 延迟 + 资源双高:轮询间隔设 1 秒,数据延迟至少 1 秒,还会让本地 CPU 占用率飙升;间隔设短了,又容易触发接口限流,直接被封 IP;
- 多线程开发麻烦:要抓多支股票的数据,就得写多线程请求逻辑,线程管理稍不注意就卡顿,开发和维护成本都高;
- 恶性循环难破解:频率低→延迟高,频率高→限流 / 资源浪费,完全满足不了基金研究对数据实时性、稳定性的要求。
二、解决方案:WebSocket 长连接订阅
踩够坑后,我转向了 WebSocket 长连接的订阅模式 —— 让服务端主动推数据,而不是客户端反复问,这也是现在行业内获取实时行情的主流方案。整个流程特别清晰,就 3 步,新手也能看懂:
- 建长连接:和行情服务器建立 WebSocket 持久连接,代替 HTTP 的 “问一次答一次”,保证数据传输不中断;
- 发订阅请求:告诉服务器要盯哪些股票(比如 000001.SH)、要什么粒度的数据(分钟级);
- 处理推送数据:服务器推来行情后,按需处理 —— 打印校验、存数据库、推到前端看板都可以。
三、可直接运行的 Python 代码
话不多说,上核心代码(Python 3.6 + 可直接跑),我已经在基金标的监控项目中验证过,复制就能用:
import json
import websocket
WS_URL = "wss://api.alltick.co/realtime"
# 想关注的 A 股股票
symbols = ["000001.SH", "600519.SH"]
def on_open(ws):
print("连接建立成功,准备订阅分钟级行情")
msg = {
"action": "subscribe",
"symbols": symbols,
"interval": "1m"
}
ws.send(json.dumps(msg))
def on_message(ws, message):
data = json.loads(message)
print("收到行情:", data)
def on_error(ws, error):
print("连接出错:", error)
def on_close(ws):
print("连接关闭")
if __name__ == "__main__":
ws = websocket.WebSocketApp(
WS_URL,
on_open=on_open, on_message=on_message,
on_error=on_error, on_close=on_close
)
ws.run_forever()
新手必看:运行前准备
- 先装依赖:pip install websocket-client;
- 确保网络能访问wss://api.alltick.co/realtime;
- 改symbols里的股票代码,就能盯自己关注的标的。
四、订阅模式对比轮询的核心优势
用过之后才发现,订阅模式比轮询香太多了,总结 3 个核心优势:
- 延迟极低:行情数据生成后服务器立刻推送,延迟毫秒级,再也不会错过关键价格;
- 资源省太多:不用本地高频发请求,CPU 占用率从轮询的 70%+ 降到 10% 以内;
- 开发维护简单:一条连接就能盯几十支股票,不用写复杂的多线程、定时器逻辑,省心。
五、实战经验:让订阅更稳定的 3 个小技巧
跑通代码只是第一步,要用到生产环境,还得注意这 3 点(都是踩坑总结的):
加心跳 + 自动重连:网络波动或服务器断连是常事,一定要写心跳检测,断连后自动重连,避免行情中断;
批量订阅更稳:把要盯的股票整合到一个订阅请求里,别给每支股票建一个连接,既稳定又省资源;
数据落地要做好:分钟级数据攒得快,长期存建议用时序数据库(比如 TimeScaleDB),后续回测、分析都方便。
六、数据源选择小建议
最后提一下数据源,市场上接口五花八门,做基金研究的话,优先选这 3 类:
- 延迟低(≤200ms);
- 标的覆盖全(沪深 A 股、ETF 都要有);
- 接口稳定(别动不动就崩)。
我自己用的 AllTick 接口就挺合适,接入简单,订阅逻辑和业务逻辑分开,不会干扰主程序,新手也能快速上手。
最后总结
其实从轮询换成 WebSocket 订阅,核心就是把 “被动问数据” 改成 “主动收数据”,不仅解决了延迟和资源的问题,还能让行情分析、策略监控的开发效率提升一大截。
这套方案我已经在多个基金研究相关项目中落地,实测稳定可靠,希望能帮到同样做 A 股行情开发的朋友,少踩点坑~
浙公网安备 33010602011771号