
美股工具:yfinance (Yahoo Finance API) 簡介
深入探討 yfinance 這個最強大的免費開源 Yahoo Finance Python 套件,輕鬆獲取歷史股價、基本面數據與選擇權報價。
WRITTEN BY

- Name
- Harry Chang
如果說 FMP 是需要 API Key 的專業付費數據源,那麼 yfinance 就是開源界最受歡迎的免費金融數據神器。
在建立個人量化回測系統或是簡單的投資追蹤工具時,我們往往只需要一些基礎的歷史股價或是重點財務指標,這時候註冊各種 API 服務可能會顯得大材小用。這篇文章將為你介紹 Python 生態系中最知名的財經套件之一:yfinance,並展示如何用幾行程式碼輕鬆獲取全球市場的財經資料。
什麼是 yfinance?
yfinance 是一個開源的 Python 函式庫,專門用來從 Yahoo! Finance 抓取歷史市場數據。它不是 Yahoo 官方推出的 API,而是由社群開發者(最初由 Ran Aroussi 創建)維護的工具。它能完美解析 Yahoo Finance 的網頁與後台數據,並將其轉換為資料科學界最常用的 pandas.DataFrame 格式。
為什麼推薦使用 yfinance?
- 完全免費且免註冊:不需要申請 API Key,也不需要綁定信用卡,安裝後即可直接使用。
- 與 Pandas 完美結合:獲取的股價數據直接就是 DataFrame 格式,後續要做移動平均計算、畫圖或是丟入機器學習模型都非常方便。
- 資料覆蓋範圍極廣:只要在 Yahoo Finance 網站上能搜到的代號(例如台股
2330.TW、美股AAPL、加密貨幣BTC-USD、ETFSPY),yfinance都能抓得到。 - 功能齊全:除了歷史 K 線圖,還能獲取公司基本面資料、股息發放歷史、股票分割紀錄、資產負債表甚至選擇權(Options)報價。
核心功能與實戰範例
要開始使用,首先需要在你的 Python 環境中安裝該套件:
pip install yfinance
接下來,讓我們透過幾個常見的應用場景來感受 yfinance 的強大。
1. 獲取股票基本資料 (Ticker Info)
想知道一檔股票的產業別、市值、本益比或公司簡介?透過 Ticker 物件的 info 屬性即可輕鬆獲取:
import yfinance as yf
# 建立 Ticker 物件 (以微軟為例)
msft = yf.Ticker("MSFT")
# 獲取公司基本資訊字典
info = msft.info
print(f"公司名稱: {info.get('longName')}")
print(f"產業類別: {info.get('sector')}")
print(f"目前股價: ${info.get('currentPrice')}")
print(f"市值: {info.get('marketCap')}")
print(f"本益比 (Trailing PE): {info.get('trailingPE')}")
2. 獲取歷史股價數據 (Historical Market Data)
這是 yfinance 最常用的功能。你可以指定抓取的期間(如過去 1 年、年初至今)與時間頻率(日線、週線、甚至日內 1 分鐘線)。
import yfinance as yf
import matplotlib.pyplot as plt
tsm = yf.Ticker("TSM") # 台積電 ADR
# 獲取過去 1 年的日 K 線資料
hist = tsm.history(period="1y")
# 顯示前五筆資料 (包含 Open, High, Low, Close, Volume 等)
print(hist.head())
# 用 pandas 內建功能簡單畫出收盤價走勢
hist['Close'].plot(title="TSM 1-Year Closing Price")
plt.show()
提示:如果需要一次下載多檔股票的數據,可以使用 yf.download(["AAPL", "MSFT", "GOOG"], period="1mo")。
3. 獲取財務報表與行動 (Financials & Actions)
除了價格,yfinance 也能抓取公司的資產負債表、損益表、現金流量表,甚至是股息與股票分割紀錄。
import yfinance as yf
aapl = yf.Ticker("AAPL")
# 獲取歷史發放的股息與股票分割紀錄
print("=== 股息與分割紀錄 ===")
print(aapl.actions.tail())
# 獲取年度損益表
print("\n=== 年度損益表 ===")
print(aapl.financials)
# 獲取年度資產負債表
print("\n=== 年度資產負債表 ===")
print(aapl.balance_sheet)
# 獲取年度現金流量表
print("\n=== 年度現金流量表 ===")
print(aapl.cashflow)
4. 獲取選擇權鏈 (Options Chain)
對於高階交易者,yfinance 也支援獲取特定到期日的選擇權報價與未平倉量(Open Interest)。
import yfinance as yf
nvda = yf.Ticker("NVDA")
# 查看所有可用的選擇權到期日
expirations = nvda.options
print(f"最近的到期日: {expirations[0]}")
# 獲取最近到期日的選擇權鏈資料
opt = nvda.option_chain(expirations[0])
# 顯示前五筆買權 (Calls) 資料
print(opt.calls.head())
yfinance 的侷限性與注意事項
儘管 yfinance 非常方便,但在使用上仍有一些需要注意的地方:
- 穩定性問題:由於它是透過爬蟲技術抓取 Yahoo Finance 的網頁前端或非公開 API 數據,如果 Yahoo Finance 改版,
yfinance可能會短暫失效,直到社群開發者修復。 - 速率限制 (Rate Limiting):Yahoo Finance 對同一 IP 有請求頻率限制。如果你的程式要在短時間內抓取上千檔股票的數據,很容易會被暫時封鎖(Block)。針對大量數據需求,建議使用如上篇文章介紹的 FMP API 等付費/專業服務。
- 數據精準度:有時候 Yahoo Finance 本身的財報欄位更新可能會慢半拍,或者某些非美股市場的資料會有遺漏。
結語
yfinance 是進入 Python 程式交易與金融數據分析的最佳敲門磚。它讓「獲取數據」這件事變得無比簡單,你可以將精力專注於策略的開發、指標的計算或是數據的視覺化上。
對於個人投資者來說,yfinance 搭配 Python 的資料科學生態系,絕對能滿足 80% 以上的日常研究與回測需求!