一次“诡异”的曲线让我回头检查数据源
几周前我在复盘一个黄金短线策略时,遇到一件想不通的事:明明进出场逻辑是在震荡区间内低吸高抛,历史回测曲线却总是在周一早晨出现一截垂直的上涨或下跌。最初的直觉是浮点计算出了偏差,于是我把信号触发的时间戳全部打印出来对账,才发现所有异常都指向同一个特征——周六和周日完全没有新tick流入。
这让我意识到,不是策略有bug,而是我所依赖的实时黄金API严格遵循了市场交易时间。当纽约市场在周五收市后,XAUUSD的报价推送会自然中断,直到周日亚盘开启才恢复。对盯盘工具而言,这段静默无关紧要;但对回测来说,它直接制造了一段“假连续”。
周末数据缺失到底扭曲了什么
回测引擎通常是逐笔或者按固定时间步长推进的。如果连续48小时没有任何报价更新,引擎会默认将最后已知价格保持到周一开盘前。可真实世界里,这段时间可能有地缘消息、央行官员讲话、期货持仓变化在堆积。周一开盘瞬间,价格常常已经离上周五收盘价有几美元甚至十几美元的距离。
拿均线策略举例:周五收盘假设在2650,周一开盘就跳到2665,那15美元的变动在回测中会表现成一根竖线,而不是逐笔成交。均线计算会把这段跳空理解成连续走势的一部分,导致信号完全失真——原本可能是周末避险情绪带来的正常跳开,模型却可能判定为日内剧烈突破,错误地触发止损或追单。
我比较过的几种修复手段
为了减弱这种影响,我尝试了多种填补空缺的思路,简要对比下来大概是这样:
| 处理方式 | 回测一致性 | 实现难度 | 推荐度 |
|---|---|---|---|
| 对周末时段不做任何干预 | 差 | 简单 | 不推荐 |
| 用周五收盘价填满周六日 | 中等 | 简单 | 勉强可用 |
| 用周一开盘价回补缺口 | 中等 | 简单 | 一般 |
| 标记跳空区间并单独存储事件 | 较好 | 中等 | 推荐 |
| 引入第三方参考数据交叉验证 | 好 | 较高 | 按需选择 |
完全忽略周末会让问题原封不动留在那里。用固定价格填充虽然让数据不间断,但掩盖了真实波动的起点。我最常用的是标记跳空法:不补数据,而是把每一次从周五收盘到周一开盘的价差定义成一个“跳空事件”,回测完结后单独分析策略对这些事件的敏感度。
我在工程落地中的实际写法
在我自己的量化管线里,我会在接收到实时tick后加上一道时间过滤。以AllTick的WebSocket推送为例,每条数据都带有精确的时间戳,于是我可以在本地做一个判断:如果是周末时段,就只记录价格但不触发任何策略信号,并且把这段行情记入跳空缓冲区。
import websocket
import json
from datetime import datetime
def on_message(ws, message):
data = json.loads(message)
timestamp = datetime.fromtimestamp(data['time'])
# Weekend data is isolated: no signal triggered, only gap recorded
if timestamp.weekday() >= 5:
print(f"Weekend tick {data['price']} logged for gap buffer")
# Buffer price for gap analysis
store_gap_data(data)
else:
# Normal session: straight to strategy processing
process_tick(data['symbol'], data['price'])
ws = websocket.WebSocketApp(
"wss://apis.alltick.co/websocket-api/stock-websocket-interface-api/transaction-quote-subscription",
on_message=on_message
)
ws.run_forever()
这样处理的好处是,实时交易时周末数据绝不污染信号;回测模块也能复用同一套跳空缓冲,计算出“周一开盘价-周五收盘价”的完整序列,让策略在真实的断层环境中接受检验。
让回测靠近实盘的几点思路
经历几次翻车后,我总结出三条最基本的原则:
- 明确时间边界:把一周的时间轴按交易时段切片,严格剔除周五收盘到周日开盘的K线合成,避免无中生有的连续。
- 单独管理跳空:把每周的跳空大小存成独立特征,评估策略是否对跳空方向或幅度过度依赖。
- 对齐实盘逻辑:实盘中周五留仓过周末所承受的,就是周一跳开的风险,回测必须原样呈现,而不是用插值美化。
黄金实时API不推送周末数据,恰好真实反映了市场节奏。与其想尽办法让数据“看起来连续”,不如尊重断层的存在,把回测框架设计成能理解并合理应对这种断层——这样产出的策略才能可信地映射到实盘。
