问题描述
股东:shareholder_id、shareholder_name、shareholder_name_en为什么不一致呢?
解决方案
在使用 JoinQuant(聚宽)平台的 finance.run_query 接口查询股东信息(例如十大股东表 finance.STK_SHAREHOLDER_TOP10)时,开发者经常会发现同一个股东实体的 shareholder_id(股东ID)、shareholder_name(股东名称)和 shareholder_name_en(股东英文名)在不同时期或不同股票中存在看似“不一致”的情况。这主要由以下几个金融业务逻辑和数据处理层面的原因导致:
1. 实体唯一性与名称变更(历史更名)
在现实商业环境中,机构投资者或企业法人经常会发生更名。为了保证数据在时间序列上的连续性和实体的唯一性,底层数据库会为该实体分配一个唯一的 shareholder_id。
- 现象:同一个
shareholder_id在2018年的记录中对应名称A,在2020年的记录中对应名称B。 - 结论:
shareholder_id是追踪同一股东的最可靠标识,名称的变化反映了其工商注册信息的历史变更。
2. 披露口径与名称简写差异
上市公司在发布定期报告(季报、半年报、年报)时,对股东名称的披露可能存在不规范的情况。例如,同一家基金公司,在A公司的财报中披露为“XX基金管理有限公司”,在B公司的财报中可能简写为“XX基金”。
- 数据清洗逻辑:聚宽的数据供应商在入库时,会通过算法或人工将这些不同的披露名称映射到同一个
shareholder_id上,从而导致你看到的原始披露名称不完全一致,但ID是相同的。
3. 中英文名称的注册与翻译差异 (shareholder_name_en)
关于英文名不一致,通常有以下原因:
- 法定英文名 vs 翻译名:部分机构(特别是QFII、外资投行)有法定的英文注册名,而中文名是音译或意译;反之,国内机构的英文名可能是拼音、直译或其在海外分支机构的特定名称。
- 多主体共用:某些大型跨国集团在不同市场使用不同的英文后缀(如 LLC, Ltd, Corp),但在国内披露时可能被统称为同一个中文名。
4. 账户与产品穿透
对于公募基金、信托计划、社保基金等资管产品,有时候披露的是“产品名称”(如:XX银行-XX股票型证券投资基金),有时候披露的是“管理人名称”。在高级的数据处理中,为了方便量化分析,可能会将同一管理人旗下的不同产品映射到同一个母体ID,或者反过来,赋予不同产品独立的ID但名称相似。
💡 量化开发建议:如何正确使用股东数据?
在编写量化策略或进行基本面研究时,强烈建议以 shareholder_id 作为关联和聚合的主键,而不是使用 shareholder_name 进行字符串匹配。字符串匹配极易因为全半角、空格、简全称等问题导致数据遗漏。
JoinQuant 查询十大股东代码示例:
from jqdata import *
# 查询贵州茅台(600519.XSHG)在2022年之后的十大股东信息
q = query(
finance.STK_SHAREHOLDER_TOP10.code,
finance.STK_SHAREHOLDER_TOP10.pub_date,
finance.STK_SHAREHOLDER_TOP10.shareholder_id,
finance.STK_SHAREHOLDER_TOP10.shareholder_name,
finance.STK_SHAREHOLDER_TOP10.share_ratio
).filter(
finance.STK_SHAREHOLDER_TOP10.code == '600519.XSHG',
finance.STK_SHAREHOLDER_TOP10.pub_date > '2022-01-01'
).order_by(
finance.STK_SHAREHOLDER_TOP10.pub_date.desc(),
finance.STK_SHAREHOLDER_TOP10.share_ratio.desc()
).limit(20)
df = finance.run_query(q)
print(df)
总结:股东ID、名称、英文名的不一致是金融数据真实复杂性的体现。理解这些差异,并坚持使用 shareholder_id 作为唯一标识,是构建稳健基本面量化模型的关键一步。