用 Python yfinance 玩转金融数据:从股票爬取到分析可视化的实战指南
目录
一、为什么 yfinance 是金融数据分析的 “首选工具”?
方式 2:用 history 获取最近 1 条数据(更实时)
2. 财务报表为空:“为什么 balance_sheet 返回空 DataFrame?”
3. 批量获取时部分股票数据缺失:“multi_stocks 里有 NaN 值”
4. 时间范围错误:“start 日期设置了但数据从更早开始”

class 卑微码农: def __init__(self): self.技能 = ['能读懂十年前祖传代码', '擅长用Ctrl+C/V搭建世界', '信奉"能跑就别动"的玄学'] self.发量 = 100 # 初始发量 self.咖啡因耐受度 = '极限' def 修Bug(self, bug): try: # 试图用玄学解决问题 if bug.严重程度 == '离谱': print("这一定是环境问题!") else: print("让我看看是谁又没写注释...哦,是我自己。") except Exception as e: # 如果try块都救不了,那就... print("重启一下试试?") self.发量 -= 1 # 每解决一个bug,头发-1 # 实例化一个我 我 = 卑微码农()引言
如果你是股票投资者、金融分析师,或者想入门量化交易,一定遇到过这样的问题:哪里能免费获取可靠的股票数据?如何快速拿到历史价格、财务报表、分红记录?用 Python 爬取金融数据时,要么被 API 收费劝退,要么因反爬机制卡壳。而 yfinance—— 这个基于雅虎财经数据的 Python 库,正是解决这些痛点的 “神器”。

它能免费获取全球股票、基金、加密货币等金融产品的实时与历史数据,一行代码搞定过去 10 年的日 K 线,三行代码下载公司财报,还能轻松获取分红、拆股、市值等关键信息。更重要的是,它完全免费、无需注册 API 密钥,且用法简单到新手也能快速上手。
本文从实际场景出发,通过 “环境搭建→基础数据获取→高级分析→可视化实战” 的递进结构,搭配可直接运行的代码示例(附股票代码说明),帮你从 0 到 1 掌握 yfinance 的核心用法,轻松搞定 90% 的金融数据需求。
一、为什么 yfinance 是金融数据分析的 “首选工具”?

在 yfinance 出现之前,获取金融数据的方式总有各种局限:
- 雅虎财经官网:手动下载数据效率低,无法批量获取,更不能自动化分析;
- 付费 API(如 Alpha Vantage、IEX Cloud):免费额度有限,超出后按调用次数收费,对个人用户不友好;
- pandas-datareader 旧版:曾支持雅虎财经数据,但 2017 年雅虎关闭 API 后失效,后续虽有非官方接口,但稳定性差;
- 爬虫脚本:自己写爬虫爬取金融网站,需处理反爬、解析 HTML,维护成本高。
而 yfinance 的核心优势在于 **“免费、稳定、易用”**,它相当于雅虎财经的 “非官方 Python 接口”,能:
- 获取全品类金融数据:股票、指数(如美股 SP500、A 股沪深 300)、基金、加密货币、外汇等;
- 覆盖多维度信息:历史价格(开盘 / 最高 / 最低 / 收盘 / 成交量)、实时报价、财务报表(资产负债表、利润表)、分红记录、拆股信息、公司基本面(市值、市盈率等);
- 支持灵活的数据粒度:按分钟、小时、日、周、月获取数据,最长可追溯到几十年前;
- 无缝衔接 pandas:返回数据直接是 DataFrame 格式,可直接用 pandas 进行清洗、分析、可视化;
- 完全免费且无需配置:不用注册账号,不用申请 API 密钥,安装后即可使用。
无论是个人投资者分析股票走势、学生做金融课程作业,还是开发者搭建量化交易原型,yfinance 都是性价比极高的选择。
二、环境搭建:3 分钟搞定 yfinance 安装

