2026年9月19日 星期六

FinMind: 從命令列下載台股財報

以前我都從某些網站下載台股財報。 我也很有禮貌地避免短時間內大量下載。 但是網站的防護越來越嚴, 最近終於再也無法下載。 其實我很願意付費取得資料, 無奈先前一直找不到願意提供這種服務的網站。 直到最近問了 AI, 才得知 FinMind 金融 X 大數據 這個超棒的網站, 專門就是為買賣股票的程式設計師而生的服務!

其實我用得到的股票資訊很少、 很淺, 只有每季下載一次財報。 也正因為如此, 比較偏好用下指令的方式來取得資料並存檔; 後續再另外寫程式讀檔案就好, 不必處理網路下載, 比較簡單。

FinMind 完全滿足我的需求! 你也趕快 去官網註冊一個帳號 吧! 註冊成功後會取得一個 api token (api 金鑰)。 假設你將它存在 $HOME/secret/finmind-token.txt 裡面。 於是可以下:

export FINMIND_TOKEN=$(< $HOME/secret/finmind-token.txt)
curl -sS --get https://api.finmindtrade.com/api/v4/data \
    -H "Authorization: Bearer $FINMIND_TOKEN" \
    -d dataset=TaiwanStockFinancialStatements -d data_id=5483 \
    -d start_date=2025-01-01 -d end_date=2026-06-30 > 5483.json
這就取得了 5483 (中美晶) 過去六季的綜合損益表。

其實如果沒有設定 FINMIND_TOKEN, 這一句一樣可以下載成功, 但是每小時僅限呼叫 30 次; 有免費帳號 token 的話, 每小時可以呼叫 300 次。 如果是 Backer 等級的付費方案, 某些表格好像還可以一次下載所有個股。

另外, 建議可以把自己常用的幾張報表的 欄位名稱中英對照表 全部下載回來。 例如我關心 台股基本面 當中的綜合損益表、 資產負債表、 現金流量表、 股利政策表, 所以:

for table in FinancialStatements BalanceSheet CashFlowsStatement Dividend ; do
    echo "# [$table]"
    curl -sS --get https://api.finmindtrade.com/api/v4/translation \
	-H "Authorization: Bearer $FINMIND_TOKEN" \
	-d dataset=TaiwanStock$table \
	-d start_date=2026-06-30 > $table-tr.json
    jq -sr '.[-1].data | [.english, .name] | transpose[] | join(",")' $table-tr.json > $table-tr.csv
done

因為傳回的資料是一個 json stream/sequence, 包含兩個獨立的 json object, 前者是傳輸狀態, 後者 (裡面的 data 欄位) 才是資料主體, 所以先用 .[-1].data 處理。 後面幾句則是把中、英文兩個陣列裡面的元素一一對應、 轉成每列一筆的方式輸出。

寫到這裡, 突然覺得比較興奮的居然是: 又有實用的 json 資料可以練習/示範 jq 啦!

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。