3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant (聚宽) 量化交易平台上,通过行业板块选股是构建量化策略(如行业轮动、行业中性化策略)的常见需求。聚宽提供了丰富的行业数据接口,支持按申万(SW)、证监会(ZJW)以及聚宽自定义(JQ)行业分类获取对应的成分股。
get_industry_stocks(industry_code, date=None)获取在给定日期指定行业分类下的所有股票代码列表。
industry_code (str): 行业编码(如 'I64' 代表计算机/互联网行业,'801780' 代表申万银行行业)。date (str/date/datetime, 可选): 查询日期。在回测中默认等于 context.current_dt,研究环境中默认是今天。list,包含股票代码的列表(如 ['000001.XSHE', '600000.XSHG'])。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(开始日期)等列。get_industry(security, date=None)查询具体股票或股票列表在指定日期所属的行业分类。
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])
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', [])))
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)
get_industry_stocks 时,建议传入 date 参数(或默认使用 context.current_dt),以确保获取的是当时历史时刻的真实成分股,防止引入退市或后续调整带来的未来数据。set() 集合去重,避免重复下单。