🚀 AI 一键生成 joinquant 策略代码

JoinQuant 平台 get_bars 获取分钟数据跨日期异常分析与解决

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

问题描述

get_bars 数据问题

在返回数据跨日期的时候为什么会出现如我研究文件中的情况呢?

正常情况下unit=5m,count=3,end_date=2023-07-20返回的数
据起始时间应该在2023-07-19 14:50:00,但实际返回多天的数据记录的?是我哪里搞错了吗?

另外研究环境运行后会出现如下报错(引用研究没有显示)

解决方案

您好!针对您在 JoinQuant (聚宽) 平台使用 get_bars 函数时遇到的跨日期数据异常及研究环境报错问题,主要原因通常与时间参数的默认补全机制以及参数传递方式有关。以下是详细的排查与解决指南:

1. 为什么会返回多天的数据记录?

根据您的描述,您期望获取 unit='5m', count=3, end_dt='2023-07-20' 的数据。理论上,这确实应该返回 2023-07-19 收盘前的最后 3 根 5 分钟 K 线(即 14:50, 14:55, 15:00)。如果实际返回了多天的数据,通常有以下几种可能:

  • 参数传递位置错误(最常见)get_bars 的默认 unit'1d'(天)。如果您在调用时没有使用关键字传参(例如直接写 get_bars('000001.XSHE', 3, '2023-07-20')),Python 会将 '2023-07-20' 传给 unit 参数,导致解析混乱,或者如果您漏掉了 unit,它会默认按天 (1d) 返回过去 3 天的数据。
  • end_dt 的时间补全机制:当您传入 end_dt='2023-07-20'(仅有日期没有时间)时,系统会自动将其补全为 '2023-07-20 00:00:00'。此时往前推 3 个 5 分钟 Bar,确实是前一个交易日的尾盘。但如果返回了多天,请务必检查 unit 是否成功被识别为 '5m'

正确的调用方式应严格使用关键字传参:

from jqdata import *

# 明确指定 unit 和 end_dt
data = get_bars('000001.XSHE', count=3, unit='5m', fields=['date', 'open', 'close'], end_dt='2023-07-20 09:30:00', df=True)
print(data)

2. 研究环境运行报错排查

虽然您没有贴出具体的报错信息,但在聚宽研究环境中使用 get_bars 最常遇到以下几种报错:

  • NameError: name 'get_bars' is not defined
    • 原因:研究环境中没有自动导入聚宽的 API 库。
    • 解决:在代码最上方添加 from jqdata import *
  • AttributeError / TypeError (与 DataFrame 相关)
    • 原因:当您传入多个股票代码(如 ['000001.XSHE', '000002.XSHE'])且设置 df=True 时,get_bars 返回的是一个 MultiIndex 的 pandas DataFrame。如果您尝试用单只股票的 DataFrame 处理方式去操作它,就会报错。
    • 解决:多标的获取时,建议设置 df=False(返回 dict),或者熟悉 MultiIndex 的切片操作。
  • ValueError: end_dt format error
    • 原因end_dt 传入了不支持的格式。
    • 解决:确保 end_dt 是标准的字符串(如 '2023-07-20 15:00:00')或 datetime.datetime 对象。

3. 总结与建议

为了精准获取您想要的分钟数据,建议在传入 end_dt带上具体的时分秒,并且所有可选参数都使用关键字指定。例如,如果您想获取 7 月 20 日开盘前的数据,可以这样写:

import datetime
from jqdata import *

# 获取 2023-07-20 09:30:00 之前的 3 根 5 分钟 K 线
bars = get_bars(
    security='000001.XSHE', 
    count=3, 
    unit='5m', 
    fields=['date', 'open', 'close'], 
    include_now=False, 
    end_dt='2023-07-20 09:30:00', 
    df=True
)
print(bars)

如果报错依然存在,请检查是否在研究环境中遗漏了 from jqdata import * 这一关键声明。