🚀 AI 一键生成 joinquant 策略代码

深入理解JoinQuant KD指标函数:check_date与unit的计算逻辑

joinquant | 发布时间: 2026/5/27
以下内容由 EasyQuant 生成。

问题描述

指标函数KD中check_date和unit的关系

不太理解KD函数中计算k/d指标的逻辑,即bar的如何确认范围。

1、当check_data为datetime.date类型时,unit周期分别为: '1m', '5m', '15m', '30m', '60m', '120m', '1d', '1w', '1M'. '1w' ,k/d指标的bar如何计算?

2、当check_data为datetime.datetime类型时,unit周期分别为: '1m', '5m', '15m', '30m', '60m', '120m', '1d', '1w', '1M'. '1w' ,k/d指标的bar如何计算?

解决方案

在JoinQuant(聚宽)平台的量化交易中,技术指标函数(如KDMACD等)底层通常依赖于历史行情数据获取API(如get_barsget_price)。理解check_date(查询时间)和unit(K线周期)的关系,核心在于理解时间截断K线聚合的逻辑。

以下是针对您提出的两种情况的详细解答:

1. 当 check_datedatetime.date 类型时

当传入的是日期类型(如 2023-10-10),系统在底层处理时,会自动将其转换为该日期的零点,即 2023-10-10 00:00:00

  • 对于分钟级别周期 ('1m', '5m', '15m', '30m', '60m', '120m')
    由于时间被视为当天的 00:00:00,此时当天的交易尚未开始。因此,系统获取的最后一个分钟bar是前一个交易日的最后一根K线(例如 15:00:00 的K线)。KD指标将基于前一个交易日及之前的分钟K线数据进行计算。
  • 对于日/周/月级别周期 ('1d', '1w', '1M')
    在日线及以上级别,时间部分(时分秒)通常被忽略。系统会获取**截止到该日期(包含该日)**的日线、周线或月线数据。如果该日期是交易日,KD指标将包含该日的日线数据进行计算(注意:如果在盘中调用且未收盘,可能会使用截至当时的快照数据合成日线,具体取决于底层是否开启了include_now,但在技术指标库中通常指代已完成的日线或包含当天的最新数据)。

2. 当 check_datedatetime.datetime 类型时

当传入的是包含具体时间的类型(如 2023-10-10 14:30:00),系统会严格按照该时间戳进行截断。

  • 对于分钟级别周期 ('1m', '5m', '15m', '30m', '60m', '120m')
    系统会获取严格截止到该具体时间的分钟bar。例如,unit='5m'check_date='2023-10-10 14:30:00',那么获取的最后一根5分钟K线就是 14:25:00-14:30:00 这一根。KD指标将基于这根K线及其之前的N根5分钟K线来计算。
  • 对于日/周/月级别周期 ('1d', '1w', '1M')
    由于日线及以上周期的最小单位是“天”,具体的时分秒(如 14:30:00)在划分bar时失去了精确对齐的意义。系统通常会将其等效为该日期当天的日线。获取的最后一根bar是该时间点所在当天的日线/周线/月线(如果是盘中时间,通常是利用当天的开盘价、最高价、最低价和截至该时间的最新价合成的“未完成”的日线bar)。KD指标将基于这根包含当天最新行情的日线及其之前的日线进行计算。

总结与建议

  • 分钟级策略:强烈建议使用 datetime.datetime 类型,并精确到分钟,这样可以确保KD指标计算的是你期望的那个分钟截面的状态。
  • 日线级策略:使用 datetime.datedatetime.datetime 均可,但要注意如果在盘前(如 09:00)调用,获取的日线数据实际上是截至昨天的;如果在盘后调用,则是包含今天的。
  • 底层逻辑映射:你可以将技术指标的 check_dateunit 想象成直接传递给 get_bars(end_dt=check_date, unit=unit)。理解了 get_bars 的切片方式,就能完全掌握指标函数中 bar 的确认范围。