跳到主要内容yfinance Python 库深度解析与实战指南 | 极客日志Python
yfinance Python 库深度解析与实战指南
Python 库 yfinance 的安装、核心对象 Ticker 与 Tickers 的使用,涵盖历史数据获取、基本面分析、期权数据及批量处理等高级功能。通过 Pandas DataFrame 格式展示数据,并提供错误处理、代理设置及频率限制等注意事项,帮助用户高效从 Yahoo Finance 获取金融数据。
moshang4 浏览 yfinance 深度解析教程 (Python)
yfinance 是一个非常流行的 Python 库,允许用户从 Yahoo Finance 下载金融市场数据。它提供了一种简单方便的方式来获取股票价格、历史数据、基本面信息、期权数据等。本教程将深入探讨 yfinance 的核心功能和高级用法。
1. 简介与安装
1.1 什么是 yfinance?
yfinance 是一个开源的 Python 库,它最初是作为 pandas-datareader 库修复雅虎财经 API 变化的解决方案而创建的,后来发展成为一个独立且功能强大的库,专门用于从 Yahoo Finance 获取数据。
1.2 为什么选择 yfinance?
免费:
易用: API 设计简洁直观。功能丰富: 支持多种数据类型(历史价格、基本面、期权等)。与 Pandas 集成: 返回的数据通常是 Pandas DataFrame 或 Series 格式,方便后续分析。1.3 安装 yfinance
pip install yfinance --upgrade --no-cache-dir
建议加上 --upgrade --no-cache-dir 以确保安装最新版本并避免缓存问题。
同时,我们通常需要 pandas 来处理数据,如果未安装,也一并安装:
2. 核心对象:Ticker
yfinance 的主要入口点是 Ticker 类。你需要为你想要获取数据的每个金融工具(股票、ETF、指数等)创建一个 Ticker 实例。
2.1 创建 Ticker 对象
import yfinance as yf
import pandas as pd
aapl = yf.Ticker("AAPL")
msft = yf.Ticker("MSFT")
tencent = yf.Ticker("0700.HK")
sp500 = yf.Ticker("^GSPC")
print(aapl)
这里的 'AAPL', 'MSFT', '0700.HK', '^GSPC' 就是所谓的 Ticker Symbol(股票代码)。你需要知道你感兴趣的金融工具在 Yahoo Finance 上的代码。
2.2 获取股票信息 (info)
info 属性返回一个包含该股票大量信息的 Python 字典。
aapl_info = aapl.info
print(f"公司名称:{aapl_info.get('longName','N/A')}")
print(f"所在行业:{aapl_info.get('industry','N/A')}")
print(f"所在板块:{aapl_info.get('sector','N/A')}")
print(f"公司简介:{aapl_info.get('longBusinessSummary','N/A')[:100]}...")
print(f"市值:{aapl_info.get('marketCap','N/A')}")
print(f"市盈率 (TTM): {aapl_info.get('trailingPE','N/A')}")
print(f"远期市盈率:{aapl_info.get('forwardPE','N/A')}")
print(f"股息率:{aapl_info.get('dividendYield','N/A')}")
注意: info 字典中的字段并非对所有 Ticker 都完整可用,某些字段可能缺失(返回 None 或不存在)。使用 .get(key, default_value) 是更安全的访问方式。
3. 获取历史市场数据 (history)
这是 yfinance 最常用的功能之一,用于获取 OHLCV(开盘价、最高价、最低价、收盘价、成交量)数据。
3.1 基本用法 (周期 period)
history() 方法可以通过 period 参数指定获取数据的时间跨度。
hist_1y = aapl.history(period="1y")
print("过去一年的日线数据 (前 5 条):")
print(hist_1y.head())
hist_max = aapl.history(period="max")
print(f"\n获取了 {len(hist_max)} 条历史数据 (从 {hist_max.index.min()} 到 {hist_max.index.max()})")
3.2 指定时间范围 (start, end)
也可以使用 start 和 end 参数指定具体的开始和结束日期(格式通常为 'YYYY-MM-DD')。
hist_2023 = aapl.history(start="2023-01-01", end="2024-01-01")
print("\n2023 年全年日线数据 (后 5 条):")
print(hist_2023.tail())
3.3 不同时间间隔 (interval)
hist_5d_1m = aapl.history(period="5d", interval="1m")
print("\n过去 5 天的 1 分钟 K 线数据 (前 5 条):")
print(hist_5d_1m.head())
hist_6mo_wk = aapl.history(period="6mo", interval="1wk")
print("\n过去 6 个月的周线数据 (前 5 条):")
print(hist_6mo_wk.head())
- 分钟级别 (
1m, 2m 等) 的数据通常只能获取最近 7 天(对于 1m)或 60 天(对于其他分钟级别)的数据。
- 请求过于频繁或数据量过大可能导致 Yahoo Finance 暂时阻止你的 IP。
3.4 数据格式 (Pandas DataFrame)
history() 方法返回的是一个 Pandas DataFrame,索引是日期(或时间戳),列包括:
Open: 开盘价
High: 最高价
Low: 最低价
Close: 收盘价
Volume: 成交量
Dividends: 股息 (如果当天有派息)
Stock Splits: 股票分割比例 (如果当天有分割)
print("\n历史数据 DataFrame 的列名:")
print(hist_1y.columns)
print("\n历史数据 DataFrame 的索引类型:")
print(type(hist_1y.index))
3.5 其他参数 (如 actions)
默认情况下,Dividends 和 Stock Splits 列包含在内。你也可以通过 actions=True (默认) 或 actions=False 控制是否获取这些信息。还有其他参数如 auto_adjust (自动调整价格以反映股息和拆分,默认为 True) 等,可以查阅文档了解更多。
hist_no_actions = aapl.history(period="1y", actions=False)
print("\n不包含 actions 的列名:")
print(hist_no_actions.columns)
hist_unadjusted = aapl.history(period="1y", auto_adjust=False)
print("\n未自动调整价格的列名:")
print(hist_unadjusted.columns)
print(hist_unadjusted.head())
4. 获取基本面数据
yfinance 提供了访问公司财务报表和其他基本面数据的方法。
4.1 财务报表 (financials, balance_sheet, cashflow)
这些方法返回包含年度和季度财务报表的 Pandas DataFrame。
financials = aapl.financials
print("\n年度损益表 (部分):")
print(financials)
balance_sheet = aapl.balance_sheet
print("\n年度资产负债表 (部分):")
print(balance_sheet.head())
cashflow = aapl.cashflow
print("\n年度现金流量表 (部分):")
print(cashflow.head())
4.2 盈利 (earnings)
这个属性似乎已被整合或弃用,更常用的查看盈利信息的方式是通过 financials 或 calendar / earnings_dates。旧版本可能有 aapl.earnings。
4.3 季度数据
默认情况下,上述财务报表方法返回年度数据。可以通过相应的 quarterly_ 属性获取季度数据。
q_financials = aapl.quarterly_financials
print("\n季度损益表 (部分):")
print(q_financials)
q_balance_sheet = aapl.quarterly_balance_sheet
print("\n季度资产负债表 (部分):")
print(q_balance_sheet.head())
q_cashflow = aapl.quarterly_cashflow
print("\n季度现金流量表 (部分):")
print(q_cashflow.head())
5. 获取其他关键数据
5.1 股票行为 (actions, dividends, splits)
actions: 返回一个包含所有股息和股票分割记录的 DataFrame。
dividends: 只返回股息记录 (Series)。
splits: 只返回股票分割记录 (Series)。
actions = aapl.actions
print("\n股票行为 (股息与拆分):")
print(actions.tail())
dividends = aapl.dividends
print("\n股息历史 (最近 5 条):")
print(dividends.tail())
splits = aapl.splits
print("\n股票分割历史:")
print(splits)
5.2 持股信息 (major_holders, institutional_holders)
major_holders: 主要股东信息 (通常是内部人士和持股比例较大的股东)。
institutional_holders: 机构持股者信息。
major_holders = aapl.major_holders
print("\n主要股东:")
print(major_holders)
inst_holders = aapl.institutional_holders
print("\n机构持股者 (前 10):")
print(inst_holders.head(10))
注意: 这些持股数据更新可能不及时,且并非对所有 Ticker 都可用。
5.3 推荐评级 (recommendations)
recommendations = aapl.recommendations
print("\n分析师推荐评级 (最近 10 条):")
print(recommendations.tail(10))
DataFrame 通常包含日期、评级机构、评级变化(例如 从 Buy 到 Strong Buy)等信息。
5.4 公司日历与盈利日期 (calendar, earnings_dates)
calendar: 通常包含下一次盈利发布的日期范围和相关事件。
earnings_dates: 提供历史上的盈利公告日期、EPS 预期和实际值。
calendar = aapl.calendar
print("\n公司日历 (下次财报):")
print(calendar)
try:
earnings_dates = aapl.earnings_dates
print("\n历史盈利日期 (最近几次):")
print(earnings_dates.tail())
except Exception as e:
print(f"\n获取盈利日期失败:{e}")
5.5 ISIN 代码 (isin)
isin = aapl.isin
print(f"\nAAPL 的 ISIN 代码:{isin}")
注意: isin 属性有时可能返回 - 或空值,如果 Yahoo Finance 没有提供该数据。
5.6 相关新闻 (news)
获取与该 Ticker 相关的最新新闻标题和链接。
news = aapl.news
print("\n相关新闻 (部分):")
if news:
for item in news[:5]:
print(f"- 标题:{item.get('title')}")
print(f" 发布者:{item.get('publisher')}")
print(f" 链接:{item.get('link')}")
else:
print("未能获取到相关新闻。")
新闻列表包含字典,每个字典代表一条新闻,包含标题 (title)、链接 (link)、发布者 (publisher)、发布时间 (providerPublishTime - Unix 时间戳) 等信息。
6. 获取期权数据
yfinance 也可以用来获取股票的期权链数据。
6.1 获取期权到期日 (options)
options 属性返回一个包含所有可用期权到期日的元组。
try:
option_dates = aapl.options
print("\n可用的期权到期日 (前几个):")
print(option_dates[:5])
except Exception as e:
print(f"\n获取期权到期日失败 (可能该 Ticker 没有期权): {e}")
6.2 获取特定到期日的期权链 (option_chain)
使用 option_chain() 方法,并传入一个到期日字符串,可以获取该日期的看涨 (Calls) 和看跌 (Puts) 期权链。
if option_dates:
first_expiry = option_dates[0]
opt_chain = aapl.option_chain(first_expiry)
calls = opt_chain.calls
puts = opt_chain.puts
print(f"\n{first_expiry} 到期的看涨期权 (部分):")
print(calls.head())
print(f"\n{first_expiry} 到期的看跌期权 (部分):")
print(puts.head())
print("\n看涨期权数据列名:")
print(calls.columns)
注意: 期权数据可能比较庞大,获取时可能需要一些时间。
7. 处理多个 Ticker (Tickers)
如果你需要同时处理多个股票代码,使用 Tickers 类比为每个代码单独创建 Ticker 对象更高效,尤其是在批量下载历史数据时。
7.1 创建 Tickers 对象
将多个 Ticker Symbol 字符串(用空格分隔)或一个列表传递给 yf.Tickers()。
tickers_list = ["AAPL","MSFT","GOOG","AMZN"]
tickers = yf.Tickers(" ".join(tickers_list))
print(tickers)
7.2 批量下载历史数据
Tickers 对象的 history() 方法可以一次性下载所有 Ticker 的历史数据。返回的 DataFrame 使用多层列索引 (MultiIndex),第一层是 Ticker Symbol,第二层是 OHLCV 等数据字段。
multi_hist = tickers.history(period="1mo")
print("\n批量获取的历史数据 (部分):")
print(multi_hist.head())
print("\n多层列索引:")
print(multi_hist.columns)
print("\n访问 AAPL 的收盘价:")
print(multi_hist['AAPL']['Close'].head())
7.3 访问单个 Ticker 数据
Tickers 对象内部包含一个字典 tickers.tickers,其键是 Ticker Symbol,值是对应的 Ticker 对象。你可以通过这个字典访问单个 Ticker 的所有方法和属性。
goog_ticker = tickers.tickers['GOOG']
goog_info = goog_ticker.info
print(f"\nGoogle 的公司名称:{goog_info.get('longName')}")
goog_financials = goog_ticker.financials
print("\nGoogle 的年度损益表 (部分):")
print(goog_financials.head())
这种方式在需要获取不同类型数据(如某些股票的历史数据,另一些股票的基本面信息)时很有用,但如果是统一获取同一种数据(如所有股票的历史收盘价),直接使用 Tickers 对象的批量方法通常更优。
7.4 使用 yf.download() 批量下载
yfinance 还提供了一个便捷的顶层函数 yf.download(),专门用于批量下载历史数据,通常比 Tickers.history() 更常用且可能更稳定。
data = yf.download("NVDA TSLA NFLX", start="2024-01-01", end="2024-04-01")
print("\n使用 yf.download() 获取的数据 (部分):")
print(data.head())
print("\nyf.download() 返回的列索引:")
print(data.columns)
print("\n所有股票的收盘价:")
print(data['Close'].head())
print("\nTSLA 的所有数据:")
print(data.xs('TSLA', level=1, axis=1).head())
data_grouped_by_ticker = yf.download("NVDA TSLA NFLX", start="2024-01-01", end="2024-04-01", group_by='ticker')
print("\n按 Ticker 分组的数据 (部分):")
print(data_grouped_by_ticker.head())
print("\n按 Ticker 分组的列索引:")
print(data_grouped_by_ticker.columns)
print("\n访问 TSLA 的收盘价 (按 Ticker 分组):")
print(data_grouped_by_ticker['TSLA']['Close'].head())
yf.download() 是批量获取历史数据的推荐方式。
8. 高级技巧与注意事项
8.1 错误处理 (无效 Ticker)
当请求一个不存在或 Yahoo Finance 没有数据的 Ticker 时,yfinance 可能会抛出错误或返回空数据。在处理用户输入或大量 Ticker 列表时,进行错误处理很重要。
invalid_ticker_symbol = "INVALIDTICKERXYZ"
try:
invalid_ticker = yf.Ticker(invalid_ticker_symbol)
info = invalid_ticker.info
hist = invalid_ticker.history(period="1d")
if not info and hist.empty:
print(f"\nTicker '{invalid_ticker_symbol}' 似乎无效或没有数据。")
except Exception as e:
print(f"\n处理 Ticker '{invalid_ticker_symbol}' 时发生错误:{e}")
data = yf.download("AAPL INVALIDTICKERXYZ GOOG", period="1d")
print("\n尝试下载包含无效 Ticker 的数据:")
8.2 数据可视化 (简单示例)
获取的数据通常是 Pandas DataFrame,可以方便地使用 matplotlib 或 seaborn 进行可视化。
import matplotlib.pyplot as plt
msft_hist = msft.history(period="1y")
plt.figure(figsize=(10,5))
msft_hist['Close'].plot(title='Microsoft (MSFT) Stock Price (Last Year)')
plt.ylabel('Price (USD)')
plt.xlabel('Date')
plt.grid(True)
plt.show()
plt.figure(figsize=(10,3))
msft_hist['Volume'].plot(kind='bar', title='Microsoft (MSFT) Trading Volume (Last Year)')
plt.ylabel('Volume')
plt.xlabel('Date')
plt.show()
8.3 代理设置 (Proxy)
如果在网络受限的环境(如公司网络)或因请求频繁被暂时限制,可能需要设置代理。
print("\n代理设置:请参考 yfinance 文档以获取最新和最可靠的代理设置方法。")
8.4 请求频率限制
Yahoo Finance 并未公开其确切的请求频率限制,但过于频繁的请求(尤其是在短时间内大量请求不同 Ticker 的多种数据)可能导致 IP 被暂时封禁(通常返回 HTTP 403 或 429 错误)。
- 策略:
- 尽量使用
Tickers 对象或 yf.download() 进行批量操作,而不是在循环中单独请求每个 Ticker。
- 如果在循环中进行请求,请在每次请求后加入适当的延迟(例如
time.sleep(1))。
- 避免不必要的数据请求。
- 如果需要大量数据,考虑分批次、在不同时间进行。
import time
tickers_to_fetch = ["AAPL","MSFT","GOOG","AMZN","META","NVDA","TSLA"]
all_info = {}
for symbol in tickers_to_fetch:
try:
print(f"正在获取 {symbol} 的信息...")
ticker = yf.Ticker(symbol)
all_info[symbol] = ticker.info
time.sleep(1)
except Exception as e:
print(f"获取 {symbol} 信息失败:{e}")
print("\n获取到的部分信息:")
9. 总结
yfinance 是一个功能强大且易于使用的 Python 库,用于从 Yahoo Finance 获取金融数据。本教程涵盖了其核心功能:
- 使用
Ticker 对象获取单个金融工具的数据(info, history, financials, options, news 等)。
- 使用
Tickers 对象或 yf.download() 高效处理多个金融工具。
- 了解了数据的格式 (Pandas DataFrame/Series) 和一些常用参数。
- 讨论了错误处理、可视化基础以及请求频率等注意事项。
- 阅读官方文档: 虽然
yfinance 的文档可能不如一些大型库详尽,但仍然是获取最新信息的主要来源。
- 实践: 尝试获取不同类型 Ticker(股票、ETF、指数、加密货币等)的数据,探索不同的参数组合。
- 结合其他库: 将
yfinance 获取的数据与 pandas 进行深入分析,与 matplotlib/seaborn/plotly 进行高级可视化,或与 scikit-learn 等库进行量化分析。
希望本教程能帮助你更好地理解和使用 yfinance 库!
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online