问题描述
解决方案
在聚宽(JoinQuant)平台中,查询公募基金的季度重仓股数据主要通过 finance.run_query 接口配合 公募基金持仓数据表 (finance.FUND_PORTFOLIO_STOCK) 来实现。
以下是具体的查询方法和代码示例。
核心步骤
- 使用接口:
finance.run_query(query_object) - 查询表名:
finance.FUND_PORTFOLIO_STOCK(公募基金持仓数据) - 关键字段:
code: 基金代码(如 '000001.OF')period_end: 报告期截止日(如 '2023-12-31',用于定位特定季度)symbol: 持仓股票代码proportion: 持仓占比(占净值比例)market_value: 持仓市值
代码示例
以下代码展示了如何查询一只特定基金(以华夏上证50ETF 510050.OF 为例)在指定季度末的前十大重仓股。
# -*- coding: utf-8 -*-
from jqdata import *
def query_fund_holdings():
# 设定查询参数
target_fund = '510050.OF' # 基金代码
report_date = '2023-12-31' # 报告期截止日(季度末)
# 构建查询语句
q = query(
finance.FUND_PORTFOLIO_STOCK.code, # 基金代码
finance.FUND_PORTFOLIO_STOCK.name, # 基金名称
finance.FUND_PORTFOLIO_STOCK.period_end, # 报告期截止日
finance.FUND_PORTFOLIO_STOCK.pub_date, # 公告日期
finance.FUND_PORTFOLIO_STOCK.symbol, # 股票代码
finance.FUND_PORTFOLIO_STOCK.symbol_name, # 股票名称
finance.FUND_PORTFOLIO_STOCK.proportion, # 占净值比例(%)
finance.FUND_PORTFOLIO_STOCK.market_value # 持仓市值
).filter(
finance.FUND_PORTFOLIO_STOCK.code == target_fund,
finance.FUND_PORTFOLIO_STOCK.period_end == report_date
).order_by(
# 按持仓占比降序排列,获取重仓股
finance.FUND_PORTFOLIO_STOCK.proportion.desc()
).limit(10) # 获取前10大重仓股
# 执行查询
df = finance.run_query(q)
# 打印结果
if not df.empty:
print(f"基金 {target_fund} 在 {report_date} 的前十大重仓股:")
print(df)
else:
print("未查询到相关数据,请检查基金代码或日期是否正确。")
# 运行查询函数
query_fund_holdings()
注意事项
- 数据更新延迟:基金的季报、年报发布有法定时间窗口(如一季报通常在4月发布),因此查询最近一个季度的
period_end时,需确认该基金是否已发布公告(pub_date)。如果在回测中使用,聚宽会自动处理未来函数,只能获取到回测当前日期之前已公告的数据。 - 基金代码后缀:场内基金(ETF/LOF)和场外基金在聚宽数据中通常使用
.OF后缀(Open Fund),例如510050.OF。 - 持仓披露规则:
- 季报(Q1, Q3):通常只披露前十大重仓股。
- 半年报/年报(Q2, Q4):通常披露全部持仓。
- 因此,使用
limit(10)是查询季度重仓股最通用的方式。
Q&A
Q: 如何查询某只股票被哪些基金重仓持有?
A: 可以反向查询 finance.FUND_PORTFOLIO_STOCK 表。将 filter 条件修改为 finance.FUND_PORTFOLIO_STOCK.symbol == '股票代码' 即可查出持有该股票的所有基金。
Q: period_end 和 pub_date 有什么区别?
A: period_end 是报告期的截止日期(如3月31日、6月30日),代表数据是截至这一天的持仓情况。pub_date 是基金公司实际发布公告的日期。在回测中,为了避免未来函数,系统是根据 pub_date 来决定数据是否可用的。
Q: 查询结果中的 proportion 单位是什么?
A: 单位是百分比(%)。例如值为 5.23,代表该股票持仓市值占基金资产净值的 5.23%。
Q: 为什么有时候查不到最新的季度数据?
A: 基金季报通常在季度结束后的15个工作日内披露。例如,3月31日结束的一季度,数据通常在4月中下旬才会陆续披露完毕。在此之前查询 period_end='2024-03-31' 可能没有数据。