iT邦幫忙

2021 iThome 鐵人賽

DAY 4
1
AI & Data

從零開始的套牢生活 - AI股票預測系統系列 第 4

[Day 4] 三大法人資料(FinMind )

  • 分享至 

  • xImage
  •  

前言

如果是從上一篇來的讀者可能會很奇怪,不是說要用爬蟲抓三大法人資料嗎?怎麼換標題了,而且連題目的「爬蟲」都砍掉了?

聰明的你一定猜到了,沒錯,我撞題了,準確來說已經撞兩年了,有人很早以前就把爬蟲程式做出來了,還已經打包成API,甚至連官網都有了。

我也想知道為什麼我已經找了三天資料卻沒看到這東西......

當下我的心情是這樣的
https://ithelp.ithome.com.tw/upload/images/20210909/20141586KgsMgzJIXj.png

然而30分後我...
https://ithelp.ithome.com.tw/upload/images/20210909/201415862SvqZULsOV.png

榮恩,這東西比爬蟲甚至Yahoo的資料庫還全阿,讓我們來看看這東西該怎麼使用吧!

我是不是每次都忘記附程式碼

FinMind 金融 X 大數據

在大數據的時代,資料是一切的基礎。我們收集超過 50 種台股相關資料,並提供下載、線上分析、回測。

簡單用法

照著官方文件,API主要參數有

  • dataset:你所要下載的資料集ID
  • start_date:資料的起始日期
  • end_date:資料的結束日期
  • data_id:要下載資料的相關股票代碼
  • token:登入後可取得的密碼,理論上免費仔會員也能讓每小時可讀取資料加倍
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()

https://ithelp.ithome.com.tw/upload/images/20210909/20141586xpI2xADa6h.png

多筆股票資料

上一小節是單筆股票的資料取法,但如果我們今天要取得多筆資料呢?比如現在如果是要取得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


上一篇
[Day 3] 取得台股資料(基本篇)
下一篇
[Day 5] 站在巨人的肩膀上 - 回顧股票市場交易論文
系列文
從零開始的套牢生活 - AI股票預測系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言