yfinance 市场覆盖 · ticker 写法与交易日历

A股、港股、指数、ETF:ticker 怎么写,覆盖到哪一步

「yfinance 不支持 A 股」这句话在中文圈流传很广,但本站实测 600519.SS、000001.SZ、688981.SS、0700.HK、^GSPC、SPY 都能正常返回日线。真正的差异在别处:后缀怎么写、交易日历不同导致行数不同、默认拿到的 A 股价格是复权价。本页用一张实测对照表把这些讲清楚,并说明那句流传说法是从哪来的。

实测标的:7 个(美股/沪/深/科创板/港股/指数/ETF)实测区间:period="1mo",采集日 2026-10-09依据:本机实测 + 官方常量表
美股:无后缀
A 股:.SS / .SZ
港股:.HK
日历与时区差异
依据 Yahoo ticker 规则与本站 7 个标的实测绘制的市场覆盖示意;非官方覆盖率承诺。
yfinance · Measured

哪些标的能取到数:7 个标的实测对照表

同一台机器、同一时间窗、同一个 period="1mo",只改 ticker。

ticker市场实测行数索引时区实测到的其他特征
AAPL美股22America/New_YorkVolume 为 int64,7 列
SPY美股 ETF22America/New_York比股票多出 Capital Gains 列(8 列)
^GSPC美股指数22America/New_York指数无需后缀,成交量量级明显更大
600519.SS沪市主板17Asia/Shanghai后缀 .SS
688981.SS科创板17Asia/Shanghai与主板同样走 .SS
000001.SZ深市17Asia/Shanghai收盘价形如 11.4488 → 默认拿到的是复权价
0700.HK港股22Asia/Hong_Kong四位代码 + .HK
怎么读这张表:行数差异不是「取数少了」,而是交易日历不同;时区差异意味着你不能把两张表直接按索引对齐;价格量级差异(复权 vs 未复权)意味着你不能直接把数字与行情软件对价。
yfinance · Calendar

跨市场取数会有什么变化:并集、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/Shanghai
关键点:并集表里的 NaN 不代表停牌,只是「对方市场那天不开市」。把 NaN 当成缺失数据做 ffill() 会凭空制造出交易日,这是本站最不建议做的一件事——正确做法是承认日历不同,分开建模。
yfinance · Suffix

后缀与代码映射:官方常量表里有什么

除了手写后缀,官方还内置了交易所代码映射。

机制官方实现本站核实情况什么时候用
手工后缀无统一表,由用户按 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 个板块已核实条目数做板块聚合时对齐名称
边界:上表中「条目数量」是本站读源码统计的,不代表每个条目都能成功取数;本站只实测了 7 个标的。要把某个代码用于生产,请自己跑一次最小验证。
yfinance · Ask

取不到数怎么排查:按顺序过这四步

遇到「代码写对了却取不到」,按这个顺序查,别一上来就改代码。

  1. 先确认主机可达 本站实测遇到过 Failed to connect to hk.yahoo.com port 443 这类网络层失败,此时换 ticker、改参数都没用。先确认请求目标主机连通性,再谈其它。
  2. 确认代码格式 A 股必须带 .SS/.SZ;港股补足四位再带 .HK;指数以 ^ 开头。纯数字会被当成美股 ticker 而返回空表。
  3. 看异常类型而不是猜 官方异常体系包括 YFPricesMissingError(无价格数据)、YFTzMissingError(无时区)、YFInvalidPeriodError(周期不合法)、YFRateLimitError(被限流)。不同异常对应完全不同的处理方式。
  4. 打开异常可见性 在新版本里把 yf.config.debug.hide_exceptions = False,否则很多错误会被默认吞掉,只表现为「返回空表」。
  5. 最后才怀疑数据源本身 如果主机可达、代码正确、异常明确指向「无价格数据」,那才考虑该标的在 Yahoo 侧确实没有你要的区间/粒度。此时用另一个标的(例如 AAPL)做对照,能快速区分是标的问题还是环境问题。
yfinance · Expand

想扩展覆盖有哪些办法:三条可自行验证的路

本站只实测了 7 个标的,所以下面给的是「你自己怎么验证」,而不是覆盖范围清单。

  1. 从已知可用的标的出发 用 AAPL 作为对照,先确认环境与网络正常,再换你要验证的标的。这样能把「环境问题」与「标的/代码问题」分开——本站实测中大量失败其实是前者。
  2. 用索引与 ETF 做二级验证 指数(如 ^GSPC)与 ETF(如 SPY)的取数路径与个股相同,但 ETF 会多出 Capital Gains 列——这一点本站已实测,可作为你验证脚本的断言之一。
  3. 核对交易所映射表 官方常量表 _MIC_TO_YAHOO_SUFFIX 里有 82 个交易所代码,它是「按交易所批量构造 ticker」的起点;但条目存在不等于可取数,仍需逐个最小验证。
  4. 把验证结果写进记录 记录 ticker、日期、行数、时区、是否为空表。本站的对照表就是按这个格式做的,你可以直接沿用这个字段集合。
不要做的事:不要拿「某个代码在搜索框里能搜到」当作可取数的证据。取数成功与否取决于 Yahoo 侧的数据可用性,只能实测。
FAQ

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 列,详见复权语义页。

下一步:数据到手之后怎么审

市场与口径都确认过了,接下来是最后一道关:把拿到的数据审计一遍,再决定它能不能进回测。