🚀 AI 一键生成 joinquant 策略代码

JoinQuant 平台如何查询场内ETF成分股?

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

问题描述

场内ETF成分股没有相应的查询接口吗?

解决方案

在 JoinQuant (聚宽) 平台上,目前确实没有直接提供查询“场内ETF实际持仓成分股”的专属 API(例如没有类似 get_etf_stocks 的函数)。

不过,在量化投研和实盘策略中,我们通常有一个非常标准且准确的替代方案通过查询该 ETF 所跟踪的底层指数的成分股来代替

替代方案:使用 get_index_stocks 查询底层指数成分股

绝大多数场内 ETF 都是被动跟踪某个特定指数的(例如华泰柏瑞沪深300ETF 510300.XSHG 跟踪的是沪深300指数 000300.XSHG)。因此,您可以通过 get_index_stocks 接口获取对应指数的成分股,这与 ETF 的实际成分股基本是一致的。

1. API 介绍

get_index_stocks(index_symbol, date=None)

  • index_symbol: 指数代码(如 '000300.XSHG')。
  • date: 查询日期。如果不填,在回测中默认随着回测日期变化,在研究中默认为今天。

2. Python 代码示例

假设您想获取“华夏上证50ETF (510050.XSHG)”的成分股,您只需要查询它跟踪的“上证50指数 (000016.XSHG)”即可:

# 导入聚宽数据接口
from jqdata import *

def initialize(context):
    # 设定我们要操作的 ETF:华夏上证50ETF
    g.etf = '510050.XSHG'
    # 该 ETF 对应的底层指数:上证50
    g.underlying_index = '000016.XSHG'
    
    run_daily(market_open, time='09:30')

def market_open(context):
    # 获取当前日期下,上证50指数的成分股(即近似该ETF的成分股)
    etf_stocks = get_index_stocks(g.underlying_index, date=context.current_dt)
    
    log.info(f"当前 {g.etf} 跟踪的底层指数成分股数量为: {len(etf_stocks)}")
    log.info(f"前5只成分股代码: {etf_stocks[:5]}")

补充:如何获取场内 ETF 列表?

如果您需要获取市场上所有的场内 ETF 列表,可以使用 get_all_securities 接口:

# 获取所有上市的 ETF 基金信息
etf_df = get_all_securities(types=['etf'], date=None)
print(etf_df.head())

总结:虽然没有直接的 ETF 成分股接口,但利用 get_index_stocks 获取其标的指数成分股是量化回测中最严谨、最常用的做法,且能有效避免未来函数。