yfinance获取美股/港股历史行情最简路径是用download()方法,如yf.download("AAPL", start="2023-01-01", end="2024-01-01"),支持auto_adjust=True前复权,但港股支持不稳定,A股基本不可靠。

用 yfinance 获取美股/港股历史行情最简路径
yfinance 是纯 Python 实现、无需申请 token、开箱即用的方案,适合快速验证或小规模分析。它本质是绕过 Yahoo Finance 官方 API,直接解析网页数据,因此对 A 股支持有限(部分股票代码能查,但不稳定)。
关键点在于:download() 比 history() 更省心——前者自动处理时区、分割调整、缺失填充,后者返回原始 OHLCV 数据但不自动修正复权(除非显式传 auto_adjust=True)。
- 获取苹果日线:
yf.download("AAPL", start="2023-01-01", end="2024-01-01") - 想保留前复权价格:加参数
auto_adjust=True;要后复权则用back_adjust=True - 注意时区:
download()默认返回 UTC 时区的 DatetimeIndex,本地分析前建议.tz_localize(None)或.tz_convert("Asia/Shanghai") - 常见报错
HTTPError 404多因代码拼错(如用"600519.SS"查茅台,实际应为"600519.SS"—— 但 yfinance 对 A 股支持差,大概率返回空 DataFrame)
Tushare 获取 A 股全量历史数据的硬性前提
Tushare 需要注册获取 token,且免费版调用频率受限(180次/分钟),但数据质量高、字段全、A 股覆盖完整。真正卡住新手的不是代码,而是 token 配置和权限开通。
- 注册后必须去「个人中心 → 接口权限」手动开通
pro_api权限,否则调用pro_api(token)会静默失败(返回空对象,无报错) - 首次使用需执行
ts.set_token("your_token_here"),之后用pro = ts.pro_api();若跳过 set_token,pro.query("daily", ...)直接抛AttributeError: 'NoneType' object has no attribute 'query' - A 股代码格式严格:6位数字 + 交易所后缀,如
"000001.SZ"(平安银行)、"600519.SH"(贵州茅台),漏掉后缀或写成"600519"会导致查不到数据 - 批量下载多只股票时,避免循环调用
pro.daily(),改用pro.trade_cal()先取交易日历,再用pro.daily(trade_date="20230101")分日期拉取,更稳定且不易触发限流
yfinance 和 Tushare 的数据差异在哪
表面都是 OHLCV,但底层逻辑不同:yfinance 的“开盘价”是 Yahoo 页面显示值,未经交易所确认;Tushare 的 daily 表来自交易所官方接口,含 pre_close(昨收)、change(涨跌额)、pct_chg(涨跌幅)等衍生字段,且分红送股信息可查 dividend 表。
立即学习“Python免费学习笔记(深入)”;
- yfinance 不提供成交额(
amount)、换手率、市盈率等基本面字段;Tushare 的daily_basic表可补全这些 - 复权方式:yfinance 的
auto_adjust是简单前复权(仅除权除息),Tushare 的adj_factor字段支持自定义复权计算,更灵活 - 停牌处理:yfinance 在停牌日仍返回前一日收盘价(伪数据);Tushare 的
daily表中停牌日trade_date存在但close为 NaN,真实反映市场状态
遇到 “No data found for this date range” 怎么排查
这个错误在两个库中都高频出现,但原因完全不同,不能一概而论。
- yfinance:先检查代码是否有效(如
"BABA"可用,"BABA.HK"大概率失败),再确认日期是否为交易日(Yahoo 不返回非交易日数据,且美股假期多,用yf.Ticker("AAPL").calendar可查最近财报日,侧面验证连通性) - Tushare:重点看
trade_date格式——必须是 8 位字符串("20230101"),不能是 datetime 或带横杠的"2023-01-01";另外免费用户无法访问 2018 年以前数据,若请求start_date="20100101"就会静默截断 - 通用技巧:用
pro.query("stock_basic", exchange="", list_status="L")先拉一次上市股票列表,确认目标代码确实在库中,比盲试高效得多
数据源的边界条件比语法更重要:yfinance 的“可用性”取决于 Yahoo 页面是否渲染该股票,Tushare 的“可得性”取决于你开通的权限等级和调用时间窗口。别在报错信息里找答案,先去源头确认数据是否存在。


















