🚀 AI 一键生成 joinquant 策略代码

如何使用 finance.FUND_PORTFOLIO_STOCK 分析基金重仓股?

joinquant | 发布时间: 2025/12/23
以下内容由 EasyQuant 生成。

问题描述

怎么查询公募基金的季度重仓股数据?

解决方案

在聚宽(JoinQuant)平台中,查询公募基金的季度重仓股数据主要通过 finance.run_query 接口配合 公募基金持仓数据表 (finance.FUND_PORTFOLIO_STOCK) 来实现。

以下是具体的查询方法和代码示例。

核心步骤

  1. 使用接口finance.run_query(query_object)
  2. 查询表名finance.FUND_PORTFOLIO_STOCK (公募基金持仓数据)
  3. 关键字段
    • 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()

注意事项

  1. 数据更新延迟:基金的季报、年报发布有法定时间窗口(如一季报通常在4月发布),因此查询最近一个季度的 period_end 时,需确认该基金是否已发布公告(pub_date)。如果在回测中使用,聚宽会自动处理未来函数,只能获取到回测当前日期之前已公告的数据。
  2. 基金代码后缀:场内基金(ETF/LOF)和场外基金在聚宽数据中通常使用 .OF 后缀(Open Fund),例如 510050.OF
  3. 持仓披露规则
    • 季报(Q1, Q3):通常只披露前十大重仓股。
    • 半年报/年报(Q2, Q4):通常披露全部持仓。
    • 因此,使用 limit(10) 是查询季度重仓股最通用的方式。

Q&A

Q: 如何查询某只股票被哪些基金重仓持有?
A: 可以反向查询 finance.FUND_PORTFOLIO_STOCK 表。将 filter 条件修改为 finance.FUND_PORTFOLIO_STOCK.symbol == '股票代码' 即可查出持有该股票的所有基金。

Q: period_endpub_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' 可能没有数据。