在开发行情展示面板、量化策略回测平台、实时交易监控系统时,分钟级行情是核心基础数据。相比直接调用第三方封装好的 K 线接口,通过实时行情接口自主聚合分钟 K 线,在延迟可控、数据精准、自定义扩展上更具优势。本文基于火山引擎开发者常用技术栈,完整说明如何用 WebSocket 接入 A 股实时 Tick 数据,并本地聚合生成标准分钟级行情,代码可直接在服务端部署运行。
一、业务场景与开发需求
面向量化交易系统、行情可视化工具、策略服务后台,分钟级行情需满足:
- 1 分钟 K 线四价:开盘价、收盘价、最高价、最低价
- 分钟累计成交量,支持后续指标计算
- 数据低延迟、不丢包、可复现
- 支持多标的并行处理与持久化存储
直接调用 HTTP 接口轮询存在限流、延迟高、数据断层问题,因此采用WebSocket 长连接 + Tick 本地聚合为最优方案。
二、主流数据接入方式对比
| 接入方式 | 延迟 | 稳定性 | 资源占用 | 适用场景 |
|---|---|---|---|---|
| HTTP 轮询 | 高(秒级) | 一般,易限流 | 高 | 低频查询、非实时场景 |
| WebSocket | 低(毫秒级) | 高,长连接稳定 | 低 | 实时行情、策略推送 |
在高并发、低延迟要求的开发者场景中,WebSocket 为首选。
三、核心逻辑:Tick 数据聚合分钟 K 线
Tick 数据包含成交时间、价格、成交量等原始信息,按时间窗口聚合即可得到标准 1 分钟 K 线:
- 开盘价:当前分钟第一笔成交价
- 收盘价:当前分钟最后一笔成交价
- 最高价:分钟内价格最大值
- 最低价:分钟内价格最小值
- 成交量:分钟内累计成交量
分钟 K 线聚合代码(Python)
from datetime import datetime
# 存储分钟级行情数据
minute_data = {}
def update_tick(tick):
"""
实时处理Tick数据,聚合生成分钟K线
:param tick: 单条Tick数据(含time、price、volume)
"""
# 按分钟分组
minute_str = datetime.fromtimestamp(tick['time']).strftime('%Y-%m-%d %H:%M')
if minute_str not in minute_data:
# 初始化当前分钟数据
minute_data[minute_str] = {
'open': tick['price'],
'high': tick['price'],
'low': tick['price'],
'close': tick['price'],
'volume': tick['volume']
}
else:
# 更新收盘价、极值、累计成交量
minute_data[minute_str]['close'] = tick['price']
minute_data[minute_str]['high'] = max(minute_data[minute_str]['high'], tick['price'])
minute_data[minute_str]['low'] = min(minute_data[minute_str]['low'], tick['price'])
minute_data[minute_str]['volume'] += tick['volume']
四、WebSocket 接入实时行情
以 AllTick API 为例,通过 WebSocket 订阅 A 股实时 Tick 流,数据推送后直接进入聚合逻辑,适合火山引擎 ECS、容器服务部署。
WebSocket 连接代码
import websocket
import json
def on_message(ws, message):
"""消息回调:解析Tick并聚合"""
tick = json.loads(message)
update_tick(tick)
def on_error(ws, error):
"""错误处理:便于线上监控"""
print(f"WebSocket错误: {error}")
def on_close(ws, close_status_code, close_msg):
"""断开重连逻辑"""
print("连接关闭,尝试重连...")
ws.run_forever()
def on_open(ws):
"""连接成功后订阅标的(可批量订阅)"""
ws.send(json.dumps({"sub": "000001.SZ"}))
print("订阅成功")
if __name__ == "__main__":
# 启动WebSocket长连接
ws = websocket.WebSocketApp(
"wss://api.alltick.co/stock/ws",
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close
)
ws.run_forever(ping_interval=30, ping_timeout=10)
五、数据存储方案(适配火山引擎生态)
聚合后的分钟行情可根据业务选择存储,兼容火山引擎云产品:
- CSV/Parquet:开发调试、本地验证最快
- SQLite:单文件轻量存储,适合小服务
- Redis:内存高速读取,支撑实时查询与面板展示
- 云数据库 RDS:高并发、持久化、支持 SQL 分析
六、开发优化与最佳实践
- 增加断线自动重连、心跳保活,提升长连接稳定性
- 支持多标的批量订阅与并行聚合,提升处理效率
- 可扩展计算均价、振幅、涨跌幅等指标,丰富行情维度
- 用历史 Tick 数据复盘重算,保证实盘与回测数据一致
- 对接日志服务与监控,便于线上问题排查
总结
通过 WebSocket 接入 A 股实时 Tick 数据并本地聚合,是开发者搭建低延迟、高可用、高可控分钟级行情服务的标准方案。整套架构轻量高效,可直接运行在火山引擎服务端环境,适用于行情工具、量化策略、实盘监控等各类开发场景,相比第三方 K 线接口更灵活、更稳定。
参考文档:https://apis.alltick.co/
GitHub:https://github.com/alltick/alltick-realtime-forex-crypto-stock-tick-finance-websocket-api
