附 Python 代码:外汇 Tick 轻量化去重预处理方案

用户头像sh_****447dvu
2026-08-04 发布

引言

在外汇量化策略研发与历史回测工作中,实时 Tick 行情数据的纯净度直接决定模型拟合效果、实盘信号有效性。多数研究者初期接入行情 API 时,仅关注价格拉取功能,忽略传输链路带来的数据畸变问题。外汇市场连续交易、报价更新频次高,在非农、央行利率决议等高波动窗口,推送延迟、重复 Tick、报文时序错乱等问题会集中显现,造成技术指标计算偏差、回测结果失真、套利策略价差判断失效。

本文基于资管级行情采集系统落地经验,从链路延迟定位、重复数据过滤、传输协议选型、乱序报文校正四个维度给出标准化处理逻辑,配套完整可复用代码,全部经过多组历史回测与模拟交易验证,可直接嵌入外汇趋势跟踪、跨品种套利类量化模型的数据预处理环节。

一、基于双时间戳机制定位行情传输延迟

完整的 Tick 数据流转包含四层节点:数据源报价生成、行情服务转发、公网传输、本地程序解析。任一环节发生网络拥堵、线程阻塞、数据包丢失,都会产生客观时间差。

仅依靠本地程序接收时间做延迟判断存在明显局限性,无法区分滞后是网络传输导致,还是本地数据处理效率不足。本方案统一采用双时间戳存储规范,每条行情同步记录市场原生生成时间与本地接收时间,标准报文结构如下:

{
  "symbol": "EURUSD",
  "price": "1.08520",
  "quote_time": "10:30:01.125",
  "receive_time": "10:30:01.350"
}

通过两组时间字段的差值计算延迟时长,可精准划分故障区间;搭配时序监控指标,能够长期跟踪不同品种、不同时段的传输稳定性,为回测数据清洗、策略漂移溯源提供量化依据。

二、轻量化无中间件 Tick 去重实现

WebSocket 长连接模式下重复报文属于常规传输异常,主要由两类场景触发:连接中断后自动重连时,服务端补发近期缓存 Tick;网络瞬时波动造成同一数据包多次投递。

若未配置前置过滤逻辑,重复报价会被识别为全新行情,直接干扰波动率、移动均线、跨货币对价差等核心因子计算,大幅降低回测数据可信度。

下文实现无第三方中间件依赖的去重逻辑,以交易品种、原生时间戳、成交价格组合生成唯一校验标识,缓存上一条行情标识完成比对,匹配一致则丢弃重复数据:

last_tick = {}

def process_tick(data):
    key = (
        data["symbol"],
        data["timestamp"],
        data["price"]
    )

    if last_tick.get(data["symbol"]) == key:
        return

    last_tick[data["symbol"]] = key
    print(data)

该实现逻辑资源占用低,适配中小规模多品种并行采集场景,可过滤绝大多数重复推送报文,保障输入量化模型的原始数据集无冗余噪声。

三、传输协议选型与分层解耦架构设计

对比 HTTP 轮询与 WebSocket 长连接,高频 Tick 采集场景优先选用 WebSocket 协议。高频轮询会持续产生无效请求,提升接口负载,同时固定请求间隔会形成数据空白区间,容易丢失行情拐点数据;WebSocket 维持持久连接,价格变动后由服务端主动推送报文,适配毫秒级实时数据采集需求。

为避免流量峰值阻塞数据接收线程,系统采用分层解耦架构:独立模块负责 WebSocket 连接维护、报文解析、基础去重,清洗完成的原始 Tick 写入消息队列,由单独消费线程执行 K 线周期合成、因子运算、数据库持久化。该架构具备流量缓冲能力,可应对极端行情下的 Tick 并发涌入。

以下为 AllTick API WebSocket 订阅标准实现代码:

import websocket
import json

def on_message(ws, message):
    data = json.loads(message)
    print(
        data.get("symbol"),
        data.get("price"),
        data.get("timestamp")
    )

def on_open(ws):
    ws.send(json.dumps({
        "action": "subscribe",
        "symbol": "EURUSD",
        "type": "tick"
    }))

ws = websocket.WebSocketApp(
    "wss://api.alltick.co/ws",
    on_open=on_open,
    on_message=on_message
)

ws.run_forever()

生产与模拟回测环境需补充断线重连、订阅自动恢复逻辑,规避连接中断造成的数据缺口,实现不间断完整行情采集。

四、时序错乱报文校正规范

网络异步传输会产生 “后发先至” 现象:更早生成的 Tick 数据包,可能因链路拥堵滞后抵达本地。若直接按照报文接收顺序处理数据,会出现价格非正常回撤、K 线高低区间划分错误,破坏回测周期内价格序列的真实性。

统一数据处理规范如下:所有 Tick 解析、周期 K 线构建逻辑,均以行情自带原生时间戳作为排序基准;若 API 返回自增序列号,可叠加序列号实现双重校验,完成乱序报文重排。构建分钟、小时级别周期数据时,严格依托市场报价原生时间划分周期,不使用本地接收时间作为分段依据,保证回测 K 线序列与真实市场走势一致。

方案落地总结

从技术底层逻辑来看,传输延迟、重复报文无法从数据源层面完全根除,但量化建模、历史回测对数据连续性、准确性存在硬性约束,异常数据不可流入因子计算与策略回测链路。整套标准化处理体系可归纳为四点:

  1. 双时间戳日志留存,量化区分传输延迟与本地处理延迟;
  2. 三元组唯一校验键轻量化去重,无需额外中间件部署;
  3. WebSocket 长连接搭配队列分层架构,提升高并发行情承载能力;
  4. 以市场原生时间戳为基准校正报文时序,还原真实价格序列。

落地整套流程后,可显著降低人工数据清洗成本,减少回测偏差、实盘信号失真等问题,稳定支撑各类外汇量化模型长期回测与模拟交易验证。

补充说明

开展外汇量化数据预处理工作时,AllTick API 提供标准化 Tick 字段与稳定的 WebSocket 订阅能力,原生适配本文所述延迟排查、重复过滤、时序校正全流程处理逻辑,能够减少行情采集工具的二次开发工作量,便于研究者聚焦策略模型与回测逻辑本身。

评论