问题描述
is_st = jq.get_extras(info='is_st', security_list=s, start_date='2021-01-01', end_date=current_dt,
df=False) 获取股票是否为ST会反馈 'NoneType' object has no attribute '...'的错误,请问是什么原因?
解决方案
在 JoinQuant (聚宽) 平台中使用 get_extras 函数获取股票是否为 ST 状态时,遇到 'NoneType' object has no attribute '...' 的错误,通常是由以下几个常见原因引起的:
1. current_dt 变量未定义或为 None
在您的代码中,end_date=current_dt 使用了 current_dt 变量。如果您是在**投资研究(Jupyter Notebook)**环境中运行这段代码,系统默认是没有 context 对象的,因此 current_dt 如果没有被显式赋值,就会是未定义或 None。这会导致内部日期处理函数报错。
解决方法:
- 如果在回测/模拟交易环境中,请确保使用
context.current_dt。 - 如果在研究环境中,请手动指定一个日期字符串或
datetime对象,例如:
import datetime
current_dt = datetime.datetime.now().strftime('%Y-%m-%d')
# 或者直接传入字符串
is_st = get_extras(info='is_st', security_list=s, start_date='2021-01-01', end_date='2023-10-01', df=False)
2. security_list (变量 s) 为空或为 None
如果传入的股票列表 s 是 None,或者在之前的代码逻辑中获取股票池失败导致 s 没有被正确赋值,get_extras 在遍历或处理这个列表时就会抛出 NoneType 异常。
解决方法:
在调用 get_extras 之前,打印一下 s,确保它是一个有效的股票代码列表(例如 ['000001.XSHE', '600000.XSHG'])。
print(s) # 检查 s 是否为 None 或空列表
if s is not None and len(s) > 0:
is_st = get_extras(info='is_st', security_list=s, start_date='2021-01-01', end_date=current_dt, df=False)
else:
print("股票列表为空!")
3. 模块调用方式错误
在聚宽官方的回测或研究环境中,通常直接调用 get_extras 即可,不需要加 jq. 前缀(除非您在本地使用 JQDataSDK 并且 import jqdatasdk as jq)。如果您在官网环境中写了 jq.get_extras,可能会因为 jq 对象未正确实例化而报错。
解决方法:
在官网环境中直接使用:
is_st = get_extras(info='is_st', security_list=s, start_date='2021-01-01', end_date=context.current_dt, df=False)
总结排查步骤:
- 确认运行环境(回测还是研究)。
- 检查
current_dt是否有正确的时间值。 - 检查
s是否为有效的list。 - 确认 API 的调用前缀是否正确。