问题描述
{"text":"","hyperlink":"https://www.joinquant.com/user/f7438308ce378fc2894a517b0d2d4e55"}
解决方案
您好!您的观察非常敏锐,这涉及到 JoinQuant 平台在回测环境下的运行机制和撮合逻辑。简单来说,市价单确实是瞬间撮合的,但使用的价格是“最新价”(即上一分钟的收盘价);而限价单如果未能立即成交,则会在当前分钟结束时进行撮合。
以下是详细的机制解析:
1. 回测的运行时间与数据获取(以分钟频率为例)
在分钟级别的回测中,策略(如 handle_data)是在每分钟的第一秒运行的,而此时您获取到的 data 是上一分钟的分钟数据。
- 例如:在
09:31:00运行策略时,您获取到的data是09:30:00 ~ 09:30:59这一分钟的 K 线数据。
2. 市价单的撮合逻辑
当您在 handle_data 中下达市价单时,系统会立即尝试撮合。
- 成交价格:
最新价 + 滑点。 - 什么是最新价? 在开盘时刻运行,最新价格为开盘价;在其他情况下,最新价为上一分钟的最后一个价格(即您在
data中看到的上一分钟的收盘价)。 - 结论:市价单是瞬间成交的,但因为策略在
09:31:00运行时只能看到09:30:59的价格,所以系统会以09:30:59的价格(加减滑点)为您撮合成交。这可能让您产生了“价格延迟了一分钟”的错觉,实际上这是为了避免未来函数,使用您下单时刻所能看到的最新真实价格。
3. 限价单的撮合逻辑
当您下达限价单时,撮合分为两步:
- 下单时立即撮合:系统首先尝试以“最新价 + 滑点”进行撮合。如果您的限价满足条件(买单限价 >= 最新价+滑点,卖单限价 <= 最新价-滑点),则立即成交。
- 挂单按分钟 Bar 撮合:如果未能立即完全成交,剩余部分会挂单。挂单的限价单会在本分钟 Bar 结束时(例如
09:31:59)按照本分钟的 Bar 信息(最高价、最低价)尝试撮合。如果满足条件,则以您的委托价成交。
- 结论:对于挂单的限价单,确实是在当前分钟结束时才进行撮合的,这符合真实的交易所撮合逻辑(等待价格触及您的限价)。
总结
您感觉到的“延迟”,实际上是平台为了避免未来函数和模拟真实交易环境而设计的机制:
- 市价单:瞬间成交,价格取自您下单时能看到的最新价格(上一分钟收盘价)。
- 限价单:未立即成交的部分,会在当前分钟走完后,根据当前分钟的最高/最低价判断是否成交。
如果您希望更精细的撮合,可以考虑使用 Tick 级别回测,在 Tick 频率下,策略会在每个 Tick 到来时运行,撮合也会按照 Tick 数据进行,颗粒度会细致得多。