目录
一、为什么 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 仓库,同时多分析实际股票数据,逐渐积累金融知识与编程技能的结合经验。

1112

被折叠的 条评论
为什么被折叠?



