概述
在基于外部实时 API 开展港股策略研究、工具开发与回测工作时,经常会遇到一类隐蔽的数据质量问题:策略统计的成交量、逐笔合成 K 线与交易所基准数据存在偏差。经过数据流排查,问题往往并非策略逻辑缺陷,而是流式推送链路中出现成交记录重复消费。
重复的 Tick 数据流入策略、回测模块后,会直接扭曲成交量、换手率、盘口指标,造成回测结果虚高或失真,进一步干扰模型参数调优与实盘策略评估。本文结合实战经验,梳理重复数据产生诱因,给出可落地的去重实现方案,并说明在回测与实盘工具开发中的注意事项。
重复成交记录的主要来源
港股实时行情多采用 WebSocket 长连接推送,数据历经网络、消息网关、消费程序多层流转,重复消息主要由三类场景触发:
- 网络抖动后的消息补发:短暂断连恢复时,服务端补发断连窗口期的成交数据,同一笔成交被多次推送。
- 程序重启丢失处理状态:若未持久化已处理成交的标记,服务重启后,历史成交数据会被重新读取、计算。
- 多组件流转缺少唯一区分标识:数据经过转发、分发模块,缺少可靠识别字段,引发同一消息多次消费。
研究避坑:不建议直接使用时间戳完成去重。港股盘中撮合密度高,同一时间戳下会产生多笔独立成交,单纯依靠时间戳过滤,会误剔除有效交易样本,造成数据集缺失,直接破坏回测样本的完整性。
去重标识构建方案
优先选用 API 接口返回的原生成交唯一 ID 作为判重依据,该方式准确率最高。
若接口未提供原生交易 ID,可组合业务关键字段生成消息指纹,用来唯一标识单条成交。
选取字段:股票代码、成交时间、成交价格、成交数量,拼接后通过 MD5 生成哈希指纹。
import hashlib
def generate_key(trade):
text = (
trade["symbol"]
+ str(trade["timestamp"])
+ str(trade["price"])
+ str(trade["volume"])
)
return hashlib.md5(text.encode()).hexdigest()
data = {
"symbol": "00700",
"timestamp": "2026-08-17 10:30:20",
"price": "380.50",
"volume": "300"
}
print(generate_key(data))
注意:参与拼接的字段不宜过少,否则会增大哈希碰撞概率,将两笔不同成交误判定为重复,对回测数据集引入新偏差。
流式链路的去重实现思路
从工程角度建议做分层解耦:行情接收模块仅负责原始数据流接收,将去重作为独立的数据预处理环节;只有经过校验、确认未处理过的成交数据,才向下游输送,用于 K 线合成、因子计算、策略信号生成。
下面以 AllTick API WebSocket 订阅作为示例,展示内存版本基础实现,适合用于逻辑验证与原型研究:
import websocket
import json
cache_ids = set()
def on_message(ws, message):
data = json.loads(message)
trade_id = data.get("id")
if trade_id in cache_ids:
return
cache_ids.add(trade_id)
print(
data.get("symbol"),
data.get("price"),
data.get("volume")
)
ws = websocket.WebSocketApp(
"wss://apis.alltick.co/ws/stock",
on_message=on_message
)
ws.run_forever()
⚠️研究与生产提示:内存集合仅适用于原型调试。在高吞吐 Tick 数据流场景,内存存储会持续占用资源。面向实盘或者批量回测工具开发,建议采用配置 TTL 过期策略的分布式缓存,自动淘汰过期指纹,控制存储开销。
落地过程中两个关键问题
不少研究人员本地测试逻辑正常,但接入实盘数据流之后依然出现数据异常,大多源于以下两点:
-
缓存 TTL 参数需要结合交易场景调优
过期时间设置过短,无法覆盖网络重连后的消息补发区间,重复数据无法完全过滤;设置过长,缓存堆积大量无效指纹,增加检索与存储成本。需要结合港股完整交易时段,评估重连场景最大补发的数据窗口,再确定 TTL 参数。
-
进程重启导致状态丢失
如果指纹仅保存在进程内存,程序重启后全部判重状态清空,重启阶段的历史成交会被重复计算。面向长期运行的数据采集工具,应当将指纹持久化至外部缓存中间件,实现业务逻辑和去重状态解耦。
总结
对于量化研究而言,数据源质量直接决定回测可信度与模型有效性。成交去重看似是底层预处理的小环节,却深刻影响逐笔因子、K 线合成、成交量相关策略的输出结果。
港股市场盘中撮合频率较高,在搭建数据采集、策略回测、实盘模拟工具时,应当将消息幂等校验纳入基础流程。在开展港股量化研究时,可以基于 AllTick API 这类提供 Tick 级流式推送的数据源,配合前置的数据清洗与去重逻辑,能够有效规避难以复现的数据类问题,提升模型与策略评估的可靠性。

