问题描述
解决方案
get_industry 函数返回的是一个多层嵌套的字典。要提取申万一级行业名称,你需要按照 股票代码 -> 行业标准('sw_l1') -> 字段名('industry_name') 的层级进行访问。
以下是具体的提取方法和代码示例:
1. 数据结构分析
假设你查询的是 '000001.XSHE',返回的字典结构如下:
{
'000001.XSHE': { # 第一层:Key是股票代码
'sw_l1': { # 第二层:Key是行业分类标准(sw_l1代表申万一级)
'industry_code': '801780',
'industry_name': '银行I' # <--- 这是你要的目标
},
'jq_l1': { ... },
...
}
}
2. 代码示例
场景一:查询单只股票
# 获取数据
stock_code = '000001.XSHE'
industry_data = get_industry(stock_code)
# 提取申万一级行业名称
# 注意:即使只查询一只股票,返回的也是以股票代码为Key的字典
try:
sw1_name = industry_data[stock_code]['sw_l1']['industry_name']
print(f"股票 {stock_code} 的申万一级行业是: {sw1_name}")
except KeyError:
print(f"未找到股票 {stock_code} 的申万一级行业数据")
场景二:查询多只股票(批量提取)
如果你传入的是一个股票列表,建议使用循环来提取:
stock_list = ['000001.XSHE', '000002.XSHE', '600519.XSHG']
industry_data = get_industry(stock_list)
for code in stock_list:
# 使用 .get() 方法可以防止某些股票没有行业数据导致报错
stock_info = industry_data.get(code, {})
sw1_info = stock_info.get('sw_l1', {})
industry_name = sw1_info.get('industry_name', '未知行业')
print(f"{code}: {industry_name}")
3. 封装成便捷函数
为了方便在策略中反复调用,你可以定义一个简单的辅助函数:
def get_sw1_name(security):
"""
获取单只股票的申万一级行业名称
"""
res = get_industry(security)
if security in res and 'sw_l1' in res[security]:
return res[security]['sw_l1']['industry_name']
return 'Unknown'
# 使用示例
name = get_sw1_name('000001.XSHE')
print(name)
Q&A
Q: 为什么有时候 get_industry 返回的数据里没有 'sw_l1'?
A: 这种情况通常发生在以下几种场景:
- 新股:刚上市的股票可能尚未被归类。
- 基金或指数:你传入的代码是ETF或指数代码,而非个股。
- 退市股票:某些很久以前退市的股票可能缺失历史行业数据。
- 数据缺失:极少数情况下数据源暂时缺失。
因此,在代码中使用.get()方法或try-except块进行容错处理是一个好习惯。
Q: 如何获取申万二级或三级行业?
A: 只需将代码中的 'sw_l1' 替换为 'sw_l2' (二级) 或 'sw_l3' (三级) 即可。
Q: get_industry 函数的 date 参数有什么用?
A: 行业分类是会随时间调整的(例如申万行业标准在2014年和2021年都有过调整)。如果不填 date,默认返回当前日期的分类;如果填了历史日期,则返回该股票在当时所属的行业分类。