如果一个日线策略根据周一收盘价计算信号,它就不能在周一收盘时下单。它可以在收盘价确定后提交订单,再以之后可执行的价格交易。这个微小的时机选择,对结果的影响可能超过一个巧妙的指标。
进行日线回测时,先把事件顺序写清楚,再编写信号:K 线何时完整、策略何时计算、订单何时到达市场,以及可能以什么价格成交。如果这些事件都发生在同一瞬间,回测就跳过了最棘手的部分。
我能用今天的收盘价在今天收盘时交易吗?
通常不行。依赖最终收盘价的信号,只有在收盘竞价或最后一笔交易发生后才可用。假设能以同一价格成交,就等于假设策略足够早地知道结果,能在一个帮助决定结果的价格上参与交易。
来看一个简单规则:收盘价高于 20 日移动平均线时买入。周一收盘时,这条规则变为真。若回测在周一收盘买入,就既用周一的完整收盘价做了决策,又用它成交。对于基础的日线 bar 模型,诚实的近似做法是等周一的 bar 完成后再生成订单,并且最早在周二开盘时成交,同时计入合理成本。
有些策略会根据竞价截止时间之前可获得的信息,在收盘竞价期间提交订单。这类策略可以回测,但信号只能使用截止时间前的数据,成交也需要反映竞价执行情况。仅仅称为“日线信号”,并不能证明这两个条件都满足。
日线回测应该采用什么成交价?
不存在一种放之四海而皆准的正确价格。如果信号基于已完成的日线 bar,并在之后发送订单,那么下一交易时段的开盘价是一个明确的起点假设,但它并非保证成交价:隔夜跳空可能使市场价格发生变化,市价单还要承担点差、手续费,并且可能产生冲击成本。
以刚才的周一信号为例,假设周一收盘价为 $100,周二开盘价为 $103。若假装以 $100 买入,收盘到收盘回测可能显示小幅盈利;若在下一个开盘价入场,起始价格则是 $103。这 $3 的差异不是可以通过调参消除的“滑点”,而是周一收盘后才得知信号所带来的价格后果。
| 信号可用时间 | 候选执行时机 | 模型假设 |
|---|---|---|
| 日线收盘后 | 下一交易时段开盘 | 订单可以在开盘前或开盘时到达市场 |
| 收盘竞价截止时间前 | 收盘竞价 | 信号仅使用截止时间前的信息;对竞价成交进行建模 |
| 日线收盘后 | 之后的日内价格 | 策略等待;执行模型需要日内数据和明确的时间安排 |
在加密货币市场,“日线收盘”是一种约定,因为交易会持续跨越时间戳边界。策略仍然可以使用已完成的 UTC 日线蜡烛图,但必须等蜡烛图完成且数据到达后再行动。如果你的数据管道要晚几秒才完成 bar,那么假设能以边界时刻的价格下单就更难站得住脚。
只有日线 bar 时,我该如何对订单建模?
要明确 bar 能告诉你什么、不能告诉你什么。日线 OHLCV 可以支持按下一开盘价成交的近似模型,却无法显示订单到达时的点差、当天的价格路径,也无法判断限价触及某个价格时,你的订单是否已在队列中排队。
对于日线市价单,可以从下一开盘价开始建模,然后计入策略实际会承担的成本:交易场所手续费、点差估算,以及根据订单规模估算的冲击成本。还要对这些成本进行压力测试。如果结果依赖于假设点差为零或冲击成本可以忽略,那么日线 bar 并不足以支撑这种把握。
对于限价单,某天的最低价触及你的限价,并不能证明你成交了。市场可能在你的订单到达前就已交易到该价格,也可能有比你更靠前的订单,其成交量超过了当时的交易量。日线 bar 通常过于粗略,无法支持可信的队列模型。如果结论依赖日内执行,就使用更精细的数据;否则就有意采用保守的成交假设,并明确标注。
哪些时机检查能发现日线 bar 的前视偏差?
我喜欢做几项直接的检查,因为它们能迅速揭示假设:
- 将每个由信号生成的订单都向后推迟一个交易时段。如果表现骤降,就检查原模型是否把信号所在 bar 的收盘价当作成交价。
- 分别记录信号时间、订单提交时间和成交时间。这些时间戳应该能讲清楚一段合理的过程,无需额外解释。
- 比较下一开盘价成交与之后某个较保守执行价格下的结果。如果策略只有在 bar 内最有利的时点才能奏效,那就是执行模型出了问题。
- 检查假日、缺失 bar 和市场休市会如何影响“下一交易时段”。下一个日历日可能并非可交易时段。
将信号推迟一个交易时段是一种诊断方法,并非通用的执行模型。低频组合再平衡策略、收盘竞价策略,以及持续交易的加密货币系统,需要采用不同的时钟。关键是让这个时钟清晰可见。
日线数据会让回测失去价值吗?
不会。对于决策周期和持仓周期以天或周衡量的策略,日线数据完全可能合适。它有助于判断一条大致规则是否值得进一步研究。但如果回测声称能精确模拟 bar 无法呈现的成交情况,就会产生误导。
我见过不止一个策略,仅仅因为有人把“收盘时产生信号,收盘时成交”改成“收盘时产生信号,下一开盘时成交”,表现就大幅改善。这个结果或许令人失望,却很有价值:它告诉你,当这个想法真正可以交易时,是否还能成立。把时机约定和策略代码放在一起。否则,下一轮优化可能会悄悄把不可能实现的成交价加回来。
← 全部文章


