top of page

EDINET API ver.2で企業情報を取得する

1.はじめに

  • EDINET API ver.2が公開されました!

  • 今までのxbrlとの格闘がなくなればいいなと思います。


2.経緯

  • 現状、(上場)企業の財務情報や「研究開発活動」の部分のテキストを取ろうとすると、xbrlというファイル形式と格闘しないといけません。(buffetコードなどプラン使えば一発ですが)

  • なので自分でコードを書くとこんな感じで地獄でした。そしてこれが正しい項目なのかもちょっと怪しい。うまく取得できないパターンに対応していくと大変なことになります。

#@title 共通処理(edinet-xbrlとmojimojiインストる)
import pandas as pd
!pip install edinet-xbrl
from edinet_xbrl.edinet_xbrl_parser import EdinetXbrlParser

!pip install mojimoji
import mojimoji



import re
def extract_data(edinet_xbrl_object,keys):
    rep_pat = "<.*?>|\n|\xa04|\xa0"
    dlist = []
    for k,v in keys.items():
        if v == "Duration" or v == "Instant":
            context_ref_current =  "CurrentYear" + v
            context_ref_current_anot =  "CurrentYear" + v + "_NonConsolidatedMember"
        else:
            context_ref_current =  v
            context_ref_1yr = v

        try:
            match = edinet_xbrl_object.get_data_by_context_ref(k, context_ref_current)
            if match is not None:
                v1 = edinet_xbrl_object.get_data_by_context_ref(k, context_ref_current).get_value()
        except:
            match = edinet_xbrl_object.get_data_by_context_ref(k, context_ref_current_anot)
            if match is not None:
                v1 = edinet_xbrl_object.get_data_by_context_ref(k, context_ref_current_anot).get_value()
            try:
                match = edinet_xbrl_object.get_data_by_context_ref(k, "Prior4YearDuration")
                if match is not None:
                    v1 = edinet_xbrl_object.get_data_by_context_ref(k, "Prior4YearDuration").get_value()
            except:
                    v1 = ""
        v2 = re.sub(rep_pat, "", str(v1))
        v3 = mojimoji.zen_to_han(v2,kana=False)
        dlist.append(v3)
    return dlist

  • xbrlとの苦闘は沢山のネット情報があります(^_^;)。

  • 今年はじめあたりからEDINETのAPIが刷新されるという情報の中に、xbrlをcsvに変換した情報も取れるようになった!との情報がありました。8/21に解禁されましたので、早速AIPキーを申請して、csvで取れるか試してみます。



3.試しで取得してみる

  • 簡単!ちょっと苦労したのはエンコードでutf-16だったのと、zipファイル解凍後のフォルダ構造で勘違いして手こずりました。

FNAME = "S100RB3P"
url = "https://api.edinet-fsa.go.jp/api/v2/documents/"+ FNAME + "?Subscription-Key=API_KEY&type=5"

import requests
r = requests.get(url, params=payload)

from urllib.request import urlretrieve
filename = FNAME + ".zip"
urlretrieve(url, filename)

#中身を覗くとファイルが複数あったのでとりあえず回答
!unzip $filename -d $FNAME

#globで抜き出し
import pandas as pd
import glob 
csvfiles = glob.glob(FNAME+"/XBRL_TO_CSV/jpcrp*.csv")

#結局必要だったのは1ファイルのみ
for csvf in csvfiles:
    print(csvf)
    df = pd.read_table(csvf,encoding="utf-16",error_bad_lines=False)



  • いい感じにとれました!1651も項目がありました。



4.その他

  • 異常な使い方にならないように気をつけながら、分析業務の基本データとして、各社データを蓄積したいと思います。特にテキスト系情報。

  • なお、NYSEの企業情報であれば、opendataでBigQueryに蓄積してくれています。これは便利!

  • csvからの情報取得は薄いwrapperを書きたいなと思います。

閲覧数:266回0件のコメント

最新記事

すべて表示

Comments


bottom of page