实操笔记:对接美股 API 遇到 Tick 时间缺口,聊聊回测踩过的数据坑
展开
做美股量化研究的朋友应该都有体会,回测结果经常会出现“代码看着没问题,但跑出来效果很诡异”的情况。很多人第一反应去改策略逻辑、调参数,折腾半天,最后才发现问题出在底层的Tick原始行情数据上面。
Tick就是逐笔成交、报价的原始记录,做短周期策略、高频复盘、因子回测都离不开这份数据。我平时会调用美股API拿Tick数据做研究,之前复盘历史数据的时候,发现部分交易时段会出现大片时间空白。
这里要分清,有些间隔是个股交投冷清,本来就没有成交;还有一部分是网络、推送、消费处理跟不上造成的行情缺口。这种属于数据丢了,不是市场真实状态。如果没做检查直接拿去跑回测,会悄悄带来偏差,看着回测很漂亮,实盘完全对不上。
Tick数据时间断层一般是怎么来的1、网络抖动,WebSocket连接短暂断开,部分成交报文直接丢失; 2、行情API推送延迟; 3、自己这边程序处理速度跟不上,消息堆积丢数据; 4、报文乱序到达,不是真的缺数据,很容易被误判成缺口。
所以我的实操惯:不要迷信API返回的数据就是完整的,入库之前一定要做一遍时间校验。
简单代码,检测Tick时间间隔异常原理很简单,对比前后两条Tick的时间差。注意不能要求每一笔Tick间隔都一模一样,美股小票经常很久没有一笔成交,这种是正常现象。我们设置一个阈值,超过阈值就标记可疑缺口。
下面这段Python代码,拿来处理批量历史Tick,适合预处理阶段跑一遍:
from datetime import datetimetick_data = [ 2026-08-25 09:30:01 , 2026-08-25 09:30:03 , 2026-08-25 09:30:12 ]for i in range(len(tick_data)-1): t1 = datetime.strptime(tick_data, %Y-%m-%d %H:%M:%S ) t2 = datetime.strptime(tick_data[i+1], %Y-%m-%d %H:%M:%S ) diff = (t2 - t1).seconds if diff > 5: print( Tick时间间隔异常 , diff)
发现缺口之后,要不要直接补数据?这点很多人容易踩坑,看到时间有空档就直接插值填充,其实要看用途: 1、做逐笔成交分析、研究盘口行为:如果空档是市场真的没成交,就保留原始数据,不要随便补,改原始数据等于篡改真实市场。 2、做K线生成、因子计算:需要完整时间轴,就算这一分钟没有任何成交Tick,也要保留这个时间切片,防止时间轴断掉。 3、实时接收行情的时候:优先记录缺口信息,记下缺口起止时间、时长,不要直接修改原始行情。后面跑回测的时候,也可以参考日志,评估这一段回测结果能不能信。
WebSocket实时行情里,实时监控Tick时间缺口
看实时逐笔的时候一般用WebSocket长连接拿数据流,拿AllTick API举个例子,可以在接收消息的回调里面直接加上时间校验,异常数据还没进入回测模块就识别出来。
完整可运行代码:
import websocketimport jsonfrom datetime import datetimelast_tick = Nonedef on_message(ws, message): global last_tick data = json.loads(message) if data.get( symbol ) == AAPL : trade_time = data.get( tradeTime ) current = datetime.strptime( trade_time, %Y-%m-%d %H:%M:%S ) if last_tick: gap = (current - last_tick).seconds if gap > 5: print( 发现时间间隔: , gap) last_tick = currentws = websocket.WebSocketApp( wss://api.alltick.co/stock/websocket , on_message=on_message)ws.run_forever()
实际使用中的几个提醒1、时间和时区一定要对齐。不同美股API返回的时间格式、时区不一样,不做统一转换,正常数据也会被误判成缺口。 2、Tick入库之前务必按时间排序。WebSocket推送会乱序,后收到的数据,成交时间反而更早,不排序后面全部算错。 3、原始行情数据和异常日志分开保存。原始数据尽量不要改动,缺口、异常写到另外的日志,后面排查问题才有依据。
小结做美股量化,大家总把注意力放在策略、指标上面,经常忽略底层行情数据质量。哪怕是AllTick API这种成熟的行情接口,经过网络传输,依然有可能出现时序缺口。
把缺口检测放在数据最开始的环节,提前标记异常,能减少很多莫名其妙的回测误差,回测的可信度才会更高。
[i]各位做美股量化、跑回测的朋友,你们有没有遇到过数据坑?回测和实盘对不上,最后查到是数据源问题的,可以楼下一起聊聊经验。
[/i]
Tick就是逐笔成交、报价的原始记录,做短周期策略、高频复盘、因子回测都离不开这份数据。我平时会调用美股API拿Tick数据做研究,之前复盘历史数据的时候,发现部分交易时段会出现大片时间空白。
这里要分清,有些间隔是个股交投冷清,本来就没有成交;还有一部分是网络、推送、消费处理跟不上造成的行情缺口。这种属于数据丢了,不是市场真实状态。如果没做检查直接拿去跑回测,会悄悄带来偏差,看着回测很漂亮,实盘完全对不上。
Tick数据时间断层一般是怎么来的1、网络抖动,WebSocket连接短暂断开,部分成交报文直接丢失; 2、行情API推送延迟; 3、自己这边程序处理速度跟不上,消息堆积丢数据; 4、报文乱序到达,不是真的缺数据,很容易被误判成缺口。
所以我的实操惯:不要迷信API返回的数据就是完整的,入库之前一定要做一遍时间校验。
简单代码,检测Tick时间间隔异常原理很简单,对比前后两条Tick的时间差。注意不能要求每一笔Tick间隔都一模一样,美股小票经常很久没有一笔成交,这种是正常现象。我们设置一个阈值,超过阈值就标记可疑缺口。
下面这段Python代码,拿来处理批量历史Tick,适合预处理阶段跑一遍:
from datetime import datetimetick_data = [ 2026-08-25 09:30:01 , 2026-08-25 09:30:03 , 2026-08-25 09:30:12 ]for i in range(len(tick_data)-1): t1 = datetime.strptime(tick_data, %Y-%m-%d %H:%M:%S ) t2 = datetime.strptime(tick_data[i+1], %Y-%m-%d %H:%M:%S ) diff = (t2 - t1).seconds if diff > 5: print( Tick时间间隔异常 , diff)
发现缺口之后,要不要直接补数据?这点很多人容易踩坑,看到时间有空档就直接插值填充,其实要看用途: 1、做逐笔成交分析、研究盘口行为:如果空档是市场真的没成交,就保留原始数据,不要随便补,改原始数据等于篡改真实市场。 2、做K线生成、因子计算:需要完整时间轴,就算这一分钟没有任何成交Tick,也要保留这个时间切片,防止时间轴断掉。 3、实时接收行情的时候:优先记录缺口信息,记下缺口起止时间、时长,不要直接修改原始行情。后面跑回测的时候,也可以参考日志,评估这一段回测结果能不能信。
WebSocket实时行情里,实时监控Tick时间缺口
看实时逐笔的时候一般用WebSocket长连接拿数据流,拿AllTick API举个例子,可以在接收消息的回调里面直接加上时间校验,异常数据还没进入回测模块就识别出来。
完整可运行代码:
import websocketimport jsonfrom datetime import datetimelast_tick = Nonedef on_message(ws, message): global last_tick data = json.loads(message) if data.get( symbol ) == AAPL : trade_time = data.get( tradeTime ) current = datetime.strptime( trade_time, %Y-%m-%d %H:%M:%S ) if last_tick: gap = (current - last_tick).seconds if gap > 5: print( 发现时间间隔: , gap) last_tick = currentws = websocket.WebSocketApp( wss://api.alltick.co/stock/websocket , on_message=on_message)ws.run_forever()
实际使用中的几个提醒1、时间和时区一定要对齐。不同美股API返回的时间格式、时区不一样,不做统一转换,正常数据也会被误判成缺口。 2、Tick入库之前务必按时间排序。WebSocket推送会乱序,后收到的数据,成交时间反而更早,不排序后面全部算错。 3、原始行情数据和异常日志分开保存。原始数据尽量不要改动,缺口、异常写到另外的日志,后面排查问题才有依据。
小结做美股量化,大家总把注意力放在策略、指标上面,经常忽略底层行情数据质量。哪怕是AllTick API这种成熟的行情接口,经过网络传输,依然有可能出现时序缺口。
把缺口检测放在数据最开始的环节,提前标记异常,能减少很多莫名其妙的回测误差,回测的可信度才会更高。
[i]各位做美股量化、跑回测的朋友,你们有没有遇到过数据坑?回测和实盘对不上,最后查到是数据源问题的,可以楼下一起聊聊经验。
[/i]
主题股票:
主题概念:
声明:遵守相关法律法规,所发内容承担法律责任,倡导理性交流,远离非法证券活动,共建和谐交流环境!
