我刚开始自己写港股通实时行情监控的时候,思路特别直接——循环请求HTTP接口,拿到一只再请求下一只。500多只股票跑完一轮大概需要一分半钟,API供应商的限流警告更是家常便饭。这对于想捕捉开盘异动或者尾盘放量的个人高频交易者来说,几乎等于用过期数据做决策。
直到我换成WebSocket方案,整个数据体验才真正“顺”了起来。今天这篇手记,就从一个个人交易者的真实视角,带你用Python搭建一套全自动的港股通tick抓取管线。
REST轮询的坑与WebSocket的解法
REST轮询有两个致命伤:一是延迟高,时间花在反复建连和等待响应上;二是容易触发频率限制,一旦被暂时封禁,数据就会出现断档。WebSocket则是一次握手、持久通信,客户端订阅后,服务端主动推送每笔成交,几乎是行情发生的同一时刻,你的程序就能收到。以我使用的 ALLTICK API行情API为例,它的WebSocket接口支持一次性订阅多只港股通标的,代码接入非常丝滑。
批量抓取的全流程设计
我把整个项目划分为四个环节:
- 生成标的池:拉取最新的港股通成分股列表,代码统一处理成带
.HK后缀的格式。 - 分批订阅与保活:因为单次订阅数量有限制,我把500多只股票拆成每批50只,顺序发送订阅消息,同时加入心跳机制保持连接活跃。
- 解析与缓存:on_message回调里解析JSON,把symbol、price、volume、timestamp等字段标准化,先扔进线程安全的队列,再由消费者线程批量写入数据库。
- 异常自愈:断线自动重连,并重新发送订阅帧,同时记录可能缺失的行情缺口以便补全。
| 步骤 | 核心内容 | 避坑指南 |
|---|---|---|
| 标的池 | 动态获取港股通成分股 | 记得加.HK后缀并过滤停牌股 |
| 建立WS连接 | 分批订阅多只股票tick | 遵守API的单次订阅上限 |
| 解析存储 | JSON转结构化数据 | 字段可能增减,用get方式提取 |
| 异常处理 | 心跳、重连、补数据 | 做好断线期间数据的补偿逻辑 |
动手写代码
import websocket
import json
def on_message(ws, message):
# 将推送的JSON数据解析为tick
data = json.loads(message)
for tick in data.get("ticks", []):
# 这里打印演示,生产环境建议写入队列或数据库
print(f"{tick['symbol']} 最新价: {tick['price']} 成交量: {tick['volume']}")
def on_open(ws):
# 订阅目标标的,一次可以传入多只
tickers = ["00700.HK", "09988.HK", "02628.HK"]
ws.send(json.dumps({"action": "subscribe", "symbols": tickers}))
ws = websocket.WebSocketApp("wss://api.alltick.co/stock/ws",
on_message=on_message,
on_open=on_open)
ws.run_forever()
上线后的变化与扩展
模块化上线后,断线对我的影响降到了最低——重连模块自动恢复,我只需要在日志里看一眼确认即可。更关键的是,盘中我终于不必再焦虑“数据到没到”,反而多出大量时间优化策略逻辑。现在这套数据不仅驱动着我的日内监控面板,还能实时计算涨速、振幅等衍生指标。一旦你把行情管道搭建稳固,后续的高频分析、可视化仪表盘、量化信号都会变得像搭积木一样自然。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
