Python 下載台股資料並轉成 DataFrame 與行情圖表的流程示意圖

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 成交量 不同市場與商品的單位可能不同,分析前要確認來源定義
0050.TW 股票資料載入 DataFrame 後的日期、開高低收、成交量與調整後收盤價欄位
股票行情載入 DataFrame 後的欄位示意;實際數值會隨下載日期與資料來源改變。

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 PyPIyfinance.download APIyfinance PyPI 與使用聲明Yahoo Finance:0050.TW

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *