资讯详情

港股上市公司基础信息数据实战:字段拆解、清洗方法与投研应用

📅 2026/9/24 22:24:14 | 华诺云谱 👁 阅读
港股上市公司基础信息数据实战:字段拆解、清洗方法与投研应用
做投研或者写量化策略的人最烦的一步不是建模也不是回测而是最前头的“数据准备”。尤其是港股数据源零散、字段口径不统一、历史变更复杂光是整理一份可用的上市公司基础信息表就够让人喝一壶的。我去年做一个跨市场轮动策略的时候被这个问题折磨得不轻。后来系统整理了 CnOpenData 的港股上市公司基础信息数据才算把这套底层的企业档案给理顺了。今天就把这套数据的结构认知、实操清洗方法和踩坑记录一并写出来。这套数据本质上解决的是“这家公司到底是谁、现在什么状态、属于哪个行业、有没有退市、换过名字没有”这一类底层的身份识别问题。别觉得这些字段简单真当你需要精确统计某个行业的公司数量、或者做退市公司风险回溯的时候没有一份干净的基础信息表后面所有计算都是空中楼阁。适合谁用做量化投研的、写公司深度报告的、做金融风控系统开发的都会用得上。下面我用实际整理这份数据的过程把里面的门道一层层拆开讲。1. 数据到底长什么样港股上市公司基础信息数据的核心字段拆解1.1 基础身份字段代码、名称、上市状态拿到原始文件的第一感觉是“这表真够宽”。CnOpenData 的港股公司基础信息字段覆盖得算全但最核心的依然是那几样证券代码、证券简称、公司全称、上市日期、上市状态、所属行业等等。这些字段初看平平无奇真正用起来才明白每个字段背后都有一堆讲究。先说证券代码。港股代码是 5 位数字跟 A 股不太一样。A 股代码里你能看出板块60 开头沪市主板、00 开头深市主板、30 开头创业板港股主板和创业板现称 GEM在代码上也有区分——主板常见 00001-09999GEM 板则是 08000 以上的 5 位代码。但这里有个坑GEM 转主板的公司会换新代码而不是在旧代码上原地升级。这就意味着你看某家公司 5 年前的数据和现在的数据代码可能对不上直接 join 会丢一堆历史数据。再说证券简称。港股公司的简称跟 A 股比花样要多得多。A 股简称一般是四个字港股有中文简称、英文简称还经常带后缀。比如“腾讯控股”和“TENCENT”后缀里那些-W同股不同权、-B未盈利生物科技公司、-S第二上市才是关键信息。这些后缀不是装饰品背后对应港交所不同的上市规则章节——-W对应 Chapter 18A/8A 的特殊安排-B对应 Chapter 18A 的生物科技公司上市规则。如果你在建股票池的时候没把这些后缀字段拆出来做筛选后续按照监管规则做分类统计时很容易漏掉重要维度。上市状态这个字段更要认真对待。A 股一般就是“上市、退市、ST”港股的状态要复杂得多常见的有“上市”“私有化退市”“除牌”“暂停买卖”等。注意港股的“停牌”和“退市”是两码事停牌是交易层面的暂停公司还是上市公司身份私有化退市则是彻底离开交易所。我见过好几个策略新手把“停牌超过 3 个月”的股票当成退市股从数据里删除结果后续复牌大涨直接踏空。所以这个字段必须逐字看别看到“停牌”就一刀切。1.2 公司属性字段行业、注册地、主营业务除了身份字段基础信息里还包含公司属性类信息主要是行业分类、注册地、主营业务描述。这些字段的价值在于做截面筛选和分组对比。行业分类是个老大难。港股的行业标签有好几套体系并存港交所自己的行业分类、恒生行业分类系统、还有各类第三方平台的分类。CnOpenData 这套数据里存的行业一般会注明遵循的是哪套体系用之前一定先看字段说明。我之前图省事直接用过一套没标来源的行业字段后来跟恒生行业分类做交叉验证发现对不上的比例接近两成。原因是两套体系对“综合企业”和“金融”这类大类的切分逻辑不同有些公司在这套体系里属于“工业工程”换一套就变成“综合企业”了。做多行业对比研究的时候务必统一行业分类口径否则后续归因分析全是错的。注册地这个字段做港股研究时比很多人想象的更重要。港股市场一个显著特征是大量公司注册在开曼群岛、百慕大等离岸地区实际运营主体在内地。如果把“注册地”误当成“主营业务所在地”用那你的数据分析就彻底歪了。CnOpenData 的数据里一般会把“注册地”和“主营业务所在地或主要经营地”分开列示或者至少在字段说明里给提示。我实际处理时会把两个字段都保留然后单独生成一个“中资股/港资股/外资股”的判断逻辑注册地是境外、但主要经营地在境内的就是市场俗称的“红筹/中资股”注册地在香港本地且主要经营也在香港的才算本地股。这里没有官方标准定义完全看研究者自己的策略需求来定阈值。主营业务描述字段看着是一段文字但里面信息密度很高。比如一家公司写着“主要从事物业发展及投资、酒店业务、证券投资”这属于典型的多主业公司。做行业分类时单一标签可能无法反映它的真实业务结构。我的做法是把这个字段保留原文同时再做一个“核心业务关键词提取”用正则把“物业”“酒店”“证券”“矿业”“医药”等词抽出来做成多标签字段。这样既能用于文本匹配又不会丢失原始信息。2. 这套数据能干什么从投研筛选到系统开发的典型应用场景2.1 快速完成全市场扫描和股票池初筛拿到信息完整的基础数据表最直接的用法是搭建一个“全市场公司档案库”需要看全市场某个行业有多少家公司、总市值多少、平均上市年限多长一条 SQL 就能算出来。举个例子假设我想筛选所有“恒生行业分类为医疗保健、且上市状态为正常交易”的公司用基础信息表可以这样做SELECT stock_code, stock_name, list_date, industry_hs FROM hk_company_info WHERE industry_hs 医疗保健 AND list_status 上市 ORDER BY list_date;这类查询在写日报、周报或者做行业轮动初筛时特别常用。没有这份基础表你得去港交所披露易手工翻或者从各家财经网站挨个抓效率差着数量级。更深一层你可以用上市日期字段计算“次新股”名单。比如筛选上市时间在 180 个自然日以内的公司——港股打新和次新股策略需要这个池子。操作方法就是对list_date做日期运算SELECT stock_code, stock_name, list_date FROM hk_company_info WHERE list_date DATE_SUB(CURDATE(), INTERVAL 180 DAY) AND list_status 上市;2.2 构建公司变更历史与事件驱动研究基础信息数据的另一大用途是追踪公司历史上的关键变更改名、变更行业分类、转板、停复牌、退市等。这些事件本身就是事件驱动策略的重要信号。比如更名。港股公司改名的频率不低很多公司在业务转型或者控制权变更后会把证券简称换掉。如果你在做一个“公司更名后股价表现”的统计就需要一份历史简称变更表。CnOpenData 的基础数据通常会提供“曾用名”字段但有时只保留最近一次变更记录更完整的变更历史需要配合公司的公告数据。我的经验是用基础信息里的“曾用名”做粗筛找出那些发生过改名的公司然后再去公告数据里细看每次更名的具体时间和原因。再比如转板。GEM 公司满足条件后可以申请转到主板上市这是一个非常明确的公司基本面进阶信号。因为转板往往意味着公司连续盈利记录达标、公众持股量达标隐含着一层“财务合规性验证”的背书。我实际统计过GEM 转主板事件后 60 个交易日的平均超额收益在某些年份相当可观。用基础信息表做这个研究关键是把“当前板块”和“历史板块变更记录”拆开看只看当前的字段会漏掉曾经在 GEM 挂过牌的公司。这也提醒我们除了当前快照最好再保留一份“曾经 GEM 上市”的历史标记字段否则这类事件研究做不了。2.3 作为数据仓库的主数据底座从系统开发的角度看这份基础信息表更大的价值是作为整个金融数据仓库的“主数据表”。所有其他数据——日线行情、财务报表、股东持股、公告信息——都要通过stock_code或公司唯一标识关联到这张表上。这就像盖楼打地基基础信息表的质量和稳定性决定了上层所有数据应用的天花板。实际建仓的时候我会在这张主数据表上做一些加工生成几个核心衍生标签is_active是否正常上市交易排除退市、私有化、暂停上市的公司board_level主板 or GEMis_biotech是否带-B后缀识别未盈利生物科技公司is_wvr是否带-W后缀识别同股不同权公司is_secondary是否带-S后缀识别第二上市公司这几个标签在后续写策略时会被反复用到。比如港股通标的筛选就要排除部分第二上市公司做“同股不同权公司表现”专题直接把is_wvr 1拿出来就行。用标签字段代替每次在股票名称里找后缀能省大量重复劳动也能避免字符串匹配带来的误判。3. 拿到数据之后怎么用一份可直接复现的清洗与入库流程3.1 先把数据表结构和主键定好拿到 CnOpenData 原始数据后别急着写分析逻辑第一件事是把数据导入本地数据库并建立规范的表结构。我习惯用 MySQL 或者 PostgreSQL原因是可以直接用 SQL 做后续的关联查询和去重校验。建表时至少要包含这些字段CREATE TABLE hk_company_info ( stock_code VARCHAR(10) COMMENT 港股证券代码5位数字, stock_name VARCHAR(100) COMMENT 证券简称, company_name VARCHAR(200) COMMENT 公司全称, company_name_en VARCHAR(200) COMMENT 公司英文全称, former_names TEXT COMMENT 曾用名分号分隔, list_date DATE COMMENT 上市日期, board VARCHAR(20) COMMENT 上市板块主板/GEM, list_status VARCHAR(20) COMMENT 上市状态, industry_hs VARCHAR(100) COMMENT 恒生行业分类, industry_hkex VARCHAR(100) COMMENT 港交所行业分类, register_place VARCHAR(100) COMMENT 注册地, main_place VARCHAR(100) COMMENT 主要经营地, business_desc TEXT COMMENT 主营业务描述, is_active TINYINT COMMENT 是否正常交易1是0否, is_biotech TINYINT COMMENT 是否-B后缀公司, is_wvr TINYINT COMMENT 是否-W同股不同权, is_secondary TINYINT COMMENT 是否-S第二上市, updated_at DATETIME COMMENT 更新时间 );这里提前把is_biotech、is_wvr、is_secondary这些标签直接算好存进表里后面做策略筛选的时候能省太多功夫。我一开始没建这些标签每次查询都靠LIKE %B%去字符串里匹配又慢又容易误伤——比如公司简称里天然带字母 B 的就被错误标记了。3.2 字段清洗里最容易被忽略的三个细节清洗数据没什么高深技术但细节坑特别多。我挑三个最容易踩的说。第一个是上市日期格式。原始数据里可能混着1992-04-15、1992/4/15甚至19920415多种格式导入数据库前最好统一转成YYYY-MM-DD标准格式。我自己习惯用 Python 做这一步因为可以顺带处理异常值import pandas as pd df pd.read_csv(hk_company_info_raw.csv) df[list_date] pd.to_datetime(df[list_date], format%Y-%m-%d, errorscoerce) # 解析不了的日期会变成 NaT后续单独检查 invalid_dates df[df[list_date].isna()] print(f无法解析的上市日期记录数: {len(invalid_dates)})第二个是行业分类的版本问题。港交所和恒生指数公司都会不定期调整行业分类同一家公司去年和今年的行业归属可能不同。如果你拿到的数据是某个时间点的快照但你要研究的是历史区间直接用当前行业分类回填所有历史数据是常见的错误做法。这种场景下我建议把行业分类看作一个时变属性历史回测用历史时点的行业标签而不是今天的标签。CnOpenData 的基础数据如果提供的是最新快照做长期回测时你就得额外注意这个问题必要时结合历史财报里的业务构成人工复核。第三个是退市公司信息的完整性。很多免费数据源只保留当前正常上市的公司退市公司的记录会逐步被清理掉。这对做退市风险研究的人是致命的——幸存者偏差直接让你的样本失真。CnOpenData 这类专业数据服务通常会把退市公司也保留在库里只是标注list_status 已退市。你拿到数据后一定要确认两个数量一是当前正常上市公司的数量二是历史上市但已退市/私有化公司的数量两边的记录都要有才算完整。3.3 与日线行情和财务数据的关联方式基础信息表最大的价值要在关联使用中体现。我在数据仓库里会用stock_code作为主键把日线行情、财务数据、股东数据全部串起来。这里有一个关键操作行情表里的stock_code应统一存储为基础信息表里的标准代码格式避免出现“00700”和“700”两种写法。一个典型的多表关联查询是这样的SELECT c.stock_code, c.stock_name, c.industry_hs, p.trade_date, p.close_price, p.turnover FROM hk_company_info c LEFT JOIN hk_daily_price p ON c.stock_code p.stock_code WHERE c.is_active 1 AND c.industry_hs 资讯科技业 AND p.trade_date BETWEEN 2024-01-01 AND 2024-06-30 ORDER BY p.trade_date;这里用LEFT JOIN可以顺带发现哪些公司没有行情数据——如果基础信息里存在某家公司但行情表里一直关联不上那就要排查是不是代码格式不一致或者这家公司处于长期停牌状态。这种通过关联分析反向验证数据质量的方法比单独看每张表靠谱得多。财务数据的关联则要小心“报告期”和“公告日期”两个概念的区别。港股财报披露时间和 A 股不完全一样年报和中期报告的时间跨度也长短不一。如果用财务数据做事件研究必须用“公告日期”而不是“报告期”来对齐时间轴否则就犯了未来函数错误。基础信息表在这里不直接参与计算但它作为公司名单的过滤条件决定了你研究样本的边界是否合理。4. 实操中一定会踩的坑常见问题与排查经验4.1 港股代码会“复活”千万别拿代码当永久主键A 股退市相对少见代码也基本固定但港股有个特别容易坑人的现象——代码会发生“继承”。一家公司私有化退市后它的代码可能过一段时间重新分配给一家新的上市公司。比如说港股历史上某些代码被使用过不止一次。如果你的数据表里存在同一个stock_code对应两家完全不同的公司但你只按代码关联行情那就把两家公司的数据搅在一起了算出来的收益率曲线自然面目全非。我的排查办法是对stock_code分组看每个代码对应的company_name是否唯一SELECT stock_code, COUNT(DISTINCT company_name) AS name_cnt FROM hk_company_info GROUP BY stock_code HAVING name_cnt 1;有记录返回就说明存在代码继承现象必须引入company_id作为真正的主键或者按“代码 有效期起止”来限定记录范围。强烈建议在数据库里给每个公司分配一个业务主键内部 ID而不要直接拿stock_code当主键。4.2 公司更名之后历史数据怎么对齐公司更名是港股市场很常见的操作。比如一家公司从“XX矿业”改成“XX科技”背后的业务逻辑可能真的转型了也可能只是蹭热点但不管哪种情况你的基础信息表里要能体现这种连续性。CnOpenData 的“曾用名”字段可以做初步识别但更稳妥的做法是维护一张“公司标识变更映射表”结构如下公司ID原证券简称新证券简称变更生效日期变更类型HK0001东方矿业东方科技2023-06-15更名有了这张表当你发现策略回测中某只股票的简称在某个时点突然对不上了就能快速定位是公司更名而不是数据拼接错误。更名事件本身还可以当作研究信号。我统计过 A 股和港股公司更名后的短期股价波动数据上确实存在一定的“更名效应”但样本选择偏差很大策略化要谨慎。用基础信息表里的曾用名字段先圈定发生过更名的公司再配合股价数据做事件研究这个流程很顺滑。4.3 用港交所披露易做交叉验证最后强调一点任何第三方数据都要学会跟官方渠道做交叉验证。港股上市公司的权威信息来源是港交所披露易这里能查到公司基本资料、股本结构、公告原文、上市日期等。CnOpenData 的数据总体质量不错但个别字段尤其是行业分类、主营业务描述这种偏定性的字段可能跟披露易上的原始表述存在差异或者更新存在滞后。我的习惯是抽检随机挑 30 家公司把 CnOpenData 上的上市日期、公司全称、注册地跟披露易逐一对一遍。只要这 30 家全部匹配我就对整份数据质量比较有信心否则就要评估差异率是否影响后续研究。这个方法虽然土但非常有效。数据服务再专业也难免有录入误差多一道官方核验就多一分安全垫。另外提醒一下下载数据的频次。港股公司动态变化快——每天都有新的公告、新的上市申请、新的停复牌。基础信息数据建议至少每月下载一次并做增量更新不要一份数据用一整年。特别是做全市场扫描策略的人公司名单过期一个月股票池就已经不准确了。5. 从基础信息到衍生逻辑一点个人心得数据清洗本身不是目的把数据变成研究逻辑的一部分才是。我在整套数据使用中一个比较深的体会是基础信息表虽然字段不多但几乎所有上层应用都绕不开它。它是所有量化分析、专题研究、系统开发的地基花时间把这块地基夯实了后面的事才能做得稳。有一个小技巧对我帮助很大我会把每家公司的主营业务描述、行业分类、公司名称、股票代码合并生成一个搜索字段后续做主题投资筛选时能非常快速地进行全文检索。比如要找“AI 概念”相关的港股公司直接在这个合并字段里搜AI、人工智能、智能等关键词比单独搜行业字段召回率高得多因为很多公司的主营业务描述里才有更细化的业务特征。再有一点是关于数据服务的心态。专业的金融数据服务确实省时省力但它不意味着你就不需要做数据审查。相反正因为数据量大、覆盖面广稍有不慎就容易在细节上翻车。每一个字段的语义、每一个代码的规则、每一个状态的变更都值得在正式使用前花点时间把逻辑理顺。这跟做投资是一个道理风险永远藏在你看不见的细节里早一天发现就早一天少踩一个坑。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。