问题描述
解决方案
你的理解基本是正确的!在 JoinQuant(聚宽)平台上,K线数据采用的是后对齐的规则。为了让你更清晰地理解,我们可以从以下几个方面来解析:
1. K线的“后对齐”规则
根据 JoinQuant API 文档的说明:“我们提供的所有行情K线数据为后对齐,标识K线的时间为数据的结束时间。”
这意味着,标识时间为 11:15:00 的这根1分钟K线,它所包含的实际交易数据时间段是 11:14:00 ~ 11:14:59。
- 开盘价 (Open):是
11:14:00到11:14:59这1分钟内的第一笔成交价。 - 收盘价 (Close):是
11:14:00到11:14:59这1分钟内的最后一笔成交价。
2. 策略在 11:15:00 运行时拿到的数据
在分钟级回测或模拟中,策略(如 handle_data 函数)会在每分钟的第一秒运行。当系统时间走到 11:15:00 时,引擎会触发你的策略。
为了绝对避免未来函数,系统在 11:15:00 这一刻,只能给你提供 11:15:00 之前已经完全确定的数据。因此,此时传入的 data 对象,正是标识为 11:15:00 的这根K线(即 11:14:00 ~ 11:14:59 的数据)。
如果你在 11:15:00 触发的逻辑中读取了 data[security].close,你实际拿到的是 11:14:59 这一刻的最新成交价。这也就是你观察到的“用的是15分钟的收盘价”。
3. 关于 09:31 的特殊说明
为了加深理解,可以参考文档中关于开盘第一分钟的说明:
在一分钟K线上,没有 09:30 的K线,第一根K线是从 09:31 开始的。标识为 09:31 的一分钟K线,其数据时间为 09:25:00 ~ 09:30:59,这根K线的开盘价就是 09:25 集合竞价产生的价格。
总结
你的理解是对的。因为系统的基础K线粒度是1分钟,且为了防止未来数据泄露,在 11:15:00 这个时间点,系统只能提供刚刚走完的那1分钟(即结束于11:15:00的K线)的统计数据。你看到的“15分钟的收盘价”,实际上代表的是 11:14:59 那个瞬间的市场切片价格。