指标函数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(聚宽)平台的量化交易中,技术指标函数(如KD、MACD等)底层通常依赖于历史行情数据获取API(如get_bars或get_price)。理解check_date(查询时间)和unit(K线周期)的关系,核心在于理解时间截断和K线聚合的逻辑。
以下是针对您提出的两种情况的详细解答:
1. 当 check_date 为 datetime.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_date 为 datetime.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.date或datetime.datetime均可,但要注意如果在盘前(如09:00)调用,获取的日线数据实际上是截至昨天的;如果在盘后调用,则是包含今天的。 - 底层逻辑映射:你可以将技术指标的
check_date和unit想象成直接传递给get_bars(end_dt=check_date, unit=unit)。理解了get_bars的切片方式,就能完全掌握指标函数中 bar 的确认范围。