株式会社ホクソエムのブログ

R, Python, データ分析, 機械学習

EDINET APIって知ってる? ~有価証券報告書をもっと楽にダウンロードする話~

はじめに

こんにちは, ホクソエムサポーターの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の総称です。

  1. 提出された書類を把握するためのAPI
    • 書類のメタ情報を教えてくれる
  2. 提出された書類を取得するための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つ取得する

流れ

  1. 日付をメタファイルを取得
  2. メタファイルから書類ID(docID)を取得
  3. 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つ取得する

流れ(コマンドライン編と同じ)

  1. 日付をメタファイルを取得
  2. メタファイルから書類ID(docID)を取得
  3. 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ファイルのみ抽出するしてあとは削除しちゃうプログラムのスクリプト

どぞ。

github.com

↓使い方(再掲)↓

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ファイルをダウンロードしたら次にやりたいのが構文解析してテキストマイニングじゃあありませんか? けど...難しいんでしょ? って方はこちらを読んでみるといいかもしれませんよ。

blog.hoxo-m.com

それでは。

Appendix

書類一覧APIで変えたくなるパラメータ

パラメータ名 説明
date YYYY-MM-DD ファイル日付を指定
type 1 メタデータのみを取得(typeが指定ないとこちらになる)
type 2 提出書類一覧及びメタデータを取得

書類取得APIで変えたくなるパラメータ

パラメータ名 説明 ファイル形式
type 1 提出本文書及び監査報告書を取得 ZIP
type 2 PDFファイルを取得 PDF
type 3 代替書面・添付文書を取得 ZIP
type 4 英文ファイルを取得 ZIP

参考

*1:ブラウザからダウンロードも同様

*2:ちなみに, typeを2にすると有価証券報告書のpdfファイルがダウンロードできます。 他はAppendixを参照してみてください。