问题描述
解决方案
在 JoinQuant 聚宽平台中,批量查询一组股票所属的行业分类主要使用 get_industry 函数。该函数支持传入一个股票代码列表,并返回这些股票在不同行业标准(如申万、聚宽、证监会)下的分类信息。
以下是具体的实现方法和代码示例。
核心函数说明
get_industry(security, date=None)
- security: 标的代码列表,例如
['000001.XSHE', '600519.XSHG']。 - date: 查询日期。默认为 None(回测中为当前回测日期,研究中为最新日期)。如果需要查询历史上的行业分类(因为行业分类可能会变更),可以指定具体日期。
- 返回值: 一个字典(Dict),Key 是股票代码,Value 是包含各行业分类信息的字典。
代码实现
以下代码展示了如何批量查询股票列表,并提取出“申万一级行业”和“聚宽一级行业”名称。
# -*- coding: utf-8 -*-
from jqdata import *
def get_batch_industries():
# 1. 定义需要查询的股票列表
security_list = [
'000001.XSHE', # 平安银行
'600519.XSHG', # 贵州茅台
'000002.XSHE', # 万科A
'300750.XSHE' # 宁德时代
]
# 2. 调用 get_industry 函数
# date=None 默认获取当前日期的行业分类
results = get_industry(security=security_list, date=None)
# 3. 遍历并打印结果
print(f"{'股票代码':<15} | {'申万一级行业':<15} | {'聚宽一级行业':<15}")
print("-" * 50)
for stock in security_list:
# 获取该股票的行业数据
ind_data = results.get(stock)
if ind_data:
# 提取申万一级行业名称 (sw_l1)
sw_name = ind_data.get('sw_l1', {}).get('industry_name', '无数据')
# 提取聚宽一级行业名称 (jq_l1)
jq_name = ind_data.get('jq_l1', {}).get('industry_name', '无数据')
print(f"{stock:<15} | {sw_name:<15} | {jq_name:<15}")
else:
print(f"{stock:<15} | 数据缺失")
# 在研究环境中直接运行,或在回测的 initialize 中调用
get_batch_industries()
返回数据结构详解
get_industry 返回的字典结构如下所示,包含多种分类标准:
- sw_l1 / sw_l2 / sw_l3: 申万一、二、三级行业。
- jq_l1 / jq_l2: 聚宽一、二级行业。
- zjw: 证监会行业分类。
单只股票的返回值示例:
{
'000001.XSHE': {
'sw_l1': {'industry_code': '801780', 'industry_name': '银行I'},
'sw_l2': {'industry_code': '801192', 'industry_name': '银行II'},
'jq_l1': {'industry_code': 'HY007', 'industry_name': '金融指数'},
'zjw': {'industry_code': 'J66', 'industry_name': '货币金融服务'}
# ... 其他层级
}
}
Q&A
Q: get_industry 函数支持查询历史日期的行业分类吗?
A: 支持。通过设置 date 参数(例如 date='2018-06-01'),可以获取该日期当时生效的行业分类。这对于回测非常重要,因为股票的行业归属可能会随时间发生变更。
Q: 如果传入的股票代码已经退市,还能查到行业吗?
A: 可以。只要该股票在指定的 date 日期是上市状态或有历史数据记录,通常可以查到当时的行业分类。如果 date 设为最新日期查询已退市很久的股票,可能会返回 None 或空数据。
Q: 如何获取系统中所有支持的行业列表?
A: 可以使用 get_industries(name='sw_l1') 函数来获取所有申万一级行业的代码和名称列表,参数 name 支持 sw_l1, jq_l1, zjw 等。
Q: 为什么有时候查询结果中某些行业标准(如 sw_l3)是空的?
A: 并非所有股票都有细分的行业分类,或者某些行业标准(如申万)在特定时期进行了调整。此外,新上市的股票可能需要几天时间才会更新行业分类数据。建议在代码中加入 .get({}, '无数据') 这样的容错处理。