问题描述
使用get_index_weights查询股票权重,结果返回的是空列表,这是怎么回事啊?
解决方案
在 JoinQuant 平台中使用 get_index_weights 函数查询指数成分股权重时,如果遇到返回空数据(实际上该函数正常情况下返回的是 pandas.DataFrame,您看到的可能是空的 DataFrame),通常是由以下几个原因导致的:
1. 该指数在数据库中没有权重数据
虽然聚宽支持近 600 种指数的行情数据,但并非所有指数都提供成分股权重数据。通常,常见的宽基指数(如沪深300 000300.XSHG、中证500 000905.XSHG、上证50 000016.XSHG 等)会有完善的权重数据,而一些冷门指数、行业指数或自定义指数可能没有权重数据。如果查询没有数据的指数,就会返回空结果。
2. 查询的日期过早
get_index_weights 会返回距离查询日期最近的权重信息。如果您传入的 date 参数非常早(例如早于该指数发布或聚宽收录该数据的最早时间),系统可能无法找到任何历史权重数据,从而返回空值。
3. 指数代码格式不正确
请确保传入的 index_id 是标准的带后缀格式。例如,上证指数应为 000001.XSHG,而不是 000001 或 sh000001。虽然格式严重错误时 API 会直接报错,但某些边缘情况可能导致查询不到数据。
4. 数据的更新频率
需要注意的是,指数成分股权重数据每月更新一次,一般在月底或者月初。如果您查询的是当月的某一天,返回的通常是上个月底的最新权重。
排查与解决方法
步骤一:使用常见指数进行测试
您可以先用沪深300指数测试一下代码是否正常:
from jqdata import *
# 查询沪深300在2018-05-09的权重
df = get_index_weights(index_id="000300.XSHG", date="2018-05-09")
print(df)
如果上述代码能正常打印出包含 code, display_name, date, weight 的 DataFrame,说明您的环境和 API 调用方式没问题,问题出在您之前查询的特定指数或日期上。
步骤二:检查日期参数
确保 date 参数格式为 "%Y-%m-%d"(如 "2020-01-01"),或者直接传入 datetime.date 对象。如果不传 date 参数:
- 在回测/模拟环境中,默认为
context.current_dt.date()。 - 在研究环境中,默认为当天的日期
datetime.now().date()。
步骤三:确认指数是否支持
如果您确认代码和日期都没问题,但特定指数依然返回空数据,那大概率是聚宽目前尚未收录该指数的权重数据。这种情况下,您可以考虑使用 get_index_stocks 获取成分股列表,然后采用等权重或根据市值(通过 get_valuation 获取)自行计算市值加权权重作为替代方案。