Python 抓股票資料教學:pandas-datareader 現況與 0050.TW 範例
想用 Python 把台股資料抓進 pandas DataFrame,再存成 CSV 做分析,原本常見的寫法是透過 pandas-datareader 連接 Yahoo。這個教學保留原本的安裝、日期區間、股票代碼與欄位解讀,再補上目前能實際取得 0050.TW 歷史資料的做法。
先說結論:pandas-datareader 仍持續維護,但目前官方維護的公開介面已聚焦在 FRED、Fama/French、OECD、Eurostat 等總體經濟與因子資料;Yahoo 股票 reader 不在現行維護清單。若要下載 Yahoo Finance 上的台股行情,實務上可改用 yfinance。
準備 Python 環境與套件
如果要延續原本的 pandas-datareader 用法,可先安裝套件:
python -m pip install pandas-datareader
若目標是下載 Yahoo Finance 的個股或 ETF 歷史行情,另外安裝 yfinance:
python -m pip install yfinance
建議使用 python -m pip,可以降低電腦同時存在多個 Python 時,把套件裝到不同環境的機率。
原本的 pandas-datareader Yahoo 寫法
原文的核心流程是:匯入套件、設定起訖日期、指定 Yahoo 資料來源,最後取得一個 DataFrame。以元大台灣 50 ETF 為例,Yahoo Finance 顯示的代碼是 0050.TW。
import datetime
import pandas_datareader as pdr
stock_number = "0050.TW"
start = datetime.datetime(2021, 1, 1)
end = datetime.datetime(2022, 12, 31)
data = pdr.DataReader(stock_number, "yahoo", start, end)
這段程式完整保留了原本教學的思路,但不建議再當成主要範例。現行 pandas-datareader 官方文件列出的維護來源已不包含 Yahoo,因此可能遇到來源無法辨識、授權或請求格式變更等問題。
目前下載 0050.TW 的實用寫法
yfinance.download() 可以直接接收股票代碼、開始日期與結束日期,並回傳 pandas DataFrame。下面保留原本「指定日期區間後抓取 0050」的用途:
import yfinance as yf
data = yf.download(
"0050.TW",
start="2024-01-01",
end="2025-01-01",
auto_adjust=False,
progress=False,
multi_level_index=False,
)
print(data.head())
這裡特別設定了三個參數:
auto_adjust=False:保留未自動調整的 OHLC 價格,並在資料可用時提供Adj Close。progress=False:關閉終端機的下載進度條,輸出比較乾淨。multi_level_index=False:單一代碼時使用一般欄位,後續存檔與分析較直覺。
日期範圍提醒:依照 yfinance.download() 官方文件,start 會包含指定日期,end 不包含指定日期。若要抓到 2024 年最後一個交易日,將 end 設成 2025-01-01 是合理做法。
把股票資料存成 CSV
原文的目的之一是把行情抓下來存檔。DataFrame 可以直接輸出成 CSV;使用 utf-8-sig,在常見的繁體中文 Windows Excel 環境中通常比較容易正確開啟欄位。
if data.empty:
raise RuntimeError("沒有取得資料,請檢查股票代碼、日期與網路連線")
data.to_csv("0050_tw.csv", encoding="utf-8-sig")
若接下來要把資料寫入資料庫,可延伸閱讀站內的 Python pandas 與 SQLAlchemy 操作資料庫教學。
DataFrame 欄位代表什麼?
| 欄位 | 意思 | 分析時的注意事項 |
|---|---|---|
Date |
交易日期,通常是 DataFrame 索引 | 週末、休市日不會有一般交易資料 |
Open |
開盤價 | 應和相同交易日的其他欄位一起比較 |
High |
最高價 | 代表該日區間內的最高成交價格 |
Low |
最低價 | 代表該日區間內的最低成交價格 |
Close |
收盤價 | auto_adjust 的設定會影響價格是否已調整 |
Adj Close |
調整後收盤價 | 用於反映拆分、股利等調整;欄位是否出現取決於下載設定與資料 |
Volume |
成交量 | 不同市場與商品的單位可能不同,分析前要確認來源定義 |

pandas-datareader 現在適合抓什麼?
pandas-datareader 並不是不能用了,而是維護方向已改變。若你需要 FRED 的利率、景氣或總體經濟時間序列,它仍很方便。例如下載美國 10 年期公債殖利率序列 GS10:
from pandas_datareader import data as pdr
rates = pdr.get_data_fred(
"GS10",
start="2024-01-01",
end="2025-01-01",
)
print(rates.head())
簡單來說:個股與 ETF 的 Yahoo 行情可使用 yfinance;FRED、Fama/French、OECD、Eurostat 等官方列出的總體與因子資料,才是現行 pandas-datareader 的主要定位。
常見問題與排查方式
下載結果為空的 DataFrame 怎麼辦?
先確認 Yahoo Finance 能找到該代碼,再檢查日期是否有前後顛倒、區間內是否有交易日,以及網路或資料來源是否暫時限制請求。不要在資料為空時直接進行後續計算。
為什麼沒有 Adj Close 欄位?
yfinance.download() 的 auto_adjust 會影響價格欄位。這篇使用 auto_adjust=False,目的是讓一般 OHLC 與調整後收盤價保持容易辨識;若改成自動調整,欄位與數值表現會不同。
可以一次下載多檔股票嗎?
可以,把多個代碼以清單或空白分隔字串交給 tickers。多代碼資料通常會使用多層欄位,分析前可先查看 data.columns,再決定是否重整欄位。
抓到的資料可以直接商業使用嗎?
不能只因為程式能下載,就推定資料可以任意重製或商用。yfinance 官方說明它是未經 Yahoo 背書的開源工具,主要供研究與教育用途;實際資料使用權仍應查閱 Yahoo 的服務條款。正式產品或大量使用時,應評估有授權與服務保證的資料供應商。
結論
原本用 Python 把 0050.TW 股票資料抓進 DataFrame 的目標仍然可行,只是資料來源工具需要跟著維護現況調整。保留 pandas-datareader 處理 FRED 等維護中的資料來源;需要 Yahoo 台股行情時,改用 yfinance.download(),並明確設定日期、價格調整與欄位格式,再檢查空資料後存成 CSV。
官方資料:pandas-datareader 遠端資料來源、pandas-datareader PyPI、yfinance.download API、yfinance PyPI 與使用聲明、Yahoo Finance:0050.TW。















