问题描述
在返回数据跨日期的时候为什么会出现如我研究文件中的情况呢?
正常情况下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 * 这一关键声明。