🚀 AI 一键生成 joinquant 策略代码

JoinQuant 进阶:如何利用 finance.run_query 获取十大流通股东信息并用于选股?

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

问题描述

怎样获取上市公司的十大股东持仓数据?

解决方案

在 JoinQuant 聚宽平台中,获取上市公司十大股东持仓数据需要使用 finance.run_query 函数来查询金融数据库中的 finance.STK_SHAREHOLDER_TOP10 表。

以下是具体的获取方法和代码示例。

核心步骤

  1. 调用函数:使用 finance.run_query(query_object)
  2. 查询表对象:使用 finance.STK_SHAREHOLDER_TOP10(十大股东数据表)。
  3. 过滤条件:通常需要通过 .filter() 指定股票代码(code)和发布日期(pub_date)或报告期(end_date)。

代码示例

以下代码展示了如何查询“平安银行(000001.XSHE)”在指定时间范围内的十大股东持仓情况:

# -*- coding: utf-8 -*-
from jqdata import *

def initialize(context):
    # 设定要查询的股票代码
    stock_code = '000001.XSHE'
    
    # 构建查询语句
    # 查询 finance.STK_SHAREHOLDER_TOP10 表
    q = query(
        finance.STK_SHAREHOLDER_TOP10
    ).filter(
        # 过滤股票代码
        finance.STK_SHAREHOLDER_TOP10.code == stock_code,
        # 过滤发布日期,例如查询2023年以来的数据
        finance.STK_SHAREHOLDER_TOP10.pub_date >= '2023-01-01'
    ).order_by(
        # 按发布日期降序排列
        finance.STK_SHAREHOLDER_TOP10.pub_date.desc()
    )
    
    # 执行查询
    df = finance.run_query(q)
    
    # 打印结果
    print(f"股票 {stock_code} 的十大股东数据:")
    print(df.head(10)) # 打印前10条

    # 如果需要获取十大流通股东,只需将表名改为 finance.STK_SHAREHOLDER_FLOATING_TOP10
    q_floating = query(
        finance.STK_SHAREHOLDER_FLOATING_TOP10
    ).filter(
        finance.STK_SHAREHOLDER_FLOATING_TOP10.code == stock_code,
        finance.STK_SHAREHOLDER_FLOATING_TOP10.pub_date >= '2023-01-01'
    ).order_by(
        finance.STK_SHAREHOLDER_FLOATING_TOP10.pub_date.desc()
    )
    
    df_floating = finance.run_query(q_floating)
    print(f"股票 {stock_code} 的十大流通股东数据:")
    print(df_floating.head(10))

返回数据字段说明

查询结果 df 为 DataFrame 格式,主要包含以下字段:

字段名 类型 含义
company_id int 公司ID
code varchar 股票代码
end_date date 截止日期(报告期,如 2023-03-31)
pub_date date 公告日期(实际发布数据的日期)
shareholder_rank int 股东排名(1-10)
shareholder_name varchar 股东名称
share_number float 持股数量(股)
share_ratio float 持股比例(%)
share_type varchar 股份性质(如:流通A股)
change_reason varchar 变动原因

注意事项

  1. 数据更新频率:股东数据通常随季报、半年报和年报发布,因此数据不是每日更新的,而是按报告期更新。
  2. 十大流通股东:如果您需要“十大流通股东”数据,请查询 finance.STK_SHAREHOLDER_FLOATING_TOP10 表,用法与上述代码完全一致。
  3. 查询限制finance.run_query 单次查询最多返回 4000 行数据。如果查询多只股票的历史数据,建议分批次查询或增加更严格的日期过滤条件。

Q&A

Q: 如何获取十大流通股东的数据?
A: 将查询对象从 finance.STK_SHAREHOLDER_TOP10 替换为 finance.STK_SHAREHOLDER_FLOATING_TOP10 即可,其他过滤和排序逻辑相同。

Q: 为什么查询到的数据没有当天的?
A: 股东持仓数据来源于上市公司定期报告(季报/年报),存在滞后性。例如,一季报(截止3月31日的数据)通常在4月份发布。您只能获取到已公告的数据。

Q: 可以同时查询多只股票的股东数据吗?
A: 可以。在 .filter() 中使用 .in_ 操作符。例如:finance.STK_SHAREHOLDER_TOP10.code.in_(['000001.XSHE', '600519.XSHG'])。但要注意单次返回行数限制(4000行)。