3 步把 yfinance 数据导出成 CSV 和 Excel:从股价到财务报表
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
你从雅虎财经拉了股票数据,结果要交报告、发给同事,却卡在"这堆数据怎么存成文件"这一步。yfinance 就是干这个的:Python 库里最常被用来下载雅虎财经的股价、财务报表等市场数据,拿到的都是标准 pandas DataFrame,存成 CSV、Excel 各只要一行代码。这篇文章能直接上手的:
- 一行命令把历史股价存成 CSV 文件
- 把利润表、资产负债表、现金流量表写进同一个 Excel 的不同工作表
- 批量下载多只股票,并修复导出前发现的价格跳变
快速跑通:一条命令装好,1 分钟出第一份 CSV 🚀
pip install yfinance装完打开 Python,核心入口就是Ticker类——每只股票对应一个对象,数据都从它身上取:
import yfinance as yf apple = yf.Ticker("AAPL") hist = apple.history(period="1y") # 取近 1 年的日线 hist.to_csv("apple_stock_data.csv")运行后当前目录会多出apple_stock_data.csv,里面是日期、开高低收、成交量、分红和拆股记录,Excel 能直接打开。Ticker类就定义在 yfinance/ticker.py,想扩展别的接口可以从这里看起。
把财务报表导出成 Excel 多工作表
做季度报告的人最熟悉这种场景:利润表、资产负债表、现金流量表分属三张表,却要塞进同一个工作簿里给财务同学对比。pandas 的ExcelWriter正好能一次写入多个工作表:
import yfinance as yf import pandas as pd msft = yf.Ticker("MSFT") with pd.ExcelWriter('msft_financial_data.xlsx') as writer: # 每张报表写进独立工作表 msft.income_stmt.to_excel(writer, sheet_name='Income Statement') msft.balance_sheet.to_excel(writer, sheet_name='Balance Sheet') msft.cash_flow.to_excel(writer, sheet_name='Cash Flow')产出的msft_financial_data.xlsx里有三个工作表,跨表做公式和图表都不用再合并文件。income_stmt、balance_sheet、cash_flow这三个属性的实现都在 yfinance/ticker.py 中,取数逻辑可以顺着源码往下看。
批量导出多只股票:用 download 一行搞定
股票不止一只的时候,别一只一只循环Ticker。顶层函数yf.download直接接收多个代码,返回一个带多级列的宽表,列按"股票代码 + 字段"组织:
import yfinance as yf data = yf.download("SPY AAPL MSFT", period="3mo") data.to_csv("watchlist_3mo.csv")watchlist_3mo.csv里三行表头(股票、字段)对应三列一组,用 Excel 的"从表格创建透视表"或 pandas 的stack都能很快拆成扁表。想每只股票单独一个文件,就改用yf.Tickers("AAPL MSFT GOOG")再遍历,更多批量写法在 doc/source/reference/examples/ 目录里都有现成脚本。
导出前先修数据:100 倍价格错误和除息跳变 💡
数据本身有坑的时候,先导出再修等于白干。雅虎接口偶尔会把某段时间的价格整体放大 100 倍,肉眼很难发现:
对比Close和Adj Close就能发现异常区间,再用repair一键修复:
hist = yf.Ticker("AET").history(period="1y") print(hist.repair()) # 查看检测到的异常 hist = hist.repair().copy() # 原地修复后导出 hist.to_csv("aet_1d_fixed.csv")另一种常见情况是分红日Adj Close缺失、导致价格序列在除息日断崖式下跌,同样走repair流程补齐:
检测与修复的具体算法都在 yfinance/utils.py,想确认"修复"到底改动了哪些列,读这个文件比看文档更快。
踩坑与排错
导出的 CSV 用 Excel 打开中文乱码
症状:文件名或表头带中文,双击打开全是å开头的乱码。
修复:
hist.to_csv("数据.csv", encoding="utf_8_sig")原因:Excel 默认按本地编码(Windows 下多为 GBK)读 CSV,utf_8_sig会带 BOM 头,Excel 就能自动识别成 UTF-8。
分钟级数据超过 10 年取不全
症状:interval="1m"加上很长period,返回的只有一小段,或干脆报错。
修复:按 7 天以内的窗口分段下载再拼接:
chunks = [yf.Ticker("AAPL").history(start=s, end=e, interval="1m") for s, e in segments] # segments 为分段日期区间 data = pd.concat(chunks)原因:雅虎接口对分钟级数据的单次返回窗口有上限,分段是官方文档推荐的做法。
财务报表导出后行名挤在一列不好用
症状:income_stmt.to_excel(...)导出的表,指标名全堆在左上角的索引区,没法筛选排序。
修复:转置后再导出,行名就变成普通一列了:
msft.income_stmt.T.reset_index().rename( columns={'index': 'Indicator'}).to_excel("msft_income.xlsx")原因:这些报表的行索引是指标名(如Total Revenue),索引列不进数据区,reset_index把它降级成普通列即可参与筛选。
下一步
更多导出场景——期权链、基金持仓、实时行情——都有现成脚本可抄,直接翻 doc/source/reference/examples/ 目录,每个文件都能独立运行。贡献流程写得很细,想给项目加功能可以从 CONTRIBUTING.md 看起。打开终端,把你手里那只股票的数据先跑成一份 CSV。
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考