JerBouma / A 股与港股
FinanceDatabase 中国市场实测:A 股与港股怎么筛、代码怎么接
用本库做中国市场,卡点不在安装,而在三个字段的口径:country 是公司所属国家而不是上市地,A 股的规范后缀是 .SS/.SZ 而不是 .SH,而它给出的代码在别的工具里未必取得到行情。这一页把 2026-09-29 的全部实测数字、代码映射与失败样例摊开,方便你判断这套数据能不能支撑自己的研究口径。
事实核验卡(核验日期 2026-09-29)
- FinanceDatabase 版本
- 2.4.0(PyPI 与 GitHub Release,2026-06-02 发布)
- Python 版本
- 3.11.9(本站实测);包要求 ≥3.10, <3.16
- 数据库快照
- GitHub main 分支 compression/*.bz2(main 最后提交 2026-09-27)
- 核验日期
- 2026-09-29
- Equities 行数
- 112,718 行 × 21 列
- ETF 行数
- 36,481 行 × 9 列
- 数据来源
- raw.githubusercontent.com/JerBouma/FinanceDatabase/main/compression/
- 最后验证时间
- 2026-09-29(本机 venv 实跑,输出已归档)
以上数字来自本站 2026-09-29 在 Windows + Python 3.11.9 + financedatabase 2.4.0 下的真实运行输出,不是从文章里转抄的;数据文件由上游持续更新,行数会变,以官方 PyPI 与 GitHub Release 为准。采集时 GitHub star 约 9,374(2026-09-29)。
三个字段先分清:country 不是上市地
同一个「中国」在数据里可以对应完全不同的市场。把这三个字段的含义分开,后面所有筛选才有意义。
| 字段 | 实测取值示例 | 真实含义 | 最常见的误用 |
|---|---|---|---|
country | China / Hong Kong / United States(共 117 个) | 公司所属国家或地区 | 当成「上市地」——实测 country="China" 的标的分布在 34 个交易所 |
exchange | SHH / SHZ / HKG / NMS / NYQ / PNK(共 84 个) | 上市交易所的短代码 | 把它当成公司所在国;同一家公司可以在多个 exchange 出现 |
mic | XSHG / XSHE / XHKG / XNAS(共 71 个) | ISO 10383 标准交易所代码 | 和 exchange 混用;两者一一对应但写法不同 |
market | Shanghai Stock Exchange / Shenzhen Stock Exchange(共 79 个) | 交易所的完整名称 | 用它做精确筛选——字符串太长,容易写错 |
currency | CNY / HKD / USD(共 37 个) | 报价货币 | 用来判断上市地——很多中国公司在海外以美元挂牌 |
索引(symbol) | 000002.SZ / 600519.SS / 0700.HK | 证券代码,是 DataFrame 的索引而不是普通列 | 写 df["symbol"] 或 search(symbol=...)——都不会报错,但结果是错的 |
country,筛「在哪里上市」用 exchange 或 mic。这两个问题在本库里的答案差别很大——实测 country="China" 有 6,775 行,其中只有 3,623 行在上交所和深交所上市。实测能筛出多少标的:A 股与港股的真实行数
下表全部来自 2026-09-29 的实跑(financedatabase 2.4.0,默认排除退市)。
| 你想要的 | 实测写法 | 实测行数 | 读这个数字时要注意 |
|---|---|---|---|
| 全部中国公司 | country="China" | 6,775 | 含只在海外上市的条目,不等于 A 股 |
| 只在上交所上市 | country="China", mic="XSHG" | 1,523 | 这才是 A 股沪市口径 |
| 只在深交所上市 | country="China", exchange="SHZ" | 2,100 | A 股深市口径 |
| 在上交所 + 深交所 | 两次查询相加 | 3,623 | A 股总量口径,与交易所披露的家数对比可看覆盖缺口 |
| 只在港交所上市 | country="China", exchange="HKG" | 673 | 同为中国公司但在香港挂牌 |
| 只在美国 OTC / 粉单 | country="China", exchange="PNK" | 409 | 常见于港股 ADR 与粉单市场 |
| 以人民币计价 | country="China", currency="CNY" | 3,553 | 可用来剔除海外挂牌的同名标的 |
| 香港公司 | country="Hong Kong" | 2,436 | 其中港交所挂牌 823 行 |
| 香港公司在沪市挂牌 | country="Hong Kong", exchange="SHH" | 2 | 数量很小,但说明「香港公司」不等于「港股」 |
mic="XSHG" / exchange="SHZ" 的实测行数,和你自己从交易所披露口径拿到的家数做个对照——差多少,就是你需要在别处补齐的部分。代码后缀对照:本库怎么写,别的工具怎么认
本库用的是 Yahoo 风格的交易所后缀。实测三个后缀与交易所字段是一一对应的。
| 市场 | 本库代码示例 | 实测 exchange | 实测 mic | 全库命中行数 | 注意点 |
|---|---|---|---|---|---|
| 上交所(沪市) | 600519.SS | SHH | XSHG | 1,628 | 后缀是 .SS;实测 .SH 在本库命中 0 行 |
| 深交所(深市) | 000002.SZ | SHZ | XSHE | 2,248 | 沪深的数字编号规则不同,不要跨交易所硬套 |
| 港交所 | 0700.HK | HKG | XHKG | 1,625 | 同样是 .HK,但标的可能属于中国或香港 |
| 美股 | AAPL | NMS / NYQ | XNAS / XNYS | — | 本库的美股代码不带后缀 |
| 美国 OTC / 粉单 | AACAF | PNK | OTCM | — | 中国公司常以 ADR / 粉单形式出现,代码看不出国别 |
接力实测:本库给的代码,yfinance 真能取到行情吗?
2026-09-29 用同机环境(yfinance 1.7.0)对 16 个代码逐个试取 5 日行情,结果如下——重点是里面的失败项。
| 代码 | 来源 | 实测结果 | 说明 |
|---|---|---|---|
600519.SS | 本库 A 股后缀 | 成功,收盘 1235.58 | 沪市代码在本库与 yfinance 之间可以直接传递 |
000002.SZ | 本库 A 股后缀 | 成功,收盘 4.08 | 深市同理 |
300750.SZ | 本库 A 股后缀 | 成功,收盘 286.8 | 创业板代码同样可传 |
0700.HK | 本库港股后缀 | 成功,收盘 432.0 | 港股代码一致 |
9988.HK | 本库港股后缀 | 成功,收盘 106.2 | 同上 |
000004.SZ | 直接取本库清单的第 2 行 | No data found, symbol may be delisted | 清单里有、行情侧取不到:已退市或长期无成交 |
000005.SZ | 直接取本库清单的第 3 行 | No data found, symbol may be delisted | 同上,说明清单条目≠可交易标的 |
000006.SZ / 000007.SZ / 000009.SZ | 本库清单第 4–6 行 | 成功,收盘 7.62 / 11.08 / 6.86 | 同批次里大部分是正常的,所以必须逐只验证 |
抽样验证
从候选池随机抽 10–20 只,用行情工具拉一次短周期数据。预期输出:绝大多数返回行数大于 0,失败项被记录下来。
全量验证并留档
对整池逐只取一次数据,把返回为空的代码写进
unavailable.csv。预期输出:得到一个明确的失败清单,而不是「感觉少了一些」。把验证结果并入标的池
用失败清单反选,得到最终可研究池,并在记录里写明验证日期与行情源版本。预期输出:标的池可复现,别人按同样步骤能得到同一份清单。
cn_universe_20260929_fd240.csv)。下次上游更新之后,你才能说清上一次的结论是在哪一份 FinanceDatabase 快照上得出的,别人也才能按同样步骤复现。跨市场重复:同一家公司在多地挂牌怎么处理
这是中国市场最容易被忽略的一步。本库里同一个企业可能同时有多条记录,而它们看起来都「对」。
| 现象 | 实测证据 | 会带来什么后果 | 处理方式 |
|---|---|---|---|
| 同一公司在 A 股与港股各有一条 | country="Hong Kong" 里有 2 行在 exchange=SHH 上市 | 按行业统计时同一家公司被数两次 | 用 exchange/mic 先锁定一个市场 |
| 中国公司在美国以粉单出现 | country="China", exchange="PNK" 实测 409 行 | 用代码去取行情时大量失败 | 按 exchange 排除 PNK/OTCM |
| 同名标的成批出现 | 全库 65,317 行存在同名记录,涉及 19,633 个名字 | 按名称去重会误删不同公司的记录 | 不要只用 name 去重,见数据质量审计页 |
only_primary_listing 看起来像去重开关 | 对中国标的实测:6,775 → 737 行(砍掉 89.1%),剩下的几乎全是美国 OTC 代码 | 把 A 股主板整批剔除,还以为做了去重 | 改用 exchange/mic 指定市场后再去重 |
mic 锁定你要的市场 → ②在候选池内按 name 归组,人工确认哪些是真重复 → ③有 isin 的用 isin 交叉验证(注意它缺失率 73%,空值不会被匹配上)→ ④把最终保留的代码写进固定清单,下次直接复用。不要期望一条参数解决去重。中国市场覆盖的四个实测缺口
把缺口写清楚,比笼统地说「覆盖全球」更有用。下面每条都有对应的实测证据。
| 缺口 | 实测依据 | 对你的影响 | 怎么补 |
|---|---|---|---|
| A 股不是全量 | mic="XSHG" 1,523 行 + exchange="SHZ" 2,100 行 = 3,623 行 | 小市值与新股可能根本不在清单里 | 与交易所披露家数对照,缺口部分另找数据源 |
| 标识符大量缺失 | 中国标的 isin 缺失 77.58%、cusip 缺失 90.81% | 用 ISIN 做跨市场匹配会静默漏匹配 | 优先用代码 + 交易所组合做键,ISIN 只作辅助 |
| 市场字段是「英文口径」 | market 取值如 Shanghai Stock Exchange / KOSPI Stock Market | 中文习惯的「A 股 / 主板 / 创业板」在本库里没有对应字段 | 自己维护一张映射表,别指望现成板块字段 |
| 退市状态只有布尔值 | delisted 只有 True/False(全库 10,404 行为 True) | 分不清「退市」与「长期停牌」 | 结合行情侧是否取到数据来判断 |
中国市场常见问题
country="China" 为什么会出现纳斯达克的交易所代码?
country 记的是公司所属国家或地区,exchange 才是上市地。实测 country="China" 的 6,775 行分布在 34 个交易所,包含 NYQ、NMS、PNK、LSE、FRA 等。要让结果落在 A 股,得同时加 mic="XSHG" 或 exchange="SHZ"。字段口径以你实际查到的数据为准。
为什么 .SH 后缀查不到东西?
实测 .SH 在本库命中 0 行,沪市的规范后缀是 .SS(如 600519.SS)。这个后缀来自 Yahoo 的命名习惯,yfinance 也沿用同一套写法;换到别的数据源时先确认它对后缀的定义。
怎么筛「A 股」而不是「中国公司」?
把 country="China" 与交易所字段组合:沪市用 mic="XSHG"(实测 1,523 行),深市用 exchange="SHZ"(实测 2,100 行)。两者相加 3,623 行是本站实测的 A 股口径。
港股代码要不要加后缀?
要。港交所挂牌的代码形如 0700.HK,实测全库以 .HK 结尾的共 1,625 行,对应 exchange=HKG、mic=XHKG。注意 country="Hong Kong" 与「在港交所上市」并不等价。
按主上市地去重能不能用 only_primary_listing?
在本库 2.4.0 上不建议。该参数的实现是剔除所有带「点」的索引,而 A 股与港股的规范代码恰好都带点:实测中国标的从 6,775 行掉到 737 行,减少 89.1%,剩下的几乎全是美国 OTC 代码。更可靠的做法是用 exchange/mic 指定市场。
中国市场的部分能不能离线用?
可以,但要自己准备。本库不在包内带数据,每次实例化都会从 GitHub 拉 .bz2 文件;把数据文件放进 site-packages/compression/ 后即可离线加载(实测加载耗时从 16.6 秒降到 2.9 秒)。具体步骤见安装页。