FinMind API 串接台股歷史價量與除權息:Python / 前端數據工程介接實踐
學習如何使用 FinMind API 存取台股個股股價歷史紀錄、除權息資訊與三大法人籌碼資料。
對於想要進行台股程式化量化分析、歷史策略回測,或是希望在個人記帳 App 中自動更新台股即時與歷史報價的開發者而言,FinMind 金融數據資料庫 是一個極其優質且對社群非常友好的開放平台。
FinMind 提供了乾淨且格式統一的 RESTful API 介面,涵蓋台股個股日成交資訊、三大法人買賣超、融資融券異動、綜合損益表與股利分派歷史等超過 50 種資料集(Datasets)。本文將詳細介紹如何免費申請 API Token、常用台股 Dataset 結構對照表,以及如何在前端(JavaScript)與後端(Python)中穩定介接並處理頻率限制(Rate Limits)。
一、 3 步驟免費取得 FinMind API Token 與配額說明
- 前往 FinMind 官方網站(
finmindtrade.com)點擊右上角「註冊 / 登入」。 - 完成 Email 帳號驗證後,登入會員後台管理面板(Dashboard)。
- 在「API Token 簽發區」點擊生成並複製屬於您的專屬 API Token(Bearer / Query 參數皆可使用)。
💡 為什麼一定要帶入 API Token?
若未帶入 Token(匿名呼叫),每小時請求上限僅有約 300 次且容易與共用 IP 衝突;免費註冊並帶入個人 Token 後,每小時可用配額即提升至 600 次 Request / 小時,足以支應個人投資組合(20~50 檔持股)每日的股價與除權息自動更新需求。
二、 台股投資記帳與回測必備的 5 大 Dataset 對照表
FinMind v4 API 採用統一端點 https://api.finmindtrade.com/api/v4/data,只需切換 dataset 參數即可取得不同維度的台股數據:
| Dataset 名稱 | 資料內容說明 | 核心回傳欄位 (JSON Keys) | 實務應用場景 |
|---|---|---|---|
| TaiwanStockPrice | 個股每日開高低收與成交量 | date, open, max, min, close, Trading_Volume | 更新持股市值、繪製 K 線圖 |
| TaiwanStockDividendResult | 除權息結果與參考價表 | date, before_price, after_price, stock_and_cache_dividend | 自動核對除權息日與配息金額 |
| TaiwanStockDividend | 歷年股利政策宣告明細 | CashEarningsDistribution, StockEarningsDistribution | 區分盈餘配息、公積配息與配股 |
| TaiwanStockInstitutionalInvestorsBuySell | 三大法人每日買賣超 | name (Foreign_Investor 等), buy, sell | 追蹤外資、投信、自營商籌碼動向 |
| TaiwanStockMonthRevenue | 上市櫃公司每月營業收入 | revenue, revenue_month, revenue_year | 計算月增率 (MoM) 與年增率 (YoY) |
三、 JavaScript 與 Python 實戰介接範例(股價與除權息查詢)
1. 前端 JavaScript (Fetch API) 查詢台積電 (2330) 歷史收盤價:
async function fetchTaiwanStockPrice(stockId, startDate, token) {
const params = new URLSearchParams({
dataset: 'TaiwanStockPrice',
data_id: stockId,
start_date: startDate,
});
const response = await fetch(`https://api.finmindtrade.com/api/v4/data?${params}`, {
headers: { Authorization: `Bearer ${token}` },
});
if (!response.ok) {
throw new Error(`HTTP 錯誤狀態碼: ${response.status}`);
}
const result = await response.json();
if (result.status !== 200) {
throw new Error(`FinMind API 回應錯誤: ${result.msg}`);
}
return result.data; // 回傳每日開高低收陣列
}
2. 後端 Python 擷取個股除權息歷史紀錄並轉為 Pandas DataFrame:
import requests
import pandas as pd
def get_dividend_history(stock_id: str, token: str) -> pd.DataFrame:
url = "https://api.finmindtrade.com/api/v4/data"
params = {
"dataset": "TaiwanStockDividendResult",
"data_id": stock_id,
"start_date": "2020-01-01",
}
headers = {"Authorization": f"Bearer {token}"}
resp = requests.get(url, params=params, headers=headers, timeout=10)
data = resp.json()
return pd.DataFrame(data.get("data", []))
四、 數據工程實務:快取策略與常見錯誤排解
- HTTP 402 / 429 配額耗盡處理:當短時間內迴圈抓取上百檔股票時,容易觸發每小時 600 次上限。建議在個人記帳工具中採用「本地優先快取(Local-First Caching)」——歷史已收盤的日期與已發生的除權息紀錄屬於不可變數據(Immutable Data),抓過一次即寫入本地 IndexedDB 或 SQLite,後續僅需針對「最新一個交易日」做增量查詢。
-
成交量單位換算:請特別留意
TaiwanStockPrice回傳的Trading_Volume單位為「股(Shares)」而非「張(Lots)」。若欲換算為台股習慣的成交張數,需除以1,000。 -
與 Stoxer 的整合方式:在 Stoxer App 的「系統設定 → 報價 API 授權」中,您可以選擇填入個人的
FinMind API Key (台股)。當您在首頁「累積資產成長曲線圖」點擊「同步股價」時,系統將直接在您的瀏覽器本地端向 FinMind 查詢歷史收盤價並快取於本地 IndexedDB,API Key 僅保存在您的瀏覽器本地端,絕不經過第三方後端伺服器。
本專題內容僅供技術交流與數據 API 使用教學,本站與 FinMind 服務各自獨立。API 使用頻率與聲明請依 FinMind 官網規範為準。