问题描述
求问社区里大佬们,我想查看某支ETF的成份股和成份股的占比。比如上证50ETF(510050),但是用
get_index_weights(index_id="510050.XSHG", date="2021-11-01")
会返回空列表,但是上证50 (000016)指数是可以查看到的,比如
get_index_weights(index_id="510050.XSHG", date="2021-11-01")
就可以正常返回上证50的各成份股及参数。
所以是不是ETF基金需要使用专门的查询方式来查询?
解决方案
在 JoinQuant(聚宽)平台中,get_index_weights 和 get_index_stocks 这类函数是专门为**指数(Index)设计的,而不是为基金(Fund/ETF)**设计的。
因此,当您传入 ETF 基金代码(如 510050.XSHG)时,系统无法识别为指数,从而返回空列表。正确的做法是查询该 ETF 所跟踪的标的指数。
解决方法一:查询 ETF 对应的标的指数(推荐)
ETF 基金是被动跟踪某一特定指数的,其成分股和权重与标的指数基本一致(且指数权重数据每月更新,频率比基金财报高得多)。
以上证50ETF(510050.XSHG)为例,它跟踪的是上证50指数(000016.XSHG)。您只需要将代码替换为对应的指数代码即可:
# 查询上证50指数的成分股及权重,以此作为上证50ETF的成分股参考
weights_df = get_index_weights(index_id="000016.XSHG", date="2021-11-01")
print(weights_df)
解决方法二:查询基金真实的季度持仓(财报数据)
如果您严格需要查询该 ETF 基金在某季度末真实披露的持仓情况(包含未完全拟合的部分或现金留存),您需要使用聚宽的财务/基金数据库进行查询。基金的持仓明细通常只在季度报告中披露。
您可以通过 finance.run_query 查询基金持仓表(如 finance.FUND_PORTFOLIO):
from jqdata import *
# 查询510050在2021年三季报(2021-09-30)的前十大持仓
q = query(finance.FUND_PORTFOLIO).filter(
finance.FUND_PORTFOLIO.code == '510050.XSHG',
finance.FUND_PORTFOLIO.pub_date >= '2021-10-01' # 财报发布日期
).limit(10)
df = finance.run_query(q)
print(df)
总结:
对于量化回测和日常跟踪,强烈推荐使用方法一(直接查询底层指数),因为指数的权重数据更新更及时(每月更新),而基金的真实持仓数据存在财报披露的滞后性(每季度更新,且有披露期延迟)。