はじめに
こんにちは, ホクソエムサポーターのKAZYです。
最近はペンギンに興味があります🐧。
世界最大のペンギンであるコウテイペンギンを日本で見るならば名古屋港水族館 (愛知) かアドベンチャーワールド (和歌山) らしいです。
ところで, 平成31年3月17日からEDINETに提出された書類をAPIで取得できるようになったことをご存知でしょうか?
だからなんなの?っていう方聞いてください。
もうブラウザポチポチやらなくても有価証券報告書ダウンロードできるんですよっ!!!!
「退屈なことはPythonにやらせよう」マンになる時が来たのです。
今回はEDINET APIで有価証券報告書を保存するための最低限の知識
と
任意の日付の有価証券報告書をダウンロードするPythonプログラム
を紹介します。
読んだら幸せになりそうな方
- 提出日を指定した有価証券報告書のダウンロードしたい方 (e.g. 1年分全部欲しいぜ!!!)
- ぼんやりEDINET APIで何ができるか知っておきたい方
読んでもあんまり幸せにならない方
- 企業名を指定した有価証券報告書のダウンロード (e.g. マクドナルドの有価証券報告書が5年分ほしいぜ!!!!)
- ブラウザからダウンロードが向いていると私は思います
↓ここで紹介しているぜ↓ blog.hoxo-m.com
- 全然暇じゃないし, 正確of正確な情報を取りに行きたい
- こちらのAPIの仕様書に使い方は全て書いてある, Have a nice day👋
どうでもいいからはよXBRLファイルをDLさせろ💢って方
KAZYの拙いスクリプトをどうぞ
poetry使える人
git clone https://github.com/KAZYPinkSaurus/disclosure-crowler.git cd disclosure-crowler # ライブラリのインストール poetry install #オプションを表示 poetry run python -m disclosure.main --help # 2020/09/04から2020/10/04の有価証券報告書をダウンロードしてxbrlファイルを抽出 poetry run python -m disclosure.main --from 2020-09-04 --to 2020-10-04 -x ls output/*
poetry使えない人
git clone https://github.com/KAZYPinkSaurus/disclosure-crowler.git cd disclosure-crowler pip install requests==2.24.0 python-dateutil==2.8.1 loguru==0.5.3 click==7.1.2 #オプションを表示 poetry run python -m disclosure.main --help # 2020/09/04から2020/10/04の有価証券報告書をダウンロードしてxbrlファイルを抽出 python -m disclosure.main --from 2020-09-04 --to 2020-10-04 -x
KAZY< ばいばい 👋
🤖 < ありがとうございました
APIって...?
According to Wikipedia, APIとは
アプリケーションプログラミングインタフェース(API、英: Application Programming Interface)とは、広義ではソフトウェアコンポーネント同士が互いに情報をやりとりするのに使用するインタフェースの仕様である。 前述のとおりAPIは各種システム/サービスがそのシステム/サービスを利用するアプリケーションに対して公開するインタフェースである。
ということのようです。 インターフェースと仕様提供するから退屈なことはPythonにやらせるんだぞっ!!と言う声が聞こえてくる気がします🦻。
EDINET APIについて
EDINET APIは以下の2つのAPIの総称です。
- 提出された書類を
把握
するためのAPI- 書類のメタ情報を教えてくれる
- 提出された書類を
取得
するためのAPI- 実際に書類を手に入れられる
取得できる期間
- EDINET APIで取得できる書類は
直近5年分
です。*1
特に注意してほしいこと
利用規約の第5条(禁止事項)には
1.利用者は、以下に掲げる行為を行ってはならないものとします。
(1) 本機能の健全な運営を害する一切の行為
(2) 短時間における大量のアクセスその他の本機能の運用に支障を与える行為
とあります。
(2)の短時間の大量アクセスは起こしやすいので特に注意しましょう。
とはどういう意味合いなのでしょう。まったくわかりません。
〜〜〜以下、KAZYの脳内のやり取り〜〜〜
KAZY < どれくらいアクセスしたら大量アクセスなの?
EDINET API< う~ん, とにかく運用に支障を与えるくらいのアクセスはやめてくれってことや!
KAZY.o0(運用次第やな....)
EDINET API< 無限ループするスクリプト書いてアクセスし続けるとかやめてくれよな!
KAZY< OK
EDINET API< アクセスするスクリプトをたくさん並列して動かすとかもやめてくれよな!!
KAZY< 理解
有価証券報告書のXBRLファイルをダウンロード(コマンドライン編)
きっと理解しやすい方がいると思うのでコマンドラインからの取得方法を見ていきましょう。
目標
2020/01/07
に提出された有価証券報告書を1つ取得する
流れ
- 日付をメタファイルを取得
- メタファイルから書類ID(docID)を取得
- docIDを指定して有価証券報告書をダウンロード
メタファイル取得(2020/01/07)
curl "https://disclosure.edinet-fsa.go.jp/api/v1/documents.json?date=2020-01-07&type=2"
↓レスポンス
{ "metadata": { "title": "提出された書類を把握するためのAPI", "parameter": { "date": "2020-01-07", "type": "2" }, "resultset": { "count": 179 }, "processDateTime": "2020-10-04 00:00", "status": "200", "message": "OK" }, "results": [ { "seqNumber": 1, "docID": "S100HNA6", "edinetCode": "E08957", "secCode": null, "JCN": "4010401049128", "filerName": "三井住友DSアセットマネジメント株式会社", "fundCode": "G12668", "ordinanceCode": "030", "formCode": "07A000", "docTypeCode": "120", "periodStart": "2018-10-11", "periodEnd": "2019-10-10", "submitDateTime": "2020-01-07 09:01", "docDescription": "有価証券報告書(内国投資信託受益証券)-第2期(平成30年10月11日-令和1年10月10日)", "issuerEdinetCode": null, "subjectEdinetCode": null, "subsidiaryEdinetCode": null, "currentReportReason": null, "parentDocID": null, "opeDateTime": null, "withdrawalStatus": "0", "docInfoEditStatus": "0", "disclosureStatus": "0", "xbrlFlag": "1", "pdfFlag": "1", "attachDocFlag": "1", "englishDocFlag": "0" }, { "seqNumber": 2, "docID": "S100HOID", ︙続く
メタファイルから書類ID(docID)を取得
文書IDは有価証券報告書のダウンロードのために必要です。
先程のレスポンスをresults
->docID
と辿ります。
︙省略 "docID": "S100HNA6", ︙省略
一番上のdocID
にはS100HNA6
という要素が入っていますね。
これです。
有価証券報告書を取得
XBRLファイルが圧縮されたzipファイルを取得します。
書類IDS100HNA6
のファイルをダウンロードしてみましょう。
エンドポイントは
https://disclosure.edinet-fsa.go.jp/api/v1/documents/ドキュメントのID
って感じで提供されています。
そしてパラメータをtype=1
とすると書類が取得できます。*2
ダウンロードしましょう (with curl
コマンド)!!!
## -o は標準週力じゃなくてファイルに書き出してくれるオプションだよ curl -o S100HNA6.zip "https://disclosure.edinet-fsa.go.jp/api/v1/documents/S100HNA6?type=1"
🐦.o0(たーみなる)% curl -o S100HNA6.zip "https://disclosure.edinet-fsa.go.jp/api/v1/documents/S100HNA6?type=1" % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 670k 100 670k 0 0 263k 0 0:00:02 0:00:02 --:--:-- 262k 🐦.o0(たーみなる)% ls -lh S100HNA6.zip -rw-r--r-- 1 kazy staff 670K 10 10 11:26 S100HNA6.zip
670KBのファイルがダウンロードされました。 やった!
有価証券報告書のXBRLファイルをダウンロード(Python編)
次にダウンロードするPythonスクリプトを書いてみます。
🤖 < requests 使うだけでしょ? そんなことでブログ膨らますなよ
KAZY< ....
目標(コマンドライン編と同じ)
- 2020/01/07に提出された有価証券報告書を1つ取得する
流れ(コマンドライン編と同じ)
- 日付をメタファイルを取得
- メタファイルから書類ID(docID)を取得
- docIDを指定して有価証券報告書をダウンロード
メタファイル取得(2020/01/07)
>>> import requests >>> 日付 = "2020-01-07" >>> メタファイルのタイプ = 2 >>> META_URL = f"https://disclosure.edinet-fsa.go.jp/api/v1/documents.json?date={日付}&type={メタファイルのタイプ}" >>> text = requests.get(META_URL).text >>> print(text) { "metadata": { "title": "提出された書類を把握するためのAPI", "parameter": { ︙省略
取得できました。
メタファイルから書類ID(docID)を取得
返ってきたjson形式のテキストを辞書として読み込みましょう。
# さっきの続きだよ >>> import json >>> meta_dict = json.loads(text) >>> meta_dict.keys() dict_keys(['metadata', 'results'])
読み込めてそうですね。 1つ目の書類の情報を出力してみましょう。
>>> meta_dict['results'][0] {'seqNumber': 1, 'docID': 'S100HNA6', 'edinetCode': 'E08957', 'secCode': None, 'JCN': '4010401049128', 'filerName': '三井住友DSアセットマネジメント株式会社', 'fundCode': 'G12668', 'ordinanceCode': '030', 'formCode': '07A000', 'docTypeCode': '120', 'periodStart': '2018-10-11', 'periodEnd': '2019-10-10', 'submitDateTime': '2020-01-07 09:01', 'docDescription': '有価証券報告書(内国投資信託受益証券)-第2期(平成30年10月11日-令和1年10月10日)', 'issuerEdinetCode': None, 'subjectEdinetCode': None, 'subsidiaryEdinetCode': None, 'currentReportReason': None, 'parentDocID': None, 'opeDateTime': None, 'withdrawalStatus': '0', 'docInfoEditStatus': '0', 'disclosureStatus': '0', 'xbrlFlag': '1', 'pdfFlag': '1', 'attachDocFlag': '1', 'englishDocFlag': '0'}
1つ目の書類のdocID
を出力してみましょう。
>>> 書類のID = meta_dict['results'][0]['docID'] >>> 書類のID 'S100HNA6' # ついでに名前も表示してみた >>> meta_dict['results'][0]['filerName'] '三井住友DSアセットマネジメント株式会社'
取得できました。
有価証券報告書を取得
XBRLファイルが圧縮されたzipファイルを取得します。
>>> 書類のタイプ = 1 >>> 書類取得のURL = f"https://disclosure.edinet-fsa.go.jp/api/v1/documents/{書類のID}?type={書類のタイプ}" >>> response = requests.get(書類取得のURL) >>> response <Response [200]>
ステータスコードが成功のレスポンスなので取れてるっぽいですね。
保存してみましょう。
with open(f"{書類のID}_python.zip", 'wb') as f: f.write(response.content)
🐦.o0(たーみなる)% ls -lh S100HNA6_python.zip -rw-r--r-- 1 kazy staff 670K 10 11 13:32 S100HNA6_python.zip
取得できましたね。
パチパチ👏
................さて,
ここまでネット上で説明されまくっている話をほぼそのまま説明しました。
ここからは適当なワークをしてちっとは意味がある記事風に仕上げていきたいと思う。💪💪💪💪💪💪💪💪💪💪💪
(適当なワーク1)有価証券報告書が提出されるのが多いのは何月?
結論
6月
- なんで?:
3月決算
の企業が多い + 有価証券報告書の提出は決算後3ヶ月以内
と義務付けられている
- なんで?:
検証物語
企業によって有価証券報告書を提出する日付は様々です。
提出が多い月, 少ない月などはあるのでしょうか?
本日紹介したEDINET APIを使って集計してみます。
〜〜〜以下に集計の際にKAZYの脳内で行われたやり取り〜〜〜
KAZY< 魔法使いさん, 集計して!!
🧙♂️< えいやっ! ぼんっ(魔法の音)
KAZY< 1年分ないやんけ(2020年10月執筆時)
🧙♂️< 2019ね〜ん, えいやっ! ぼぼんっ(魔法の音)
KAZY< もう一声!!!
🧙♂️< 2018ね〜ん, えいやっ! ぼぼぼんっ(魔法の音)
KAZY< 6月提出が圧倒的に多いな
🧙♂️< 決算月が3月の企業が多いからじゃな
KAZY< 3ヶ月ずれとるやんけ
🤖 < 有価証券報告書は各事業年度終了後、3か月以内
の金融庁への提出が義務づけられているんやでぇ
KAZY< なるほど
(適当なワーク2)有価証券報告書が提出されるのが多いのはいつ?
結論
金曜日
- (なんで?) しらん, 締切になりがちなんちゃう?
検証物語
- (なんで?) しらん, 締切になりがちなんちゃう?
以下に集計の際にKAZYの脳内で行われたやり取り。
KAZY< 魔法使いさん, こんどは曜日で集計して!!
KAZY< 3年分頼むわ!!!
🧙♂️< そいやっ! ぽんっぽんっぽんっ(魔法の音)
KAZY< 金曜日が多いな
KAZY< 締切に設定されがちなんやろな
KAZY< 土日に提出はしないんだな
(おまけ)期間を指定して有価証券報告書のXBRLファイルをダウンロードして展開してXBRLファイルのみ抽出するしてあとは削除しちゃうプログラムのスクリプト
どぞ。
↓使い方(再掲)↓
poetry使える人
git clone https://github.com/KAZYPinkSaurus/disclosure-crowler.git cd disclosure-crowler # ライブラリのインストール poetry install #オプションを表示 poetry run python -m disclosure.main --help # 2020/09/04から2020/10/04の有価証券報告書をダウンロードしてxbrlファイルを抽出 poetry run python -m disclosure.main --from 2020-09-04 --to 2020-10-04 -x ls output/*
poetry使えない人
git clone https://github.com/KAZYPinkSaurus/disclosure-crowler.git cd disclosure-crowler pip install requests==2.24.0 python-dateutil==2.8.1 loguru==0.5.3 click==7.1.2 #オプションを表示 poetry run python -m disclosure.main --help # 2020/09/04から2020/10/04の有価証券報告書をダウンロードしてxbrlファイルを抽出 python -m disclosure.main --from 2020-09-04 --to 2020-10-04 -x
おわりに
EDINET APIを使って簡単にXBRLファイルをダウンロードできましたね。 XBRLファイルをダウンロードしたら次にやりたいのが構文解析してテキストマイニングじゃあありませんか? けど...難しいんでしょ? って方はこちらを読んでみるといいかもしれませんよ。
それでは。
Appendix
書類一覧APIで変えたくなるパラメータ
パラメータ名 | 値 | 説明 |
---|---|---|
date | YYYY-MM-DD | ファイル日付を指定 |
type | 1 | メタデータのみを取得(typeが指定ないとこちらになる) |
type | 2 | 提出書類一覧及びメタデータを取得 |
書類取得APIで変えたくなるパラメータ
パラメータ名 | 値 | 説明 | ファイル形式 |
---|---|---|---|
type | 1 | 提出本文書及び監査報告書を取得 | ZIP |
type | 2 | PDFファイルを取得 | |
type | 3 | 代替書面・添付文書を取得 | ZIP |
type | 4 | 英文ファイルを取得 | ZIP |
参考
- EDINET API機能利用規約
- API関連資料(EDINET API仕様書や,サンプルプログラムが配布されています)