问题描述
分钟级回测,交易代码如下
print ('000001.XSHG')
print (attribute_history('000001.XSHG', 2, '1m', 'close')['close'])
CurrentData = get_current_data()
print (CurrentData['000001.XSHG'].last_price)
attribute_history是否在一分钟开始时就取得了这分钟的close
打印时可以发现CurrentData['000001.XSHG'].last_price与分钟close相同,是否也有未来函数
解决方案
您好!在 JoinQuant(聚宽)平台的分钟级回测中,您提到的代码不存在未来函数。
下面为您详细解析底层的运行机制和数据获取逻辑:
1. 关于 attribute_history 是否有未来函数
没有未来函数。
根据聚宽的 API 文档说明:
“分钟数据不包括当前分钟的数据,没有未来;”
在分钟级回测中,策略函数(如 handle_data 或 run_daily 指定的分钟级任务)是在每分钟的第一秒触发运行的。例如,当策略在 09:31:00 运行时,当前这一分钟(09:31:00 ~ 09:31:59)才刚刚开始,尚未结束。因此,此时调用 attribute_history('000001.XSHG', 2, '1m', 'close') 获取的 2 根 K 线,实际上是 上一分钟及之前 的 K 线(例如 09:30 和 09:29 的 K 线,注:A股早盘第一根1分钟K线标为09:31,代表09:25-09:30的集合竞价及开盘数据)。它绝对不会包含当前正在运行的这一分钟的 close 数据。
2. 关于 get_current_data().last_price 与 close 相同的问题
这也是正常的,不属于未来函数。
get_current_data()['000001.XSHG'].last_price 获取的是当前时刻的最新价。
如前所述,您的策略是在每分钟的第一秒(例如 09:31:00)运行的。在这个极其短暂的瞬间,当前分钟的交易才刚刚开始,盘面上的“最新价”自然就是上一分钟的最后一个成交价(即上一分钟的收盘价 close)。
因此,您打印出来的 last_price 等于 attribute_history 获取到的最后一根 K 线的 close,这在逻辑上是完全自洽的,它反映的是历史已经发生的价格,而不是提前预知了当前分钟结束时的价格。
总结
attribute_history:获取的是上一分钟及之前的历史 K 线,不包含当前分钟。get_current_data().last_price:获取的是当前时刻的最新价,在每分钟初,它等于上一分钟的收盘价。
聚宽的回测引擎在时间对齐上做了严格的处理,只要您正常使用官方提供的 API(且未开启实验性的 avoid_future_data=False 漏洞),在分钟回测中是不会引入未来函数的,请放心使用。