2024年9月9日 星期一

Python 學習筆記 : 用 FinMind 套件取得股票資料 (二) 股權分散表

在前一篇測試中已經透過註冊 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)

沒有留言 :