问题描述
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 的原因如下:
- 代码类型不匹配:
get_industries(name="sw_l1")返回的 index 是行业代码(例如'801740'代表申万的某个一级行业)。 - API 预期参数:
get_bars函数的security参数期望接收的是标准的交易标的代码(如股票'000001.XSHE'、标准指数'000300.XSHG'或期货合约等)。 - 底层校验失败:当
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(流通市值),然后将每日的个股收盘价按市值权重进行加权求和,从而拟合出真实的行业指数走势。