3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
您好!导致这个报错的核心原因在于对 get_price 函数中 frequency 参数的含义产生了误解。
在 JoinQuant 的 API 中,frequency 参数代表的是 K线的频率(周期),例如 '1m' 代表1分钟线,'5m' 代表5分钟线,'1d' 代表日线。
在您的代码中,您试图计算 start_date 到 current_dt 之间的总分钟数,并将其赋值给 frequency(例如算出来是 24000,然后拼接成 '24000m')。这相当于告诉系统:“请给我一根周期为 24000 分钟的 K 线”,这显然是不符合逻辑且超出系统支持范围的。
方法一(动态计算,报错):
count_minutes = ((start_date - context.current_dt).days + 1) * 240
在回测中,context.current_dt 通常是随着时间推移不断增加的。如果 context.current_dt 大于 start_date(例如当前是 2020-12-10),那么 start_date - context.current_dt 的 days 会是一个负数。这会导致 count_minutes 变成负数(例如 -2160),拼接出来的 frequency 就是 '-2160m'。API 无法解析负数的频率,因此直接报错。
方法二(固定数值,可能正常或报另一种错):
count_minutes = 100 * 240
拼接出来的 frequency 是 '24000m'。虽然它是正数,但根据 JoinQuant 官方文档,非标准分钟 bar(如 Xm)通常要求 X 必须小于 240(即不能超过一个交易日的总分钟数)。如果系统没有严格拦截,可能会返回空数据或引发底层合成数据的错误。
如果您想获取 start_date 到 context.current_dt 这段时间内的所有分钟线数据,您只需要指定 start_date 和 end_date,并将 frequency 固定设置为 '1m' 即可。系统会自动根据时间范围返回对应数量的数据。
修改后的正确代码如下:
from datetime import datetime
def market_open(context):
log.info('函数运行时间(market_open):' + str(context.current_dt.time()))
start_date = datetime(2020, 12, 1, 9, 0, 0)
# 直接使用 '1m' 获取分钟线,或者 '1d' 获取日线
# 不需要自己计算总分钟数传给 frequency
frequency = '1m'
df_p = get_price(
'000001.XSHE',
start_date=start_date,
end_date=context.current_dt,
frequency=frequency,
fields=['high','close'],
skip_paused=False,
fq='pre'
)
print(df_p)
总结:
start_date 和 end_date 决定了获取数据的时间跨度。frequency 决定了在这个跨度内,每条数据(K线)的时间间隔(如 1分钟、1天)。不要将总数据量传给 frequency。