问题描述
解决方案
在 JoinQuant 聚宽平台中,获取上市公司十大股东持仓数据需要使用 finance.run_query 函数来查询金融数据库中的 finance.STK_SHAREHOLDER_TOP10 表。
以下是具体的获取方法和代码示例。
核心步骤
- 调用函数:使用
finance.run_query(query_object)。 - 查询表对象:使用
finance.STK_SHAREHOLDER_TOP10(十大股东数据表)。 - 过滤条件:通常需要通过
.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 | 变动原因 |
注意事项
- 数据更新频率:股东数据通常随季报、半年报和年报发布,因此数据不是每日更新的,而是按报告期更新。
- 十大流通股东:如果您需要“十大流通股东”数据,请查询
finance.STK_SHAREHOLDER_FLOATING_TOP10表,用法与上述代码完全一致。 - 查询限制:
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行)。