问题描述
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_date 和 count 这两个参数必须且只能提供其中一个(即不能同时为 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 的赋值逻辑。