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

为什么 JoinQuant 中调用 get_trade_days 传入了 start_date 依然报错?

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

问题描述

get_trade_days报错

trade_days = get_trade_days(start_date=self.lastbi.startday)

raise ParamsError("start_date 参数与 count 参数必须输入一个")

jqdata.exceptions.ParamsError: start_date 参数与 count 参数必须输入一个

明明已经有start_date参数了,为什么还会报错?

解决方案

出现这个报错的最常见原因是:您传入的 self.lastbi.startday 变量在运行到这一行时,它的值是 None

错误原因分析

在 JoinQuant 的 API 中,get_trade_days 的函数签名是:

get_trade_days(start_date=None, end_date=None, count=None)

API 内部会检查参数,要求 start_datecount 这两个参数必须且只能提供其中一个(即不能同时为 None,也不能同时都有值)。

虽然您的代码写了 start_date=self.lastbi.startday,但如果 self.lastbi.startday 尚未被正确赋值(即值为 None),那么实际传给函数的参数就变成了 start_date=None。此时 count 默认也是 None,API 接收到两个 None,就会抛出 ParamsError("start_date 参数与 count 参数必须输入一个") 的异常。

解决与调试方法

1. 打印变量进行排查
在调用 get_trade_days 之前,先打印一下该变量的值和类型,确认它是否为空:

print("当前 startday 的值为:", self.lastbi.startday)
print("当前 startday 的类型为:", type(self.lastbi.startday))

# 如果是 None,说明前面的逻辑没有正确给它赋值
if self.lastbi.startday is None:
    print("警告:startday 为空,请检查 self.lastbi 的初始化逻辑!")
else:
    trade_days = get_trade_days(start_date=self.lastbi.startday)

2. 检查变量赋值逻辑
回溯您的代码,检查 self.lastbi 对象的 startday 属性是在哪里赋值的。可能的情况包括:

  • 对象初始化时忘记赋初始值。
  • 之前的计算逻辑(如寻找上一个笔/线段)未找到符合条件的结果,导致返回了 None
  • 拼写错误或作用域问题导致取到了空值。

3. 增加容错处理
为了防止策略因为这个错误直接中断,可以增加一个默认值或容错判断:

# 假设如果没有 startday,默认取过去 10 个交易日
if self.lastbi.startday:
    trade_days = get_trade_days(start_date=self.lastbi.startday)
else:
    # 容错处理:使用 count 参数代替
    trade_days = get_trade_days(count=10)

总结: 报错并不是因为您没有写 start_date= 这个关键字,而是因为等号右边的实际值为空 (None)。请重点排查 self.lastbi.startday 的赋值逻辑。