你在做美股量化策略时,可能会把注意力放在因子逻辑和回测收益上,但实盘中一旦行情数据出现异常,再好的策略也会被带偏。尤其是接入了美股实时行情数据api之后,tick数据直接进入策略计算,数据质量必须提前把关。
为什么tick异常会影响策略
实时行情是连续推送的数据流,价格跳动、时间戳偏移、重复推送都可能出现。如果这些异常tick进入你的K线合成或指标计算,就会导致信号失真。常见异常类型可以这样分类:
| 类型 | 表现 |
|---|---|
| 价格异常 | 价格短时间大幅偏离 |
| 时间异常 | 时间戳顺序不连续 |
| 成交异常 | 成交量出现明显偏差 |
| 重复数据 | 相同tick重复进入系统 |
接入方式对比
量化场景下,REST轮询可能因为间隔问题漏掉关键tick,而WebSocket推送更适合做逐笔校验。AllTick API的WebSocket行情推送在实时性和字段完整性上比较适合量化前处理。
tick过滤:策略前的第一道防线
你可以保留上一条tick记录,对当前数据做基础检查:
def check_tick(current, previous):
if current["price"] <= 0:
return False
if current["timestamp"] < previous["timestamp"]:
return False
change = abs(current["price"] - previous["price"]) / previous["price"]
if change > 0.15:
return False
return True
这个函数能挡住价格无效、时间倒退和短期波动过大的数据。实盘中,阈值建议按标的波动率调整,避免误杀正常行情。
时间戳乱序直接影响K线
在合成分钟K线时,你可能会发现K线位置异常,查原始tick会看到类似:
10:30:01
10:30:02
10:29:58
这种乱序会让K线边界错乱。所以时间戳校验要放在聚合之前。
WebSocket接收时加入校验
下面是一个WebSocket接入示例,收到数据后先做字段完整性判断,再进入过滤:
import websocket
import json
def on_message(ws, message):
data = json.loads(message)
if "price" in data and "timestamp" in data:
if check_tick(data, last_tick):
print("valid tick", data)
ws = websocket.WebSocketApp(
"wss://api.alltick.co/stock/websocket",
on_message=on_message
)
ws.run_forever()
实操建议
- 字段完整性检查不要省略,缺字段的数据直接拦截。
- 重复tick要过滤,避免重连后重复进入。
- 异常数据可以标记为正常、警告、异常,便于后续分析而不是直接删除。
对量化交易来说,美股实时行情数据api提供的是连续流,数据质量决定了策略执行效果。提前做好tick级校验,能减少很多实盘中的意外。


