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

前言

如果是从上一篇来的读者可能会很奇怪,不是说要用爬虫抓三大法人资料吗?怎麽换标题了,而且连题目的「爬虫」都砍掉了?

聪明的你一定猜到了,没错,我撞题了,准确来说已经撞两年了,有人很早以前就把爬虫程序做出来了,还已经打包成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


<<:  [Day9] 均线跨市交易实作

>>:  寝室的秘密授课(三):测试案例 Test Case

Day.25 「从 事件绑定 与 定时器 认识回调函式!」 —— JavaScript 定时器 & Callback

我们前面已经了解了事件绑定与事件冒泡了,但是使用 物件元素.绑定事件 有不方便的地方 只能同时为一...

许多有趣的变数!如何使用 Postman 尝试 Nutanix 的 API

那些具有使用API经验的人将听说过并熟悉无处不在的API测试和开发工具。但是,Nutanix De...

Golang - 使用docker部署专案

之前就有做过这件事情 当时搞定了之後想说,简单吗~~~就是搞个Dockerfile而已 结果好一阵子...

Day8:EndPoint for Microsoft Defender 警示和事件

当我们布署完Microsoft Defender for Endpoint 接下来当侦测到威胁时,系...

[Day15]ISO 27001 标准:内稽管审

是菜稽还是老稽,大部份可以看他们稽核的顺序来辨别, 有一阵子观察五年以上的资深前辈,会从内稽、管审开...