請啟用 JavaScript 來查看內容

FinMind API 取得"台股、匯率、黃金"等金融相關資料

前言

許多人接觸到 Python,開始學習"網路爬蟲"、"資料分析"、"機器學習",有一部分的人是因為「股票」。但要自己爬取資料確實有點麻煩,而且不同網站可能還有反爬蟲的機制,這對於想要資料來做資料分析、預測股價的人來說,可能就是一個卡在前面的阻礙。

之前我發現一個 FinMind API,主要以台股為主,提供很多項的金融開源數據,方便讓我們來使用。

本篇文章會挑幾項功能來說明,以及 Python 範例程式碼。

(圖片來源:Unsplash)
(圖片來源:Unsplash)

FinMind 套件簡介

FinMind 提供以台股為主,超過 50 種金融相關數據資料,除了 API 可以取得資料、回測、繪製 k 線圖、儀表板,也提供網頁版的操作介面、策略分析與資料集下載功能。

因為是透過 API 串接,不限制程式,你想要使用 Python、JavaScript、PHP、C++、Java、Ruby……都可,或直接透過它的官網下載資料,對於想要做大數據、資料分析、預測股價的人來說,應該算是一個很方便的工具。


從官方 API 文檔可以看到大概有以下資料:

技術面 : 台股股價 daily、歷史 tick 逐筆交易、PER、PBR、每5秒委託成交統計、台股加權指數。
基本面 : 綜合損益表、現金流量表、資產負債表、股利政策表、除權除息結果表、月營收。
籌碼面 : 外資持股、股權分散表、融資融券、三大法人買賣、借券成交明細。
消息面 : 台股相關新聞。
衍生性商品 : 期貨、選擇權 daily data、交易明細、期貨三大法人買賣,期貨各卷商每日交易、選擇權各卷商每日交易。
國際市場 : 美股股價 daily、minute、美國債券殖利率、貨幣發行量(美國)、黃金價格、原油價格、G8 央行利率、G8 匯率、

ℹ 但比較可惜的一點是目前「不提供即時資料」,看文檔的說明是說由於資料源問題,移除即時報價:https://finmind.github.io/WhatIsNew/



教學

FinMind API 文檔 內都有簡單的程式碼範例,這邊我就挑其中的五種來示範說明。

程式一開始,先將需要的套件匯入,pandas 不一定要有(這裡只是拿來方便看資料):

1
2
import requests
import pandas as pd

股價日成交資訊

這項資料就是臺灣證交所的個股日成交資訊

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
url = "https://api.finmindtrade.com/api/v4/data"
parameter = {
    "dataset": "TaiwanStockPrice",
    "data_id": "2330",
    "start_date": "2021-09-13",
    "end_date": "2021-09-17"
}
r = requests.get(url, params=parameter)
data = r.json()
stock_deal_info = data["data"]
print(pd.DataFrame(stock_deal_info))

輸出結果如下:

股價日成交資訊 輸出結果
股價日成交資訊 輸出結果

欄位依序代表:“日期”、“股票代碼”、“成交股數”、“成交金額”、“開盤價”、“最高價”、“最低價”、“收盤價”、“漲跌價差”、“成交筆數”


股票當日逐筆成交資訊

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
url = "https://api.finmindtrade.com/api/v4/data"
parameter = {
    "dataset": "TaiwanStockPriceTick",
    "data_id": "2330",
    "start_date": "2021-09-27"
}
r = requests.get(url, params=parameter)
data = r.json()
stock_history_info = data["data"]
print(pd.DataFrame(stock_history_info).tail())  # 顯示最後五筆資料

輸出結果如下:

股票當日逐筆成交資訊 輸出結果
股票當日逐筆成交資訊 輸出結果

欄位依序代表:“日期”、“股票代碼”、“成交金額”、“成交量”、“時間”、“漲跌(1:漲;2跌)”


股票綜合損益表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
url = "https://api.finmindtrade.com/api/v4/data"
parameter = {
    "dataset": "TaiwanStockFinancialStatements",
    "data_id": "2330",
    "start_date": "2021-06-01",
    "end_date": "2021-09-01"  # 不加則抓到現在日期
}
r = requests.get(url, params=parameter)
data = r.json()
stock_income_statement = data["data"]
print(pd.DataFrame(stock_income_statement))

輸出結果如下:

股票綜合損益表 輸出結果
股票綜合損益表 輸出結果

股利政策表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
url = "https://api.finmindtrade.com/api/v4/data"
parameter = {
    "dataset": "TaiwanStockDividend",
    "data_id": "2330",
    "start_date": "2021-01-01"
}
r = requests.get(url, params=parameter)
data = r.json()
stock_dividend = data["data"]
print(pd.DataFrame(stock_dividend).head())  # 顯示前五筆資料

輸出結果如下:

股利政策表 輸出結果
股利政策表 輸出結果

外幣對台幣匯率

共有 19 種幣別與新臺幣(TWD)的匯率,資料來源為台灣銀行,應該就是此網頁

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
url = "https://api.finmindtrade.com/api/v4/data"
parameter = {
    "dataset": "TaiwanExchangeRate",
    "data_id": "USD",
    "start_date": "2021-01-01"
}
r = requests.get(url, params=parameter)
data = r.json()
exchange_rate = data["data"]
print(pd.DataFrame(exchange_rate).tail())  # 顯示最後五筆資料

輸出結果如下:

外幣對台幣匯率 輸出結果
外幣對台幣匯率 輸出結果

欄位依序代表:“日期”、“貨幣”、“現金匯率>銀行買入”、“現金匯率>銀行賣出”、“即期匯率>銀行買入”、“即期匯率>銀行賣出”



範例程式碼

我將以上功能包裝成 class 的完整範例程式碼,附上給需要的人參考。

GitHub Gist:stock_finmind.py



流量限制 & 會員機制

FinMind API 有流量限制,每小時最多 300 次請求,如果註冊成為會員(免費),則提升至 600 次 / 小時。

另外還有兩種付款的會員,除了差在每小時的請求限制外,某些功能只有付費會員能使用,例如一次拿特定日期中全部股票的資料。

更多詳細會員機制的 "贊助方案" 參考官網說明:https://finmindtrade.com/analysis/#/Sponsor/sponsor


結語

以上是直接對 API 請求,如果你是使用 Python,還有官方包裝好的套件(GitHub),還幫你寫好幾項量化工具 (回測、K 線、客製化看盤儀表板) 可方便使用。

更多其他資料或範例,參考 FinMind API 官方文檔


除了本篇介紹的 FinMind,還有其他許多股票相關的套件可以嘗試:


歡迎追蹤『IT空間』FB 粉專,取得最新發文通知🔔




參考:
FinMind 官方網站
FinMind API 文檔
FinMind GitHub


People at work, money at work.
人可以工作,錢也可以幹活。


🔻 如果覺得喜歡,歡迎在下方獎勵我 5 個讚~
分享

Jia
作者
Jia
軟體工程師 - Software Engineer