之前做加密货币量化回测时,我一直把重点放在策略逻辑上,比如调整指标参数、优化买卖条件、测试不同周期的数据。刚开始回测结果看起来不错,但实际运行模拟交易后,效果却和预期有一些差距。
后来检查整个流程时,我发现一个容易被忽略的问题:回测里的订单成交太理想化了。对于依赖Tick数据的短周期策略来说,交易延迟和撮合延迟会直接影响最终结果。
如果忽略这些时间因素,很多策略在历史数据里表现很好,但换到更接近真实交易的环境中,结果可能会出现较大变化。
使用加密货币api获取Tick数据时,每一条记录通常包含价格、成交量以及时间戳等信息。相比普通K线,Tick数据能够记录更细的市场变化,因此很多短周期策略都会基于这类数据进行测试。
但真实交易并不是产生信号后立即完成成交。
从策略发出交易指令,到订单最终成交,中间会经过多个环节:
| 环节 | 影响因素 |
|---|---|
| 策略计算 | 模型复杂度、程序执行速度 |
| 网络传输 | 网络环境、服务器距离 |
| 接口响应 | API处理时间 |
| 撮合执行 | 市场深度、订单排队 |
这些时间差在长周期策略中影响有限,但对于秒级甚至毫秒级策略来说,几十毫秒的变化可能就会改变成交价格。
我之前测试一个短周期策略时,回测曲线表现比较理想,后来加入延迟模拟后,结果明显降低。检查数据后发现,原来的回测默认订单立即成交,而真实市场并不会一直提供理想成交价格。
交易延迟主要模拟订单从策略系统发送到交易市场所需要的时间。比如策略在10:00:00产生买入信号,如果设置100毫秒交易延迟,那么订单实际进入市场的时间应该接近10:00:00.100。
撮合延迟则代表订单进入市场后,等待成交的时间。
这两个参数虽然都和时间有关,但作用并不一样。在回测系统中分开设置,可以更准确地模拟真实交易过程。
不同策略可以参考下面的范围:
| 策略类型 | 交易延迟 | 撮合延迟 |
|---|---|---|
| 普通量化策略 | 100-500ms | 100ms以上 |
| 短周期策略 | 10-100ms | 几毫秒到几十毫秒 |
| 极短周期策略 | 更低延迟环境 | 需要结合盘口数据 |
实际使用时,并不存在一个适合所有场景的固定参数。服务器位置、网络环境、交易接口响应速度以及市场流动性都会影响最终结果。
高频回测除了延迟设置,Tick数据本身的处理方式也非常重要。
同一时间范围内可能产生多笔成交,如果只按照价格排序,可能会改变原始成交顺序,导致回测结果偏差。我的处理方式通常是保留原始时间戳,并按照成交时间、价格、成交量等字段进行处理,让数据顺序尽可能接近真实市场。
在实时行情测试中,我使用 AllTick API 的 WebSocket 接口获取Tick数据,再将数据接入自己的回测流程。下面是一个简单的Python订阅示例:
import websocket
import json
from datetime import datetime
def on_message(ws, message):
data = json.loads(message)
symbol = data.get("symbol")
price = data.get("price")
timestamp = data.get("timestamp")
if timestamp:
trade_time = datetime.fromtimestamp(timestamp / 1000)
print(
"symbol:",
symbol,
"price:",
price,
"time:",
trade_time
)
def on_open(ws):
request = {
"action": "subscribe",
"symbol": "BTCUSDT",
"type": "tick"
}
ws.send(json.dumps(request))
ws = websocket.WebSocketApp(
"wss://api.alltick.co/ws",
on_open=on_open,
on_message=on_message
)
ws.run_forever()
获取到实时Tick数据后,可以根据自己的回测框架加入不同延迟参数,再观察策略在不同执行环境下的变化。
很多人在刚开始做高频回测时,会习惯把延迟设置得非常低,希望看到策略在最佳环境下的表现。但如果实际运行环境无法达到对应速度,这样的测试结果参考价值并不高。比如本地电脑运行策略,却模拟极低延迟服务器环境,最终得到的结果可能只是理论状态。
我的习惯是设置多个延迟区间进行测试,比如几十毫秒、几百毫秒,然后观察策略对于执行速度变化是否敏感。如果一个策略对几十毫秒的变化非常敏感,说明它对于交易执行环境依赖较高,后续需要进一步优化。
使用加密货币api的Tick数据做高频回测,本质是在尽可能还原真实市场。策略逻辑只是其中一部分,数据时间、订单执行过程以及成交机制同样会影响结果。
很多回测表现不错的策略,实际运行后效果变化较大,并不一定是策略本身的问题,而是测试阶段忽略了交易过程中的细节。
加入交易延迟和撮合延迟之后,回测结果可能没有之前那么理想,但数据会更加接近真实交易环境,也更方便判断策略是否具备实际参考价值。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70038549/viewspace-3179494/ ,如需转载,请注明出处,否则将追究法律责任。