在前一篇測試中已經透過註冊 API token 從 FinMind 取得股票的盤後資料, 參考 :
其實除了股票的價量資訊外, FinMind 還提供了非常多的股票資料集, 參考 :
今天要測試的是籌碼面的股權分散表 API, 這個資料集是從集保結算所 (TDCC) 的集保戶股權分散表網頁用爬蟲蒐集而來 :
此網頁雖然是靜態網頁, 但無法直接使用 requests 套件來爬, 因為此網頁使用隱藏欄位傳遞隨機權杖來防爬, 查詢時必須送出此權杖才會得到有資料的回應網頁, 因此 必須使用 Selenium 模擬瀏覽器操作才行, 參考 :
集保結算所只提供最近一年的集保戶股權分散表 :
如果要找一年之前的資料可以從 FinMind 的api.taiwan_stock_holding_shares_per 資料集取得. 此 API 的介面如下 :
df=api.taiwan_stock_holding_shares_per(stock_id, start_date, end_date)
參數說明 :
- stock_id : 股票代號 (字串), 例如 '2330', '0050' 等.
- start_date : 起始日期 ('YYYY-mm-dd' 字串), 例如 '2023-01-13'.
- end_date : 結束日期 ('YYYY-mm-dd' 字串), 例如 '2024-09-09'.
傳回值為 Pandas 的 DataFrame 物件, 參考 :
首先從儲存權杖金鑰的隱藏檔 .env 讀取 FinMind 權杖 :
>>> import os
>>> from dotenv import load_dotenv
>>> load_dotenv()
True
>>> token=os.environ.get('FinMind_TOKEN')
然後匯入 DataLoader 類別並呼叫其建構子 DataLoader() 來建立 DataLoader 物件 :
>>> from FinMind.data import DataLoader
>>> data_loader=DataLoader()
呼叫 DataLoader 物件的 login_by_token() 並傳入金鑰參數 api_token 進行認證 :
>>> data_loader.login_by_token(api_token=token)
認證完成後即可呼叫 api.taiwan_stock_holding_shares_per() 取得指定期間的股權分散表 :
>>> df=data_loader.taiwan_stock_holding_shares_per(
stock_id='2330',
start_date='2020-09-09',
end_date='2024-09-09'
)
2024-09-09 14:34:08.860 | INFO | FinMind.data.finmind_api:get_data:125 - download TaiwanStockHoldingSharesPer, data_id: 2330
檢視傳回的資料框物件 :
>>> df
date stock_id HoldingSharesLevel people percent unit
0 2020-09-11 2330 1-999 191333 0.13 35383465
1 2020-09-11 2330 1,000-5,000 240154 1.75 454244634
2 2020-09-11 2330 10,001-15,000 10688 0.50 131717730
3 2020-09-11 2330 100,001-200,000 1652 0.88 228883212
4 2020-09-11 2330 15,001-20,000 5247 0.35 92934231
... ... ... ... ... ... ...
3454 2024-09-06 2330 600,001-800,000 328 0.87 228123073
3455 2024-09-06 2330 800,001-1,000,000 210 0.73 189461570
3456 2024-09-06 2330 more than 1,000,001 1545 86.68 22480457068
3457 2024-09-06 2330 差異數調整(說明4) 1 -0.00 -566
3458 2024-09-06 2330 total 1551626 100.00 25933644281
[3459 rows x 6 columns]
用 Jupyter Notebook 或 Colab 執行的話 df 會用表格呈現較整齊好看 :
可見結構與股權分散表網頁是一樣的.
完整程式碼如下 :
# finmind_stock_holding_shares_per.py
import os
from dotenv import load_dotenv
from FinMind.data import DataLoader
# login FinMind
load_dotenv()
token=os.environ.get('FinMind_TOKEN')
data_loader=DataLoader()
data_loader.login_by_token(api_token=token)
# query api
df=data_loader.taiwan_stock_holding_shares_per(
stock_id='2330',
start_date='2020-09-09',
end_date='2024-09-09'
)
print(df)
沒有留言:
張貼留言