问题描述
解决方案
在 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.DataFrame 或 pandas.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. 注意事项
- 数据补充:该接口依赖本地数据。在使用前,请务必在 QMT 客户端界面的【数据管理】工具中,下载补充财务数据或基础数据,否则可能返回空值。
- 数据结构:
- 如果查询一只股票的多个季度数据,返回的通常是
DataFrame。 - 如果查询多只股票的多个季度数据,返回的可能是
Panel(在较新版本的 pandas 中 Panel 已被移除,QMT 可能会返回多级索引的 DataFrame,具体请以打印出的type(result)为准)。
- 如果查询一只股票的多个季度数据,返回的通常是
- 发布频率:十大股东数据通常随季报、半年报和年报发布,因此数据不是每日更新的,而是按报告期更新。
Q&A
Q: 如何区分十大股东和十大流通股东?
A: 通过 data_name 参数控制。传入 'holder' 获取十大股东(包含限售股),传入 'flow_holder' 获取十大流通股东。
Q: 为什么运行代码后打印结果为空?
A: 最常见的原因是本地没有下载历史数据。请在 QMT 菜单栏点击“系统” -> “数据管理”,勾选对应的股票和“财务数据”/“基础数据”进行下载。
Q: 返回的数据中 holdNum 的单位是什么?
A: 单位通常是股。
Q: 可以获取实时的股东持仓吗?
A: 不可以。上市公司仅在定期报告(一季报、半年报、三季报、年报)中披露十大股东信息,因此只能获取到截止报告期末的历史数据。