用 Python yfinance 玩转金融数据:从股票爬取到分析可视化的实战指南

 

 

目录

引言

一、为什么 yfinance 是金融数据分析的 “首选工具”?

二、环境搭建:3 分钟搞定 yfinance 安装

2.1 安装 yfinance

2.2 验证安装

2.3 准备工作:了解股票代码格式

三、基础操作:获取单只股票的核心数据

3.1 创建 Ticker 对象:绑定股票

3.2 获取股票基本信息:公司概况、市值、市盈率

3.3 获取历史价格数据:日 K、周 K、月 K 线

3.3.1 基础用法:获取指定时间范围的日线数据

3.3.2 简化用法:按时间周期获取(无需手动写日期)

3.3.3 复权处理:获取调整后价格

3.4 获取实时价格:最新报价

方式 1:从 info 中提取(简单但可能有延迟)

方式 2:用 history 获取最近 1 条数据(更实时)

3.5 获取分红与拆股记录

3.5.1 分红记录

3.5.2 拆股记录

四、高级功能:财务报表、多股票批量获取与筛选

4.1 获取财务报表:资产负债表、利润表、现金流量表

4.1.1 资产负债表

4.1.2 利润表

4.1.3 现金流量表

4.1.4 获取季度财务报表

4.2 批量获取多只股票数据:yf.download ()

4.2.1 批量获取历史价格

4.2.2 批量获取基本信息:快速筛选股票

4.3 获取指数成分股:如标普 500、沪深 300

五、数据可视化:用图表直观展示股票特征

5.1 股票价格走势:收盘价折线图

5.2 成交量柱状图:分析交易活跃度

5.3 均线分析:判断短期与长期趋势

5.4 股票收益率对比:分析投资回报

六、实战案例:美股科技股基本面与技术面综合分析

6.1 分析目标

6.2 代码实现

6.3 分析结论(示例)

七、避坑指南:yfinance 新手常遇到的 8 个问题

1. 数据延迟或缺失:“为什么获取的价格和官网不一样?”

2. 财务报表为空:“为什么 balance_sheet 返回空 DataFrame?”

3. 批量获取时部分股票数据缺失:“multi_stocks 里有 NaN 值”

4. 时间范围错误:“start 日期设置了但数据从更早开始”

5. 索引格式问题:“无法按日期筛选数据”

6. 拆股后价格异常:“股价突然下跌 90%”

7. 运行速度慢:“批量获取 100 只股票要等很久”

8. 代码突然报错:“以前能运行现在不行了”

八、总结:yfinance 学习路径与进阶方向

核心知识点回顾

进阶学习建议


 

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 接口”,能:

  1. 获取全品类金融数据:股票、指数(如美股 SP500、A 股沪深 300)、基金、加密货币、外汇等;
  2. 覆盖多维度信息:历史价格(开盘 / 最高 / 最低 / 收盘 / 成交量)、实时报价、财务报表(资产负债表、利润表)、分红记录、拆股信息、公司基本面(市值、市盈率等);
  3. 支持灵活的数据粒度:按分钟、小时、日、周、月获取数据,最长可追溯到几十年前;
  4. 无缝衔接 pandas:返回数据直接是 DataFrame 格式,可直接用 pandas 进行清洗、分析、可视化;
  5. 完全免费且无需配置:不用注册账号,不用申请 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 是多层索引结构:

  • 列索引第一层:OpenHighLowCloseVolume(指标);
  • 列索引第二层:AAPLMSFTGOOGL(股票代码)。

提取单只股票的数据:

# 提取苹果的收盘价
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 分析目标

  1. 对比四只股票的基本估值(市值、市盈率、股息率);
  2. 分析近 3 年营收和净利润增长情况;
  3. 对比近 1 年股价走势和收益率;
  4. 筛选出 “估值合理且增长稳定” 的标的。

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 分析结论(示例)

  1. 估值对比:微软市值最高(约 2.9 万亿美元),谷歌市盈率最低(约 25),苹果股息率最高(约 0.55%);
  2. 财务增长:微软和苹果营收稳定增长,亚马逊近 1 年营收增速最快(约 12%);
  3. 股价表现:近 1 年英伟达(未在列表中)涨幅最高,但列表中微软涨幅领先(约 25%);
  4. 筛选结果:微软和谷歌同时满足 “市盈率 < 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 学习路径与进阶方向

核心知识点回顾

  1. 基础操作Ticker对象创建、基本信息(info)、历史价格(history())、实时价格获取;
  2. 高级数据:财务报表(资产负债表、利润表)、分红与拆股记录、指数成分股;
  3. 批量处理yf.download()批量获取多股票数据、yf.Tickers批量分析;
  4. 可视化:价格走势、成交量、均线、收益率对比图表绘制;
  5. 实战应用:结合基本面与技术面分析,筛选优质股票。

进阶学习建议

  1. 量化策略开发:用 yfinance 获取数据,结合 Backtrader 等框架回测交易策略(如均线交叉策略、动量策略);
  2. 财务比率分析:基于财务报表计算 ROE(净资产收益率)、毛利率、资产负债率等指标,评估公司盈利能力;
  3. 自动化监控:编写定时脚本(如用schedule库),每日获取股票数据并发送价格提醒(邮件 / 微信);
  4. 多数据源融合:将 yfinance 数据与其他数据源(如 Tushare 获取 A 股数据、聚宽量化平台)结合,扩大分析范围;
  5. 性能优化:学习多线程 / 异步请求,提高批量获取数据的效率。

yfinance 的优势在于 “简单易用 + 免费稳定”,非常适合新手入门金融数据分析。但需注意,它的局限性在于数据延迟和部分财务数据不全,生产环境中可能需要结合付费 API 使用。

学习的关键是 “边用边查”—— 遇到问题时查看官方文档(https://pypi.org/project/yfinance/)或 GitHub 仓库,同时多分析实际股票数据,逐渐积累金融知识与编程技能的结合经验。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值