yfinance 是第三方库,需要手动安装,支持 Python 3.6 及以上版本,推荐搭配 pandas(数据处理)和 matplotlib/seaborn(可视化)使用。
2.1 安装 yfinance
# 基础安装(推荐使用pip) pip install yfinance # 安装最新版本(包含最新功能和bug修复) pip install yfinance --upgrade 2.2 验证安装
安装完成后,在 Python 环境中导入库,若不报错则安装成功:
import yfinance as yf # 约定俗成的简写,必须记住 import pandas as pd # 用于数据处理 import matplotlib.pyplot as plt # 用于可视化 # 查看yfinance版本(可选) print("yfinance版本:", yf.__version__) # 输出如:0.2.31 2.3 准备工作:了解股票代码格式
使用 yfinance 获取数据时,需要知道金融产品的 “代码”,不同市场的代码格式不同:
- 美股:直接用股票代码(如苹果 AAPL、微软 MSFT、特斯拉 TSLA);
- A 股:在代码后加 “.SS”(上交所,如贵州茅台 600519.SS)或 “.SZ”(深交所,如宁德时代 300750.SZ);
- 港股:在代码后加 “.HK”(如腾讯00700.HK);
- 指数:如标普 500^GSPC、纳斯达克 ^IXIC、沪深 300000300.SS;
可以在雅虎财经官网(https://finance.yahoo.com/)搜索公司名称,获取对应的代码。
三、基础操作:获取单只股票的核心数据

yfinance 的核心用法是通过Ticker对象操作单只股票,获取价格、财务数据等信息。我们以苹果公司(代码 AAPL)为例,演示基础操作。
3.1 创建 Ticker 对象:绑定股票
# 创建苹果公司的Ticker对象(参数是股票代码) aapl = yf.Ticker("AAPL") # 后续所有关于苹果股票的操作,都通过这个aapl对象实现 Ticker对象就像一个 “股票数据接口”,通过它可以调用各种方法获取数据。
3.2 获取股票基本信息:公司概况、市值、市盈率
想快速了解一家公司的基本情况(如行业、市值、市盈率),用info属性:
# 获取苹果公司的基本信息(返回字典) aapl_info = aapl.info # 打印关键信息(字典键值对形式) print("公司名称:", aapl_info["longName"]) # 苹果公司 print("行业:", aapl_info["industry"]) # 电子设备制造 print("市值(美元):", aapl_info["marketCap"]) # 约2.8万亿(实时变动) print("市盈率(TTM):", aapl_info["trailingPE"]) # 约30(实时变动) print("52周最高价(美元):", aapl_info["fiftyTwoWeekHigh"]) print("52周最低价(美元):", aapl_info["fiftyTwoWeekLow"]) print("股息率(%):", aapl_info["dividendYield"] * 100) # 乘以100转为百分比 info返回的字典包含上百个键,常用的有:
- 公司信息:
longName(全称)、sector(板块)、industry(行业)、country(国家); - 估值指标:
marketCap(市值)、trailingPE(动态市盈率)、forwardPE(前瞻市盈率)、bookValue(每股净资产); - 价格指标:
currentPrice(当前价格)、fiftyTwoWeekHigh/fiftyTwoWeekLow(52 周高低价); - 分红指标:
dividendYield(股息率)、payoutRatio(派息率)。
如果想查看所有信息,直接打印aapl_info即可(建议用pd.Series(aapl_info)格式化输出)。
3.3 获取历史价格数据:日 K、周 K、月 K 线
获取历史价格是最常用的功能,通过history()方法实现,支持自定义时间范围和数据粒度。
3.3.1 基础用法:获取指定时间范围的日线数据
# 获取苹果公司2023年的日K线数据 aapl_hist = aapl.history( start="2023-01-01", # 开始日期(格式YYYY-MM-DD) end="2023-12-31", # 结束日期(左闭右开,不包含end当天) interval="1d" # 数据粒度:1d(日线)、1wk(周线)、1mo(月线) ) # 查看数据结构(返回pandas DataFrame) print(aapl_hist.head()) # 打印前5行 输出结果是一个索引为日期的 DataFrame,包含以下列:
Open:开盘价High:最高价Low:最低价Close:收盘价Volume:成交量Dividends:股息(非分红日为 0)Stock Splits:拆股比例(非拆股日为 0)
3.3.2 简化用法:按时间周期获取(无需手动写日期)
# 获取过去1年的周线数据 aapl_1y_weekly = aapl.history(period="1y", interval="1wk") # 获取过去3个月的月线数据 aapl_3mo_monthly = aapl.history(period="3mo", interval="1mo") # period参数可选值:1d(1天)、5d(5天)、1mo(1个月)、3mo(3个月)、6mo(6个月)、 # 1y(1年)、2y(2年)、5y(5年)、10y(10年)、ytd(今年以来)、max(全部历史) 3.3.3 复权处理:获取调整后价格
股票分红或拆股后,价格会出现 “断层”,history()默认返回 “未复权” 价格。若需要 “后复权” 价格(即考虑分红再投资后的连续价格),需指定auto_adjust=True:
# 获取复权后的价格(推荐用于趋势分析) aapl_adjusted = aapl.history(period="5y", auto_adjust=True) # 此时Close列即为复权后的收盘价 3.4 获取实时价格:最新报价
history()获取的是历史数据,若想获取当前最新价格,可用以下两种方式:
方式 1:从 info 中提取(简单但可能有延迟)
# 从基本信息中获取当前价格 current_price = aapl.info["currentPrice"] print(f"苹果当前价格:{current_price:.2f}美元") 方式 2:用 history 获取最近 1 条数据(更实时)
# 获取最近1天的价格(包含最新收盘价) latest_data = aapl.history(period="1d") # 提取最新收盘价 latest_close = latest_data["Close"].iloc[-1] # iloc[-1]取最后一行 print(f"苹果最新收盘价:{latest_close:.2f}美元") 注意:yfinance 的实时数据有 15-20 分钟延迟,这是雅虎财经的限制,免费接口无法获取真正的实时数据(需付费订阅)。
3.5 获取分红与拆股记录
对于长期投资者,分红和拆股是重要参考,yfinance 可直接提取这些信息:
3.5.1 分红记录
# 获取苹果公司的分红记录 aapl_dividends = aapl.dividends # 打印近5次分红 print(aapl_dividends.tail(5)) # 索引是分红日期,值是每股分红金额(美元) 输出示例:
Date 2023-02-10 0.23 2023-05-12 0.24 2023-08-11 0.24 2023-11-10 0.25 2024-02-09 0.25 Name: Dividends, dtype: float64 3.5.2 拆股记录
# 获取苹果公司的拆股记录 aapl_splits = aapl.splits # 打印所有拆股记录(苹果历史上多次拆股,如1:7、1:4) print(aapl_splits) 输出示例(拆股比例表示每 1 股拆为 n 股):
Date 2014-06-09 7.0 2020-08-31 4.0 Name: Stock Splits, dtype: float64 四、高级功能:财务报表、多股票批量获取与筛选

除了价格数据,yfinance 还能获取公司财务报表(资产负债表、利润表等),并支持批量处理多只股票,满足更深入的分析需求。
4.1 获取财务报表:资产负债表、利润表、现金流量表
财务报表是分析公司基本面的核心数据,yfinance 提供了balance_sheet(资产负债表)、income_stmt(利润表)、cashflow(现金流量表)三个属性。
4.1.1 资产负债表
# 获取苹果公司的资产负债表(按年度) aapl_balance_sheet = aapl.balance_sheet # 查看前5行(每行是一个科目,每列是一个财年) print(aapl_balance_sheet.head()) 输出示例(科目为行,财年为列,数值单位:美元):
2023-09-30 2022-09-30 2021-09-30 2020-09-30 Total Assets 352755000000.0 352583000000.0 351002000000.0 323888000000.0 Total Liabilities Net Minority Interest 290437000000.0 287912000000.0 287912000000.0 258549000000.0 Total Equity Gross Minority Interest 62318000000.0 64671000000.0 63090000000.0 65339000000.0 ... 4.1.2 利润表
# 获取苹果公司的利润表(按年度) aapl_income_stmt = aapl.income_stmt # 查看营收、净利润等关键科目 print("营收:\n", aapl_income_stmt.loc["Total Revenue"]) # 按科目名提取 print("净利润:\n", aapl_income_stmt.loc["Net Income"]) 输出示例(展示每年的营收和净利润):
营收: 2023-09-30 383353000000.0 2022-09-30 387537000000.0 2021-09-30 365817000000.0 2020-09-30 274515000000.0 Name: Total Revenue, dtype: float64 净利润: 2023-09-30 96995000000.0 2022-09-30 99803000000.0 2021-09-30 94680000000.0 2020-09-30 57411000000.0 Name: Net Income, dtype: float64 4.1.3 现金流量表
# 获取苹果公司的现金流量表(按年度) aapl_cashflow = aapl.cashflow # 查看经营活动现金流 print("经营活动现金流:\n", aapl_cashflow.loc["Operating Cash Flow"]) 4.1.4 获取季度财务报表
默认获取的是年度报表,若需要季度数据,用quarterly_前缀:
# 季度资产负债表 aapl_quarterly_balance = aapl.quarterly_balance_sheet # 季度利润表 aapl_quarterly_income = aapl.quarterly_income_stmt 4.2 批量获取多只股票数据:yf.download ()
当需要分析多只股票(如对比苹果、微软、谷歌)时,用yf.download()更高效,可一次性获取多只股票的数据。
4.2.1 批量获取历史价格
# 定义要分析的股票代码列表(苹果、微软、谷歌) tickers = ["AAPL", "MSFT", "GOOGL"] # 批量获取2023年的日线数据 multi_stocks = yf.download( tickers=tickers, start="2023-01-01", end="2023-12-31", interval="1d", auto_adjust=True # 复权处理 ) # 查看数据结构(MultiIndex多层索引:第一层是指标,第二层是股票代码) print(multi_stocks.head()) 返回的 DataFrame 是多层索引结构:
- 列索引第一层:
Open、High、Low、Close、Volume(指标); - 列索引第二层:
AAPL、MSFT、GOOGL(股票代码)。
提取单只股票的数据:
# 提取苹果的收盘价 aapl_close = multi_stocks["Close"]["AAPL"] # 提取所有股票的收盘价(形成新的DataFrame) all_close = multi_stocks["Close"] 4.2.2 批量获取基本信息:快速筛选股票
通过yf.Tickers(注意是复数)批量创建多个 Ticker 对象,再提取基本信息进行筛选:
# 批量创建多只股票的Tickers对象 tickers = yf.Tickers("AAPL MSFT GOOGL AMZN META") # 空格分隔股票代码 # 提取每只股票的市值和市盈率,筛选出市值大于1万亿美元且市盈率<30的股票 筛选结果 = [] for ticker in tickers.tickers: # 遍历每只股票 info = ticker.info # 处理可能的缺失值(部分股票信息可能不全) market_cap = info.get("marketCap", 0) pe = info.get("trailingPE", float("inf")) # 默认为无穷大(不满足条件) if market_cap > 1e12 and pe < 30: # 市值>1万亿,市盈率<30 筛选结果.append({ "代码": ticker.ticker, "名称": info.get("longName", "未知"), "市值(万亿)": market_cap / 1e12, "市盈率": pe }) # 转为DataFrame展示 筛选_df = pd.DataFrame(筛选结果) print(筛选_df) 这个方法可用于快速从多只股票中筛选出符合条件的标的(如低市盈率、高股息率等)。
4.3 获取指数成分股:如标普 500、沪深 300
想获取某个指数的所有成分股(如标普 500 包含的 500 只股票),可通过yf.Ticker对象的components属性:
# 获取标普500指数的成分股 sp500 = yf.Ticker("^GSPC") # 标普500代码是^GSPC sp500_components = sp500.components # 查看前10只成分股 print(sp500_components.head(10)) # 索引是股票代码,包含公司名称等信息 输出示例(标普 500 前 10 大成分股,按权重排序):
company symbol AAPL Apple Inc. MSFT Microsoft Corp. AMZN Amazon.com Inc. NVDA NVIDIA Corporation GOOGL Alphabet Inc. Class A ... 注意:部分指数(如沪深 300)的components可能返回空值,这是因为雅虎财经未提供完整数据,可尝试其他数据源补充。五、数据可视化:用图表直观展示股票特征

获取数据后,通过可视化能更直观地发现趋势和规律。我们结合 matplotlib 和 seaborn,演示几个常用的金融图表。
5.1 股票价格走势:收盘价折线图
import matplotlib.pyplot as plt import seaborn as sns sns.set_style("whitegrid") # 设置图表风格 plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"] # 解决中文显示问题 # 获取苹果和微软过去5年的复权收盘价 tickers = ["AAPL", "MSFT"] df = yf.download(tickers, period="5y", auto_adjust=True)["Close"] # 绘制折线图 plt.figure(figsize=(12, 6)) # 图表大小 plt.plot(df["AAPL"], label="苹果(AAPL)", linewidth=2) plt.plot(df["MSFT"], label="微软(MSFT)", linewidth=2) # 添加标题和标签 plt.title("苹果与微软近5年股价走势(复权后)", fontsize=15) plt.xlabel("日期", fontsize=12) plt.ylabel("收盘价(美元)", fontsize=12) plt.legend() # 显示图例 plt.show() 通过这个图表,可以直观对比两只股票的长期走势和涨幅差异。
5.2 成交量柱状图:分析交易活跃度
# 获取特斯拉过去1年的日线数据(包含成交量) tsla = yf.download("TSLA", period="1y", interval="1d") # 创建图表(价格和成交量共用x轴) fig, ax1 = plt.subplots(figsize=(12, 6)) # 绘制收盘价(左y轴) ax1.plot(tsla["Close"], color="blue", label="收盘价") ax1.set_ylabel("收盘价(美元)", color="blue") ax1.tick_params(axis="y", labelcolor="blue") # 创建右侧y轴,绘制成交量 ax2 = ax1.twinx() ax2.bar(tsla.index, tsla["Volume"], color="gray", alpha=0.3, label="成交量") ax2.set_ylabel("成交量", color="black") ax2.tick_params(axis="y", labelcolor="black") # 添加标题和图例 plt.title("特斯拉近1年股价与成交量", fontsize=15) fig.legend(loc="upper left") plt.show() 成交量往往与价格波动相关(如价格大涨时成交量放大,可能预示趋势延续)。
5.3 均线分析:判断短期与长期趋势
均线(如 5 日均线、20 日均线)是技术分析的常用工具,5 日均线反映短期趋势,20 日均线反映中期趋势:
# 获取茅台(600519.SS)过去1年的日线数据 maotai = yf.download("600519.SS", period="1y", auto_adjust=True)["Close"] # 计算5日均线和20日均线(用rolling窗口函数) ma5 = maotai.rolling(window=5).mean() # 5日均线:过去5天收盘价的均值 ma20 = maotai.rolling(window=20).mean() # 20日均线 # 绘制图表 plt.figure(figsize=(12, 6)) plt.plot(maotai, label="收盘价", alpha=0.7) plt.plot(ma5, label="5日均线", color="orange") plt.plot(ma20, label="20日均线", color="green") plt.title("贵州茅台近1年收盘价与均线", fontsize=15) plt.xlabel("日期") plt.ylabel("价格(人民币)") plt.legend() plt.show() 均线交叉是常见信号:5 日均线上穿 20 日均线(金叉)可能预示上涨,下穿(死叉)可能预示下跌。
5.4 股票收益率对比:分析投资回报
比较多只股票的收益率(涨跌幅),能直观展示投资回报差异:
# 获取4只科技股过去3年的收盘价 tickers = ["AAPL", "MSFT", "GOOGL", "AMZN"] df = yf.download(tickers, period="3y", auto_adjust=True)["Close"] # 计算累计收益率:(当前价格 / 初始价格) - 1(初始价格设为100,便于对比) df_normalized = (df / df.iloc[0] * 100) # 标准化:初始值为100 # 绘制收益率曲线 plt.figure(figsize=(12, 6)) for column in df_normalized.columns: plt.plot(df_normalized[column], label=column) plt.title("科技股近3年累计收益率对比(初始值=100)", fontsize=15) plt.xlabel("日期") plt.ylabel("累计收益(初始100)") plt.legend() plt.show() 通过标准化处理,能清晰看出哪只股票在过去 3 年表现更好(曲线越高,收益越高)。
六、实战案例:美股科技股基本面与技术面综合分析

我们以 “美股四大科技股(苹果 AAPL、微软 MSFT、谷歌 GOOGL、亚马逊 AMZN)” 为分析对象,从基本面(财务指标)和技术面(价格走势)两方面展开分析,完整演示 yfinance 的实战应用。
6.1 分析目标
- 对比四只股票的基本估值(市值、市盈率、股息率);
- 分析近 3 年营收和净利润增长情况;
- 对比近 1 年股价走势和收益率;
- 筛选出 “估值合理且增长稳定” 的标的。
6.2 代码实现
import yfinance as yf import pandas as pd import matplotlib.pyplot as plt import seaborn as sns sns.set_style("whitegrid") plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"] # 1. 准备数据:定义股票列表 tickers_list = ["AAPL", "MSFT", "GOOGL", "AMZN"] # 2. 基本面分析:获取估值指标 fundamental_data = [] for ticker in tickers_list: stock = yf.Ticker(ticker) info = stock.info # 提取关键指标(处理可能的缺失值) fundamental_data.append({ "代码": ticker, "公司名称": info.get("longName", "未知"), "市值(万亿)": round(info.get("marketCap", 0) / 1e12, 2), "市盈率(TTM)": round(info.get("trailingPE", 0), 2), "股息率(%)": round(info.get("dividendYield", 0) * 100, 2), "营收增长率(%)": round(info.get("revenueGrowth", 0) * 100, 2) }) # 转为DataFrame并展示 fundamental_df = pd.DataFrame(fundamental_data) print("基本面估值指标:") print(fundamental_df) # 3. 财务增长分析:营收和净利润 # 获取利润表(年度) income_stmt_list = [] for ticker in tickers_list: stock = yf.Ticker(ticker) income_stmt = stock.income_stmt.T # 转置:行是财年,列是科目 income_stmt["代码"] = ticker income_stmt_list.append(income_stmt[["Total Revenue", "Net Income", "代码"]]) # 合并数据 income_combined = pd.concat(income_stmt_list) # 只保留近3年数据 income_3y = income_combined.sort_index().tail(3 * len(tickers_list)) # 3年×4只股票 # 绘制营收增长柱状图 plt.figure(figsize=(12, 6)) sns.barplot(x=income_3y.index, y="Total Revenue", hue="代码", data=income_3y) plt.title("四大科技股近3年营收对比(美元)", fontsize=15) plt.xticks(rotation=45) plt.ylabel("营收(10亿美元)") # 注意单位转换 plt.show() # 4. 技术面分析:近1年股价走势与收益率 # 获取近1年收盘价 price_data = yf.download(tickers_list, period="1y", auto_adjust=True)["Close"] # 计算累计收益率(标准化) return_data = (price_data / price_data.iloc[0] - 1) * 100 # 转为百分比 # 绘制收益率曲线 plt.figure(figsize=(12, 6)) for column in return_data.columns: plt.plot(return_data.index, return_data[column], label=column, linewidth=2) plt.title("四大科技股近1年累计收益率(%)", fontsize=15) plt.xlabel("日期") plt.ylabel("累计收益率(%)") plt.legend() plt.show() # 5. 筛选结果:找出市盈率<30且近1年收益率>10%的股票 latest_return = return_data.iloc[-1] # 最新累计收益率 filter_mask = (fundamental_df["市盈率(TTM)"] < 30) & (latest_return > 10) filtered = fundamental_df[filter_mask] print("\n筛选结果(市盈率<30且近1年收益率>10%):") print(filtered) 6.3 分析结论(示例)
- 估值对比:微软市值最高(约 2.9 万亿美元),谷歌市盈率最低(约 25),苹果股息率最高(约 0.55%);
- 财务增长:微软和苹果营收稳定增长,亚马逊近 1 年营收增速最快(约 12%);
- 股价表现:近 1 年英伟达(未在列表中)涨幅最高,但列表中微软涨幅领先(约 25%);
- 筛选结果:微软和谷歌同时满足 “市盈率 < 30” 和 “近 1 年收益率 > 10%”,估值合理且表现稳定。
七、避坑指南:yfinance 新手常遇到的 8 个问题

1. 数据延迟或缺失:“为什么获取的价格和官网不一样?”
原因:yfinance 数据来自雅虎财经,免费接口有 15-20 分钟延迟,部分小众股票数据可能不全。解决:实时数据需付费订阅雅虎财经高级版;缺失数据可尝试更换股票代码(如 A 股用 “.SS” 而非 “.CN”)。
2. 财务报表为空:“为什么 balance_sheet 返回空 DataFrame?”
原因:部分公司(尤其是非美国公司)的财务数据未被雅虎财经收录,或财年未结束。解决:检查股票代码是否正确(如港股用 “.HK”);尝试获取季度报表(quarterly_balance_sheet);补充其他数据源(如新浪财经)。
3. 批量获取时部分股票数据缺失:“multi_stocks 里有 NaN 值”
原因:不同股票的交易日可能不同(如 A 股休市时美股正常交易)。解决:用dropna()删除全 NaN 行,或用fillna(method='ffill')向前填充:
multi_stocks = multi_stocks.dropna(how="all") # 删除全是NaN的行 4. 时间范围错误:“start 日期设置了但数据从更早开始”
原因:end参数是 “左闭右开”,若设置end="2023-12-31",实际包含到 2023-12-30;若股票在 start 日期前无数据,会自动从最早日期开始。解决:检查股票上市时间(通过info["firstTradeDateEpochUtc"]),确保 start 日期在上市之后。
5. 索引格式问题:“无法按日期筛选数据”
原因:history()返回的索引是DatetimeIndex,若转为字符串会导致筛选失败。解决:保持索引为 datetime 格式,用loc筛选:
# 正确:按日期范围筛选 df_2023_q1 = aapl_hist.loc["2023-01-01":"2023-03-31"] 6. 拆股后价格异常:“股价突然下跌 90%”
原因:未启用复权处理,拆股(如 1:10)会导致价格 “断崖式下跌”。解决:获取数据时设置auto_adjust=True,使用复权后的价格:
aapl_hist = aapl.history(period="5y", auto_adjust=True) # 复权处理 7. 运行速度慢:“批量获取 100 只股票要等很久”
原因:单线程请求速度有限,股票数量越多耗时越长。解决:减少不必要的股票数量;缩短时间范围;使用多线程批量获取(进阶)。
8. 代码突然报错:“以前能运行现在不行了”
原因:雅虎财经接口变动(历史上多次发生),导致 yfinance 适配失效。解决:升级 yfinance 到最新版本:pip install yfinance --upgrade;查看官方 GitHub(https://github.com/ranaroussi/yfinance)的 issue,确认是否有兼容问题。
八、总结:yfinance 学习路径与进阶方向
核心知识点回顾
- 基础操作:
Ticker对象创建、基本信息(info)、历史价格(history())、实时价格获取; - 高级数据:财务报表(资产负债表、利润表)、分红与拆股记录、指数成分股;
- 批量处理:
yf.download()批量获取多股票数据、yf.Tickers批量分析; - 可视化:价格走势、成交量、均线、收益率对比图表绘制;
- 实战应用:结合基本面与技术面分析,筛选优质股票。
进阶学习建议
- 量化策略开发:用 yfinance 获取数据,结合 Backtrader 等框架回测交易策略(如均线交叉策略、动量策略);
- 财务比率分析:基于财务报表计算 ROE(净资产收益率)、毛利率、资产负债率等指标,评估公司盈利能力;
- 自动化监控:编写定时脚本(如用
schedule库),每日获取股票数据并发送价格提醒(邮件 / 微信); - 多数据源融合:将 yfinance 数据与其他数据源(如 Tushare 获取 A 股数据、聚宽量化平台)结合,扩大分析范围;
- 性能优化:学习多线程 / 异步请求,提高批量获取数据的效率。
yfinance 的优势在于 “简单易用 + 免费稳定”,非常适合新手入门金融数据分析。但需注意,它的局限性在于数据延迟和部分财务数据不全,生产环境中可能需要结合付费 API 使用。
学习的关键是 “边用边查”—— 遇到问题时查看官方文档(https://pypi.org/project/yfinance/)或 GitHub 仓库,同时多分析实际股票数据,逐渐积累金融知识与编程技能的结合经验。