美股工具:yfinance (Yahoo Finance API) 簡介

美股工具:yfinance (Yahoo Finance API) 簡介

深入探討 yfinance 這個最強大的免費開源 Yahoo Finance Python 套件,輕鬆獲取歷史股價、基本面數據與選擇權報價。


如果說 FMP 是需要 API Key 的專業付費數據源,那麼 yfinance 就是開源界最受歡迎的免費金融數據神器。

在建立個人量化回測系統或是簡單的投資追蹤工具時,我們往往只需要一些基礎的歷史股價或是重點財務指標,這時候註冊各種 API 服務可能會顯得大材小用。這篇文章將為你介紹 Python 生態系中最知名的財經套件之一:yfinance,並展示如何用幾行程式碼輕鬆獲取全球市場的財經資料。


什麼是 yfinance

yfinance 是一個開源的 Python 函式庫,專門用來從 Yahoo! Finance 抓取歷史市場數據。它不是 Yahoo 官方推出的 API,而是由社群開發者(最初由 Ran Aroussi 創建)維護的工具。它能完美解析 Yahoo Finance 的網頁與後台數據,並將其轉換為資料科學界最常用的 pandas.DataFrame 格式。

為什麼推薦使用 yfinance

  1. 完全免費且免註冊:不需要申請 API Key,也不需要綁定信用卡,安裝後即可直接使用。
  2. 與 Pandas 完美結合:獲取的股價數據直接就是 DataFrame 格式,後續要做移動平均計算、畫圖或是丟入機器學習模型都非常方便。
  3. 資料覆蓋範圍極廣:只要在 Yahoo Finance 網站上能搜到的代號(例如台股 2330.TW、美股 AAPL、加密貨幣 BTC-USD、ETF SPY),yfinance 都能抓得到。
  4. 功能齊全:除了歷史 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 非常方便,但在使用上仍有一些需要注意的地方:

  1. 穩定性問題:由於它是透過爬蟲技術抓取 Yahoo Finance 的網頁前端或非公開 API 數據,如果 Yahoo Finance 改版,yfinance 可能會短暫失效,直到社群開發者修復。
  2. 速率限制 (Rate Limiting):Yahoo Finance 對同一 IP 有請求頻率限制。如果你的程式要在短時間內抓取上千檔股票的數據,很容易會被暫時封鎖(Block)。針對大量數據需求,建議使用如上篇文章介紹的 FMP API 等付費/專業服務。
  3. 數據精準度:有時候 Yahoo Finance 本身的財報欄位更新可能會慢半拍,或者某些非美股市場的資料會有遺漏。

結語

yfinance 是進入 Python 程式交易與金融數據分析的最佳敲門磚。它讓「獲取數據」這件事變得無比簡單,你可以將精力專注於策略的開發、指標的計算或是數據的視覺化上。

對於個人投資者來說,yfinance 搭配 Python 的資料科學生態系,絕對能滿足 80% 以上的日常研究與回測需求!