🚀 AI 一键生成 qmt 策略代码

QMT 选股策略:如何获取并分析十大股东持仓数据?

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

问题描述

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

解决方案

在 QMT 平台中,获取上市公司历史十大股东持仓数据主要使用 ContextInfo.get_top10_share_holder 接口。

该接口可以获取指定时间段内的十大股东(总股本)或十大流通股东(流通股本)的详细持仓情况。

1. 核心函数说明

函数名: ContextInfo.get_top10_share_holder(stock_list, data_name, start_time, end_time)

参数说明:

  • stock_list (list): 股票代码列表,例如 ['600000.SH', '000001.SZ']
  • data_name (string): 数据类型,可选值:
    • 'holder': 十大股东
    • 'flow_holder': 十大流通股东
  • start_time (string): 开始时间,格式为 'YYYYMMDD',例如 '20220101'
  • end_time (string): 结束时间,格式为 'YYYYMMDD',例如 '20230101'

返回值:
返回的数据通常是 pandas.DataFramepandas.Panel(取决于查询的股票数量和时间跨度),包含以下字段:

  • holdName: 股东名称
  • holdNum: 持股数量
  • holdRatio: 持股比例
  • changReason: 变动原因
  • stockType: 股份性质
  • rank: 持股排名
  • status: 持股状态
  • changNum: 增减数量
  • changeRatio: 增减比例

2. 代码示例

以下代码展示了如何在策略初始化时获取“平安银行(000001.SZ)”在指定年份内的历史十大股东数据。

# -*- coding: gbk -*-

def init(ContextInfo):
    # 1. 设置要查询的股票代码
    stock_code = '000001.SZ'
    stock_list = [stock_code]
    
    # 2. 设置查询的时间范围 (格式 YYYYMMDD)
    start_date = '20220101'
    end_date = '20230101'
    
    # 3. 选择数据类型
    # 'holder' 代表十大股东
    # 'flow_holder' 代表十大流通股东
    data_type = 'holder' 
    
    print(f"正在获取 {stock_code} 从 {start_date} 到 {end_date} 的{data_type}数据...")
    
    # 4. 调用接口获取数据
    # 注意:该函数返回的数据结构可能是 DataFrame 或 Panel,取决于查询维度
    result = ContextInfo.get_top10_share_holder(stock_list, data_type, start_date, end_date)
    
    # 5. 输出结果
    # 如果结果不为空,打印数据
    if result is not None and len(result) > 0:
        print("获取成功,数据如下:")
        print(result)
        
        # 如果需要查看某一列,例如股东名称和持股比例
        # 注意:返回的数据结构较为复杂,通常是多重索引的 DataFrame
        # 建议先打印 result.head() 查看结构
    else:
        print("未获取到数据,请检查是否已下载相关财务数据。")

def handlebar(ContextInfo):
    # 本示例仅在 init 中演示数据获取,盘中无需重复运行
    pass

3. 注意事项

  1. 数据补充:该接口依赖本地数据。在使用前,请务必在 QMT 客户端界面的【数据管理】工具中,下载补充财务数据基础数据,否则可能返回空值。
  2. 数据结构
    • 如果查询一只股票多个季度数据,返回的通常是 DataFrame
    • 如果查询多只股票多个季度数据,返回的可能是 Panel(在较新版本的 pandas 中 Panel 已被移除,QMT 可能会返回多级索引的 DataFrame,具体请以打印出的 type(result) 为准)。
  3. 发布频率:十大股东数据通常随季报、半年报和年报发布,因此数据不是每日更新的,而是按报告期更新。

Q&A

Q: 如何区分十大股东和十大流通股东?
A: 通过 data_name 参数控制。传入 'holder' 获取十大股东(包含限售股),传入 'flow_holder' 获取十大流通股东。

Q: 为什么运行代码后打印结果为空?
A: 最常见的原因是本地没有下载历史数据。请在 QMT 菜单栏点击“系统” -> “数据管理”,勾选对应的股票和“财务数据”/“基础数据”进行下载。

Q: 返回的数据中 holdNum 的单位是什么?
A: 单位通常是

Q: 可以获取实时的股东持仓吗?
A: 不可以。上市公司仅在定期报告(一季报、半年报、三季报、年报)中披露十大股东信息,因此只能获取到截止报告期末的历史数据。