yfinance 市场覆盖 · ticker 写法与交易日历
A股、港股、指数、ETF:ticker 怎么写,覆盖到哪一步
「yfinance 不支持 A 股」这句话在中文圈流传很广,但本站实测 600519.SS、000001.SZ、688981.SS、0700.HK、^GSPC、SPY 都能正常返回日线。真正的差异在别处:后缀怎么写、交易日历不同导致行数不同、默认拿到的 A 股价格是复权价。本页用一张实测对照表把这些讲清楚,并说明那句流传说法是从哪来的。
哪些标的能取到数:7 个标的实测对照表
同一台机器、同一时间窗、同一个 period="1mo",只改 ticker。
| ticker | 市场 | 实测行数 | 索引时区 | 实测到的其他特征 |
|---|---|---|---|---|
AAPL | 美股 | 22 | America/New_York | Volume 为 int64,7 列 |
SPY | 美股 ETF | 22 | America/New_York | 比股票多出 Capital Gains 列(8 列) |
^GSPC | 美股指数 | 22 | America/New_York | 指数无需后缀,成交量量级明显更大 |
600519.SS | 沪市主板 | 17 | Asia/Shanghai | 后缀 .SS |
688981.SS | 科创板 | 17 | Asia/Shanghai | 与主板同样走 .SS |
000001.SZ | 深市 | 17 | Asia/Shanghai | 收盘价形如 11.4488 → 默认拿到的是复权价 |
0700.HK | 港股 | 22 | Asia/Hong_Kong | 四位代码 + .HK |
跨市场取数会有什么变化:并集、NaN 与 dtype
把不同市场放进同一次批量请求,会得到一张需要二次处理的表。
import yfinance as yf
# 实测:并集索引 23 行(美股 22 行 + A 股 17 行 → 23 个不同交易日)
d = yf.download(["AAPL", "600519.SS"], period="1mo", progress=False)
print(d.shape) # (23, 10)
print(d.isna().sum().head()) # 缺失侧为 NaN
print(d[("Volume", "AAPL")].dtype) # float64 —— 原本是 int64
# 处理建议:按市场分开下载,再各自处理各自日历
us = yf.Ticker("AAPL").history(period="1mo") # 22 行
cn = yf.Ticker("600519.SS").history(period="1mo") # 17 行
print(us.index.tz, cn.index.tz) # America/New_York Asia/Shanghaiffill() 会凭空制造出交易日,这是本站最不建议做的一件事——正确做法是承认日历不同,分开建模。后缀与代码映射:官方常量表里有什么
除了手写后缀,官方还内置了交易所代码映射。
| 机制 | 官方实现 | 本站核实情况 | 什么时候用 |
|---|---|---|---|
| 手工后缀 | 无统一表,由用户按 Yahoo 规则书写 | 实测 .SS / .SZ / .HK 均可用 | 日常取数最直接的方式 |
| 交易所 MIC 映射 | 常量表 _MIC_TO_YAHOO_SUFFIX,本站读取源码统计为 82 个交易所代码 | 存在且条目数量已核实;本站未逐条验证每个映射的可用性 | 按交易所代码批量构造 ticker 时 |
| 请求域名常量 | query1.finance.yahoo.com / query2.finance.yahoo.com / finance.yahoo.com | 三个常量均已核实 | 自建代理或排查网络问题时定位目标主机 |
| 行业/板块映射 | SECTOR_INDUSTY_MAPPING,11 个板块 | 已核实条目数 | 做板块聚合时对齐名称 |
取不到数怎么排查:按顺序过这四步
遇到「代码写对了却取不到」,按这个顺序查,别一上来就改代码。
- 先确认主机可达 本站实测遇到过
Failed to connect to hk.yahoo.com port 443这类网络层失败,此时换 ticker、改参数都没用。先确认请求目标主机连通性,再谈其它。 - 确认代码格式 A 股必须带
.SS/.SZ;港股补足四位再带.HK;指数以^开头。纯数字会被当成美股 ticker 而返回空表。 - 看异常类型而不是猜 官方异常体系包括
YFPricesMissingError(无价格数据)、YFTzMissingError(无时区)、YFInvalidPeriodError(周期不合法)、YFRateLimitError(被限流)。不同异常对应完全不同的处理方式。 - 打开异常可见性 在新版本里把
yf.config.debug.hide_exceptions = False,否则很多错误会被默认吞掉,只表现为「返回空表」。 - 最后才怀疑数据源本身 如果主机可达、代码正确、异常明确指向「无价格数据」,那才考虑该标的在 Yahoo 侧确实没有你要的区间/粒度。此时用另一个标的(例如
AAPL)做对照,能快速区分是标的问题还是环境问题。
想扩展覆盖有哪些办法:三条可自行验证的路
本站只实测了 7 个标的,所以下面给的是「你自己怎么验证」,而不是覆盖范围清单。
- 从已知可用的标的出发 用
AAPL作为对照,先确认环境与网络正常,再换你要验证的标的。这样能把「环境问题」与「标的/代码问题」分开——本站实测中大量失败其实是前者。 - 用索引与 ETF 做二级验证 指数(如
^GSPC)与 ETF(如SPY)的取数路径与个股相同,但 ETF 会多出Capital Gains列——这一点本站已实测,可作为你验证脚本的断言之一。 - 核对交易所映射表 官方常量表
_MIC_TO_YAHOO_SUFFIX里有 82 个交易所代码,它是「按交易所批量构造 ticker」的起点;但条目存在不等于可取数,仍需逐个最小验证。 - 把验证结果写进记录 记录 ticker、日期、行数、时区、是否为空表。本站的对照表就是按这个格式做的,你可以直接沿用这个字段集合。
yfinance 常见问题
下面的回答都指向可核验的官方文件或本站实测;与官方表述冲突时,以官方仓库与 docs 为准。
A 股代码怎么写?
后缀规则:上海 .SS(如 600519.SS)、深圳 .SZ(如 000001.SZ)。本站实测这三类代码都能返回完整日线:600519.SS(17 行)、000001.SZ(17 行)、688981.SS(科创板,17 行)。注意不要用纯数字代码,那会被当成美股 ticker。
港股怎么写?
四位数字 + .HK,例如 0700.HK。本站实测返回 22 行、索引时区 Asia/Hong_Kong。港股代码通常是 4 位,不足需补零。
指数怎么写?
指数一般以 ^ 开头,例如 ^GSPC(标普 500)、^DJI、^IXIC。本站实测 ^GSPC 返回 22 行、索引时区 America/New_York。真实指数代码表以 Yahoo 站点为准,本站只实测了这几个。
为什么同样取 1 个月,A 股 17 行、美股 22 行?
因为交易日历不同。实测区间 2026-09-09 至 2026-10-09 内,美股有 22 个交易日、A 股有 17 个。这直接影响两件事:①跨市场批量下载会返回并集并把缺失侧填成 NaN;②按同一自然日窗口比较收益率时,两边的起点与终点不在同一个交易日。
「yfinance 不支持 A 股」是真的吗?
不准确。实测 A 股可以取数。那句话的来源大概率是某个本机技能的脚本设计限制——例如本机 yahoo-finance-github 技能的说明里写着「does not support A-shares or HK stocks」,那是那个技能的参数与输出格式只按美股设计,与 yfinance 库的能力是两回事,不要混同。
A 股拿到的是真实成交价吗?
默认不是。因为 auto_adjust 默认为 True,本站实测 000001.SZ 返回的收盘价形如 11.4488(多位小数),是复权后的价格,与行情软件上的两位小数成交价不同。要真实成交价请显式 auto_adjust=False 并取 Close 列,详见复权语义页。