過去曾經介紹過用 Excel VBA 抓取 Yahoo Finance 股價,EXCEL VBA yahoo finance網路抓資料心得,但由於 Yahoo Finance API 政策改變,VBA 方法已不再穩定。因此我現在已經改用 Python yfinance 套件,事實上,它抓數據時表現也比較穩定。
yfinance 是目前最多人使用的免費股價資料套件,可以抓取個股歷史股價、股息資料、財務報表等,完全免費且持續維護更新。
本文適合有基礎 Python 概念的讀者,若你完全沒用過 Python,建議先安裝編輯器,你可以想像成作業系統,類似你在 EXCEL裡面編寫VBA的視窗,如果你沒有想法,可以裝個visualstudio來用,都是免費的。
https://code.visualstudio.com/thank-you?dv=win64user
然後再安裝 Anaconda 或 Python 3.x 環境再繼續。
https://www.anaconda.com/download
https://www.python.org/downloads
內容目錄
📌 安裝 yfinance
在終端機或命令提示字元執行以下指令,如果找不到的話就按鍵盤”WIN鍵”,輸入”CMD”,然後再黑屏中輸入以下指令:
pip install yfinance
安裝完成後即可在 Python 腳本中 import 使用。
📌 基本用法:抓取單一股票歷史股價
以可口可樂(KO)為例,抓取過去一年的每日股價:
import yfinance as yf
# 建立股票物件
ticker = yf.Ticker(‘KO’)
# 抓取過去一年的歷史股價
df = ticker.history(period=’1y’)
# 顯示前5筆資料
print(df.head())
period 參數常用選項:
- ‘1d’:今日資料
- ‘1mo’:過去一個月
- ‘1y’:過去一年
- ‘5y’:過去五年
- ‘max’:所有可取得的歷史資料
📌 抓取股息資料
對存股投資者來說,股息資料比股價更重要。以下範例抓取 KO 的歷史股息:
import yfinance as yf
ticker = yf.Ticker(‘KO’)
# 抓取歷史股息資料
dividends = ticker.dividends
print(dividends)
# 只看最近5次發放
print(dividends.tail(5))
回傳的資料包含每次除息日期和每股股息金額,可以進一步計算股息成長率或歷史殖利率。
📌 同時抓取多支股票
如果你想一次比較多支存股標的(例如 KO、JNJ、PG),可以用 download 函數批量下載:
import yfinance as yf
# 一次抓取多支股票的收盤價
tickers = [‘KO’, ‘JNJ’, ‘PG’]
df = yf.download(tickers, period=’1y’)[‘Close’]
print(df.head())
回傳的是一個 DataFrame,每欄是一支股票的收盤價,可以直接做比較圖或進一步分析。
📌 將資料儲存到 Excel
抓到資料後,可以直接輸出成 Excel 檔案,方便後續分析:
import yfinance as yf
ticker = yf.Ticker(‘KO’)
df = ticker.history(period=’5y’)
# 輸出成 Excel 檔案
df.to_excel(‘KO_history.xlsx’)
print(‘已儲存至 KO_history.xlsx’)
注意:若要輸出 Excel,需額外安裝 openpyxl,即在CMD輸入以下:
pip install openpyxl
📌 一鍵抓取代碼
import yfinance as yf
import pandas as pd
# 移除時區資訊
pd.set_option('display.max_columns', None)
# 建立股票物件 - KO (可口可樂)
ticker = yf.Ticker('KO')
# 抓取過去一年的歷史股價
df = ticker.history(period='1y')
print("前5筆股價資料:")
print(df.head())
print("\n" + "="*50 + "\n")
# 📌 抓取股息資料
dividends = ticker.dividends
print("歷史股息資料:")
print(dividends)
print("\n最近5次股息:")
print(dividends.tail(5))
print("\n" + "="*50 + "\n")
# 📌 同時抓取多支股票
tickers = ['KO', 'JNJ', 'PG']
df_multi = yf.download(tickers, period='1y')['Close']
print("多支股票收盤價(前5筆):")
print(df_multi.head())
print("\n" + "="*50 + "\n")
# 📌 將資料儲存到 Excel(移除時區)
ticker = yf.Ticker('KO')
df_long = ticker.history(period='5y')
# 移除時區資訊
df_long.index = df_long.index.tz_localize(None)
df_long.to_excel('KO_history.xlsx', index=True)
print('已儲存至 KO_history.xlsx')
📌 抓到股息資料之後,可以做什麼?
有了歷史股息資料,常見的進一步分析方向有幾個:
- 計算歷史殖利率:把每年股息除以當時股價,得出每一年的殖利率走勢
- 觀察股息成長率:比較每年股息增長幅度,判斷公司是否持續回饋股東
- 股息率分位數分析:把當前殖利率跟歷史數據比較,判斷現在是相對高還是低,這是許多存股投資者用來判斷買入時機的方法之一
以上分析都可以用 Python 自己寫,也有現成工具可以參考。如果你對存股分析有興趣,本站另有相關介紹文章,歡迎延伸閱讀。
📌 常見問題
Q:yfinance 的資料準確嗎?
資料來源是 Yahoo Finance,一般用途(研究、分析)足夠準確。但資料偶爾有缺漏或延遲,不建議用於即時交易決策。
Q:跟舊的 VBA 版本差在哪?
Yahoo Finance 在 2024 年後多次調整 API,VBA 透過網頁爬取的方式已不穩定,常常突然失效。yfinance 由社群持續維護,穩定性高很多,也支援更多資料類型(股息、財報、選擇權等)。
Q:需要申請 API Key 嗎?
不需要,yfinance 完全免費,安裝後直接使用,不需要註冊或申請任何金鑰。