如果是從上一篇來的讀者可能會很奇怪,不是說要用爬蟲抓三大法人資料嗎?怎麼換標題了,而且連題目的「爬蟲」都砍掉了?
聰明的你一定猜到了,沒錯,我撞題了,準確來說已經撞兩年了,有人很早以前就把爬蟲程式做出來了,還已經打包成API,甚至連官網都有了。
我也想知道為什麼我已經找了三天資料卻沒看到這東西......
當下我的心情是這樣的
然而30分後我...
榮恩,這東西比爬蟲甚至Yahoo的資料庫還全阿,讓我們來看看這東西該怎麼使用吧!
我是不是每次都忘記附程式碼
在大數據的時代,資料是一切的基礎。我們收集超過 50 種台股相關資料,並提供下載、線上分析、回測。
照著官方文件,API主要參數有
import requests
import pandas as pd
from datetime import date, timedelta
url = "https://api.finmindtrade.com/api/v4/data"
parameter = {
"dataset": "TaiwanStockInstitutionalInvestorsBuySell",
"start_date": (date.today()-timedelta(days=30)).strftime("%Y-%m-%d"),
"end_date": date.today().strftime("%Y-%m-%d"), # Not working
"data_id": "2330",
"token": "", # 參考登入,獲取金鑰
}
data = requests.get(url, params=parameter)
data = data.json()
data解碼過後資料會長成這樣
{'msg': 'success', 'status': 200, 'data': [{'date': '2021-08-10', 'stock_id': '2330'}]}
其中msg、status代表是否有成功取得資料,data代表回傳的資料,資料會是一個Python的List,所以我們可以用Pandas去轉成表格。
data = pd.DataFrame(data['data'])
data.head()
上一小節是單筆股票的資料取法,但如果我們今天要取得多筆資料呢?比如現在如果是要取得ETF的50種股票法人資料呢?
實作上其實很簡單,只要將資料轉成DataFrame後,通通存到List裡,最後在串接起來即可,這裡有非常詳細的各種表格串接教學。
frames = []
for id in etf50_id:
url = "https://api.finmindtrade.com/api/v4/data"
parameter = {
"dataset": "TaiwanStockInstitutionalInvestorsBuySell",
"start_date": date.today().strftime("%Y-%m-%d"),
"data_id": id,
"token": "", # 參考登入,獲取金鑰
}
data = requests.get(url, params=parameter)
data = data.json()
df = pd.DataFrame(data["data"])
frames.append(df)
result_df = pd.concat(frames)
result_df = result_df.reset_index(drop=True)
result_df
注意這裡有個新手常犯的錯誤,表格是在最後才合併,常常有新手的程式會長這樣
for id in etf50_id:
url = "https://api.finmindtrade.com/api/v4/data"
parameter = {
"dataset": "TaiwanStockInstitutionalInvestorsBuySell",
"start_date": date.today().strftime("%Y-%m-%d"),
"data_id": id,
"token": "", # 參考登入,獲取金鑰
}
data = requests.get(url, params=parameter)
data = data.json()
df = pd.DataFrame(data["data"])
result_df = pd.concat([result_df,frames])
沒錯,這樣省了3行,但代價是每次串接都要複製一次整個表格,現在只有50列可能不明顯,以後如果有500萬筆資料直接卡死你。
一輪摸索下來,目前看起來台灣證券交易所有的資料它都有,連新聞這種對深度學習會用到的資料也有額外蒐集,雖然有部份API有鎖會員限定,但基本上都能用合併資料方法獲得,當然如果你懶也可以付149月費直接拿,在此感謝作者的貢獻,讓我們省去原本要和證券交易所Ban人機制鬥智鬥勇的過程。
也順便報廢了原本要發的,寫了3小時的草稿和程式,所以今天內容比較少請見諒D