🚀 AI 一键生成 joinquant 策略代码

为什么在 JoinQuant 中使用 get_bars 获取申万一级行业行情会报错?

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

问题描述

get_bars函数能用于申万一级行业指数行情么?

stock_list = list(get_industries(name="sw_l1",date=today).index)

df=get_bars(stock_list, count=42, unit='1w',
fields=['close'],include_now=True, end_dt=None,
fq_ref_date=datetime.datetime.now(),df=True)['close'].unstack().T

为何以上程序报错如下?

ParamsError Traceback (most recent call last)
< ipython-input-20-805016eb998d> in < module>
28 close_week = get_bars(stock_list, count=42, unit='1w',
29 fields=['close'],include_now=True, end_dt=None,
---> 30 fq_ref_date=datetime.datetime.now(),df=True)['close'].unstack().T
31
32

/opt/conda/lib/python3.6/site-packages/jqresearch/api.py in get_bars(security, count, unit, fields, include_now, end_dt, fq_ref_date, df)
184 end_dt=end_dt,
185 fq_ref_date=fq_ref_date,
--> 186 df=df)
187
188

/opt/conda/lib/python3.6/site-packages/jqdata/apis/data.py in get_bars(security, count, unit, fields, include_now, end_dt, fq_ref_date, df)
1168 sec = get_security_info(s)
1169 if sec is None:
-> 1170 raise ParamsError("找不到标的%s" % str(s))
1171 secs.append(sec)
1172

ParamsError: 找不到标的801740

解决方案

核心解答

get_bars 函数不能直接用于获取申万一级行业指数的行情数据。

根据 JoinQuant 官方 API 文档的说明:“目前不支持行业的行情数据,及指数的PE/股息率”

报错原因分析

在您的代码中,报错 ParamsError: 找不到标的801740 的原因如下:

  1. 代码类型不匹配get_industries(name="sw_l1") 返回的 index 是行业代码(例如 '801740' 代表申万的某个一级行业)。
  2. API 预期参数get_bars 函数的 security 参数期望接收的是标准的交易标的代码(如股票 '000001.XSHE'、标准指数 '000300.XSHG' 或期货合约等)。
  3. 底层校验失败:当 get_bars 接收到 '801740' 时,它会调用底层接口去查询该标的的信息,由于聚宽数据库中并没有将行业代码作为可直接查询 K 线行情的标的,因此抛出 ParamsError: 找不到标的 的异常。

替代解决方案

既然聚宽官方不直接提供行业指数的 OHLCV(开高低收量)行情数据,如果您需要分析某个行业的走势,可以通过获取该行业的所有成分股,然后自行加权计算行业指数来实现。

以下是计算行业指数(以等权重为例)的替代方案代码示例:

from jqdata import *
import pandas as pd
import datetime

# 1. 获取申万一级行业列表
sw_l1_industries = get_industries(name="sw_l1").index.tolist()

# 假设我们只计算第一个行业 '801180' (房地产I) 的走势
industry_code = sw_l1_industries[0]

# 2. 获取该行业下的所有成分股
stocks = get_industry_stocks(industry_code)

# 3. 获取这些成分股的行情数据
# 注意:为了避免停牌股影响,建议获取后进行数据清洗
df_close = get_bars(stocks, count=42, unit='1w', 
                    fields=['close'], include_now=True, 
                    df=True)['close'].unstack().T

# 4. 自行合成行业指数(这里以简单的等权重平均为例)
# 实际应用中,您可能需要根据市值 (market_cap) 进行加权平均
industry_index_close = df_close.mean(axis=1)

print(f"行业 {industry_code} 的等权重收盘价走势:")
print(industry_index_close)

进阶建议
如果您需要更精确的行业指数(如市值加权),可以结合 get_valuation 函数获取成分股的 market_cap(总市值)或 circulating_market_cap(流通市值),然后将每日的个股收盘价按市值权重进行加权求和,从而拟合出真实的行业指数走势。