我们最近在研发一套多资产量化策略,把黄金、白银纳入了标的池。和股票、期货不同,贵金属的行情数据接入有其特殊性,尤其是在合成多周期 K 线和处理跨市场交易时段方面。这篇分享我们基于贵金属 API 构建数据流的方法,重点拆解 tick 数据获取与 K 线生成的工程细节。
量化策略对贵金属行情的真实需求
回测和实盘中,我们不仅需要黄金最新价,更依赖完整的 tick 序列来还原市场微观结构。常见的需求包括:用逐笔数据合成任意周期 K 线,提取买卖价差作为流动性指标,以及通过高频时间戳计算波动率。下表列出了不同数据类型对应的量化场景。
| 数据类型 | 应用场景 |
|---|---|
| 实时价格 | 行情展示、价格提醒 |
| Tick数据 | 高频分析、实时监控 |
| K线数据 | 趋势分析、指标计算 |
| 买卖报价 | 价差分析 |
| 时间戳 | 数据排序、周期转换 |
如果数据源只提供1分钟快照,而我们要回测基于 tick 的突破策略,那结果会完全失真。因此,数据精度就是策略的粮草。
策略研发中的典型数据痛点
我们在早期尝试直接复用互联网免费的 REST 接口,发现两个致命问题:一是行情延迟不稳定,高峰时段 tick 合并严重;二是时间戳不规范,有些标注的是交易所当地时间,有些是服务器时间,导致我们合成5分钟 K 线时经常出现跨周期错位。另外,HTTP 轮询无法捕捉到价格跳空瞬间的中间状态,对于那些依赖精确入场点的短线策略来说,差几笔 tick 就可能改变回测结论。
用高质量 API 构建数据支撑
为了解决这些问题,我们选用了支持 WebSocket 实时推送的贵金属行情 API。以 AllTick 为例,它能提供稳定的毫秒级 tick 流,并且每个消息都严格包含 symbol、price、volume 和 UTC 时间戳。我们在接收端编写了标准化的数据适配器,将原始推送直接转化为统一结构:
{
"symbol": "XAUUSD",
"price": "2385.50",
"volume": "10",
"timestamp": "2026-07-31T09:30:00Z"
}
下面是我们在实验环境中用于接收 XAUUSD 实时行情的 Python 代码,演示了 WebSocket 订阅的基本流程。
import websocket
import json
def on_message(ws, message):
data = json.loads(message)
symbol = data.get("symbol")
price = data.get("price")
timestamp = data.get("timestamp")
print(
f"{symbol} 当前价格:{price} 时间:{timestamp}"
)
def on_open(ws):
subscribe_message = {
"action": "subscribe",
"symbol": "XAUUSD",
"type": "tick"
}
ws.send(json.dumps(subscribe_message))
ws = websocket.WebSocketApp(
"wss://api.alltick.co/ws",
on_open=on_open,
on_message=on_message
)
ws.run_forever()
从原始数据到可用的 K 线服务
数据进来后,我们的服务升级包含三个步骤。第一步,实时过滤异常 tick,剔除价格跳空超过一定标准差的点,并合并同一毫秒内的重复推送。第二步,基于 UTC 时间戳滑动窗口,计算1分钟、5分钟、15分钟及日线的 OHLC,开、高、低、收均采用窗口内 tick 的实际成交价生成,而非简单用首尾价替代。第三步,历史数据以 Parquet 格式落盘,回测时直接从本地读取,不再消耗 API 额度。
通过这层数据中台,上层的贵金属策略研究效率大幅提升。无论是经典的均线交叉,还是基于买卖压力的高频因子,都能在干净的数据基础上快速验证,不再被数据质量问题牵着鼻子走。

