🚀 AI 一键生成 joinquant 策略代码
立即体验

joinquant 平台如何按行业板块选股?(获取证监会、申万与聚宽行业成分股方法)

joinquant | 发布时间: 2026/7/26
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 行业板块选股:按证监会、申万与聚宽行业获取成分股

Question: 如何在 joinquant 中使用 get_industry_stocks 获取指定行业分类下的所有股票列表?

解决方案

joinquant 行业板块选股:按证监会、申万与聚宽行业获取成分股

在 JoinQuant (聚宽) 量化交易平台上,通过行业板块选股是构建量化策略(如行业轮动、行业中性化策略)的常见需求。聚宽提供了丰富的行业数据接口,支持按申万(SW)、证监会(ZJW)以及聚宽自定义(JQ)行业分类获取对应的成分股。


核心 API 介绍

1. get_industry_stocks(industry_code, date=None)

获取在给定日期指定行业分类下的所有股票代码列表。

  • 参数说明
    • industry_code (str): 行业编码(如 'I64' 代表计算机/互联网行业,'801780' 代表申万银行行业)。
    • date (str/date/datetime, 可选): 查询日期。在回测中默认等于 context.current_dt,研究环境中默认是今天。
  • 返回值list,包含股票代码的列表(如 ['000001.XSHE', '600000.XSHG'])。

2. get_industries(name, date=None)

获取聚宽支持的行业分类列表及其代码。

  • 参数说明
    • name (str): 行业分类标准:
      • 'sw_l1': 申万一级行业
      • 'sw_l2': 申万二级行业
      • 'sw_l3': 申万三级行业
      • 'jq_l1': 聚宽一级行业
      • 'jq_l2': 聚宽二级行业
      • 'zjw': 证监会行业
    • date (str/date, 可选): 查询日期。
  • 返回值pandas.DataFrame,索引为行业代码,包含 name(行业名称)和 start_date(开始日期)等列。

3. get_industry(security, date=None)

查询具体股票或股票列表在指定日期所属的行业分类。


使用示例与代码

示例 1:获取特定行业成分股

from jqdata import *

# 获取证监会行业信息传输、软件和信息技术服务业(I64)的成分股
stocks_i64 = get_industry_stocks('I64')
print("I64 行业成分股数量:", len(stocks_i64))

# 获取申万一级行业-银行(801780)在指定日期的成分股
bank_stocks = get_industry_stocks('801780', date='2023-01-01')
print("银行行业成分股:", bank_stocks[:5])

示例 2:查询所有申万一级行业并提取股票池

from jqdata import *

# 获取所有申万一级行业列表
sw_l1_industries = get_industries(name='sw_l1')
print(sw_l1_industries.head())

# 遍历获取每个行业的成分股字典
industry_stocks_dict = {}
for code in sw_l1_industries.index:
    industry_name = sw_l1_industries.loc[code, 'name']
    stocks = get_industry_stocks(code)
    industry_stocks_dict[industry_name] = stocks

print("电子行业股票数:", len(industry_stocks_dict.get('电子I', [])))

示例 3:在 JoinQuant 策略中应用行业选股

import jqdata

def initialize(context):
    # 开启动态复权模式
    set_option('use_real_price', True)
    set_benchmark('000300.XSHG')
    
    # 设定定时运行任务,每月初调仓
    run_monthly(trade, monthday=1, time='9:30')

def trade(context):
    # 选出证监会行业'I64'和'I65'板块中的股票
    tech_stocks = get_industry_stocks('I64') + get_industry_stocks('I65')
    # 去重
    tech_stocks = list(set(tech_stocks))
    
    # 获取过滤停牌后的前5只股票进行买入
    current_data = get_current_data()
    valid_stocks = [s for s in tech_stocks if not current_data[s].paused][:5]
    
    # 平仓不在目标池中的持仓
    for stock in context.portfolio.positions:
        if stock not in valid_stocks:
            order_target(stock, 0)
            
    # 买入目标股票
    if valid_stocks:
        cash_per_stock = context.portfolio.available_cash / len(valid_stocks)
        for stock in valid_stocks:
            order_value(stock, cash_per_stock)

注意事项

  1. 避免未来函数:在历史回测中调用 get_industry_stocks 时,建议传入 date 参数(或默认使用 context.current_dt),以确保获取的是当时历史时刻的真实成分股,防止引入退市或后续调整带来的未来数据。
  2. 行业分类变更:申万行业分类在2014年及以后经历过调整(如增加、剔除部分行业),查询历史早期数据时需注意行业代码的生效时间。
  3. 多行业去重:如果同时获取多个行业的成分股并合并为股票池,请使用 set() 集合去重,避免重复下单。