🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant平台查询ETF成分股及权重的正确方法

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

问题描述

关于ETF成份股的问题

求问社区里大佬们,我想查看某支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_weightsget_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)

总结:
对于量化回测和日常跟踪,强烈推荐使用方法一(直接查询底层指数),因为指数的权重数据更新更及时(每月更新),而基金的真实持仓数据存在财报披露的滞后性(每季度更新,且有披露期延迟)。