问题描述
比如看好某个低估指数,在银行的App中有时会搜索出很多追踪这个指数的基金。如何选择是个问题。这时想通过聚宽平台进行分析。问题是如何根据指数来查询追踪此指数的所有指数基金?
另,对于某个指数基金,如何查询其追踪的指数?
解决方案
在 JoinQuant(聚宽)平台上,查询跟踪特定指数的指数基金,以及反向查询某只基金追踪的指数,主要可以通过两种方式来实现:一种是通过基金名称进行模糊匹配,另一种是通过聚宽的财务/基金数据库(finance.run_query)进行精准查询。
方法一:通过 finance.run_query 精准查询(推荐)
聚宽的 finance 模块提供了完整的基金概况数据表 FUND_MAIN_INFO,其中包含了基金的跟踪标的指数代码(underlying_index_code)和标的指数名称(underlying_index_name)。
1. 根据指数查询追踪该指数的所有基金
假设我们看好“沪深300”指数(通常代码为 000300),想要找出所有跟踪它的基金:
from jqdata import *
# 设定你要查询的指数代码,例如沪深300的代码为 '000300'
index_code = '000300'
# 构造查询语句,筛选标的指数代码匹配的基金
q = query(
finance.FUND_MAIN_INFO.main_code, # 基金主代码
finance.FUND_MAIN_INFO.name, # 基金名称
finance.FUND_MAIN_INFO.underlying_index_code, # 跟踪指数代码
finance.FUND_MAIN_INFO.underlying_index_name # 跟踪指数名称
).filter(
finance.FUND_MAIN_INFO.underlying_index_code == index_code
)
# 执行查询
funds_df = finance.run_query(q)
print("跟踪沪深300的基金有:")
print(funds_df)
2. 根据基金查询其追踪的指数
如果你已知某只指数基金(例如华泰柏瑞沪深300ETF,代码 510300),想知道它跟踪的是什么指数:
from jqdata import *
# 设定你要查询的基金代码
fund_code = '510300'
# 构造查询语句
q = query(
finance.FUND_MAIN_INFO.main_code,
finance.FUND_MAIN_INFO.name,
finance.FUND_MAIN_INFO.underlying_index_code,
finance.FUND_MAIN_INFO.underlying_index_name
).filter(
finance.FUND_MAIN_INFO.main_code == fund_code
)
# 执行查询
index_df = finance.run_query(q)
print(f"基金 {fund_code} 跟踪的指数信息如下:")
print(index_df)
方法二:通过 get_all_securities 模糊匹配
如果你只是想快速找一下场内上市的 ETF 或 LOF,且知道指数的中文名称,可以利用 get_all_securities 获取所有基金列表,然后用 Pandas 对 display_name 进行字符串包含筛选。
from jqdata import *
import pandas as pd
# 获取所有场内基金(包括 etf, lof, fja, fjb 等)以及场外开放式基金(open_fund)
all_funds = get_all_securities(['fund', 'open_fund'])
# 筛选名称中包含“中证500”的基金
zz500_funds = all_funds[all_funds['display_name'].str.contains('中证500')]
print("名称中包含'中证500'的基金列表:")
print(zz500_funds[['display_name', 'type', 'start_date']])
总结与建议
- 精准度:强烈建议使用 方法一(
finance.run_query)。因为有些基金名称中可能不直接包含指数的标准名称,或者包含类似名称但并非纯粹的被动指数基金(如某些增强型基金)。通过underlying_index_code字段筛选是最严谨的。 - 数据限制:使用
finance.run_query时请注意,单次查询最多返回 4000 行数据。如果符合条件的基金非常多,可能需要结合limit()和offset()进行分页获取,不过通常单一指数的跟踪基金数量不会超过这个限制。