问题描述
研究环境中使用
def chnname(code):
stockName = get_security_info(code).display_name
print(stockName)
return stockName
会报错:
< ipython-input-1-ca209701c582> in chnname(code)
32 """
33 def chnname(code):
---> 34 stockName = get_security_info(code).display_name
35 print(stockName)
36 return stockName
AttributeError: 'NoneType' object has no attribute 'display_name'
同样的写法在在线策略编辑器里边就可以正常运行,请问有人知道为什么嘛?谢谢(研究环境已经重启过没用)
解决方案
报错原因分析
在 JoinQuant 中,出现 AttributeError: 'NoneType' object has no attribute 'display_name' 的根本原因是 get_security_info(code) 函数没有找到对应的标的信息,从而返回了 None。
为什么在策略编辑器中正常,而在研究环境中报错呢?这通常是因为传入的 code 格式不规范。
JoinQuant 的 API 严格要求股票代码带有市场后缀(例如平安银行必须是 '000001.XSHE',贵州茅台必须是 '600519.XSHG')。如果在研究环境中调用 chnname(code) 时,传入的仅仅是 '000001' 或者 'SZ000001',get_security_info 无法识别,就会返回 None。
解决方案
为了避免因为代码格式不规范导致的报错,JoinQuant 提供了一个非常实用的 API:normalize_code()。它可以将各种常见形式的股票代码(如 '000001', 'SZ000001', '000001.sz')自动转换为聚宽标准格式('000001.XSHE')。
您只需要在调用 get_security_info 之前,先用 normalize_code 处理一下传入的 code 即可。
修改后的代码示例
from jqdata import *
def chnname(code):
# 1. 将传入的 code 标准化为聚宽支持的格式
standard_code = normalize_code(code)
# 2. 获取标的信息
security_info = get_security_info(standard_code)
# 3. 增加容错判断,防止传入完全无效的代码
if security_info is None:
print(f"警告:无法找到代码 {code} 对应的标的信息")
return None
stockName = security_info.display_name
print(stockName)
return stockName
# 测试调用
chnname('000001') # 即使不带后缀也能正常解析为平安银行
chnname('600519.SH') # 也能正常解析为贵州茅台
总结
- 核心问题:传入的股票代码缺少
.XSHE或.XSHG后缀,导致 API 查无此股。 - 最佳实践:在处理外部输入或不确定的股票代码列表时,养成先调用
normalize_code(code)的习惯,可以有效避免此类NoneType报错。