🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant 聚宽 get_price() 函数 frequency 参数报错怎么解决?

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

问题描述

get_price()遇到的问题

为什么count_minutes两种赋值方法一个报错一个正常?
下面是代码:
def market_open(context):
log.info('函数运行时间(market_open):'+str(context.current_dt.time()))

start_date = datetime(2020, 12, 1, 9, 0, 0)
count_minutes = ((start_date - context.current_dt).days + 1) * 240
#count_minutes = 100 * 240
print(type(count_minutes))
frequency = str.format('%dm' % (count_minutes))
print(frequency)
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)

解决方案

您好!导致这个报错的核心原因在于get_price 函数中 frequency 参数的含义产生了误解

1. 核心错误分析

在 JoinQuant 的 API 中,frequency 参数代表的是 K线的频率(周期),例如 '1m' 代表1分钟线,'5m' 代表5分钟线,'1d' 代表日线。

在您的代码中,您试图计算 start_datecurrent_dt 之间的总分钟数,并将其赋值给 frequency(例如算出来是 24000,然后拼接成 '24000m')。这相当于告诉系统:“请给我一根周期为 24000 分钟的 K 线”,这显然是不符合逻辑且超出系统支持范围的。

2. 为什么两种赋值方法表现不同?

  • 方法一(动态计算,报错)
    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_dtdays 会是一个负数。这会导致 count_minutes 变成负数(例如 -2160),拼接出来的 frequency 就是 '-2160m'。API 无法解析负数的频率,因此直接报错。

  • 方法二(固定数值,可能正常或报另一种错)
    count_minutes = 100 * 240
    拼接出来的 frequency'24000m'。虽然它是正数,但根据 JoinQuant 官方文档,非标准分钟 bar(如 Xm)通常要求 X 必须小于 240(即不能超过一个交易日的总分钟数)。如果系统没有严格拦截,可能会返回空数据或引发底层合成数据的错误。

3. 正确的写法

如果您想获取 start_datecontext.current_dt 这段时间内的所有分钟线数据,您只需要指定 start_dateend_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_dateend_date 决定了获取数据的时间跨度
  • frequency 决定了在这个跨度内,每条数据(K线)的时间间隔(如 1分钟、1天)。不要将总数据量传给 frequency