3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant (聚宽) 平台上,目前确实没有直接提供查询“场内ETF实际持仓成分股”的专属 API(例如没有类似 get_etf_stocks 的函数)。
不过,在量化投研和实盘策略中,我们通常有一个非常标准且准确的替代方案:通过查询该 ETF 所跟踪的底层指数的成分股来代替。
get_index_stocks 查询底层指数成分股绝大多数场内 ETF 都是被动跟踪某个特定指数的(例如华泰柏瑞沪深300ETF 510300.XSHG 跟踪的是沪深300指数 000300.XSHG)。因此,您可以通过 get_index_stocks 接口获取对应指数的成分股,这与 ETF 的实际成分股基本是一致的。
get_index_stocks(index_symbol, date=None)
假设您想获取“华夏上证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 列表,可以使用 get_all_securities 接口:
# 获取所有上市的 ETF 基金信息
etf_df = get_all_securities(types=['etf'], date=None)
print(etf_df.head())
总结:虽然没有直接的 ETF 成分股接口,但利用 get_index_stocks 获取其标的指数成分股是量化回测中最严谨、最常用的做法,且能有效避免未来函数。