Slide 1

Slide 1 text

PythonでXBRL形式の 財務情報を扱おう PyCon JP 2020 2020/8/28 Miyasaka Eriko

Slide 2

Slide 2 text

自己紹介 宮坂 絵里子 (みやさか えりこ) • 株式会社リーディング・エッジ社 所属 • Python歴 2年 • 元経理

Slide 3

Slide 3 text

 対象 XBRLビギナーの方 – 有価証券報告書(有報)の財務情報などを収集したい方が主な対象  話すこと XBRL解析するための基本知識、ラクに解析するための情報

Slide 4

Slide 4 text

目次 1. XBRLの基本 2. EDINETの有報XBRLを見てみよう 3. Arelle の紹介 4. PythonでXBRL形式の有報を扱ってみよう

Slide 5

Slide 5 text

目次 1. XBRLの基本 2. EDINETの有報XBRLを見てみよう 3. Arelle の紹介 4. PythonでXBRL形式の有報を扱ってみよう

Slide 6

Slide 6 text

XBRL (eXtensible Business Reporting Language)  事業報告用の情報の再利用などを便利にするグローバルな規格  XMLベース

Slide 7

Slide 7 text

XBRL データ構造(概要) インスタンス文書 (報告値) タクソノミ文書 (構造定義) タクソノミスキーマ (項目定義) 表示リンク 計算リンク 定義リンク 名称リンク 参照リンク ディメンションリンク 他… XBRL2.1標準 拡張 リンクベース

Slide 8

Slide 8 text

・・・ XBRL インスタンス文書 - 値 - 単位 - コンテキスト - 期間: 2018/04/01 - 2019/03/31 - シナリオ・・・ : 5,800,000 : JPY xx:NetSales - 値 - 単位 - コンテキスト - 期間: 2019/04/01 - 2020/03/31 - シナリオ・・・ : 6,000,000 : JPY xx:NetSales - 値 - 単位 - コンテキスト - 期間: 2018/04/01 - 2019/03/31 - シナリオ・・・ : 54,520 : USD xx:NetSales 報告値の定義  同じ項目名で値の異なる複数のfactが存在し得る  値は金額だけでなく、文字情報、%など色々 - 値 - コンテキスト - 時点: 2019/05/11 : 株式会社XX xx:FilerNameIn JapaneseDEI - 値 - コンテキスト - 時点: 2019/05/11 xx:BusinessRisksTextBlock : …【事業等のリスク】有価証券報告書に記載し た 事 業の状況、経理の・・・・・・ 報告値の一式を fact と呼ぶ

Slide 9

Slide 9 text

・・・ XBRL タクソノミ文書 - タクソノミスキーマ CashAndDepositsの定義 - 項目名:CashAndDeposits - ID :jppfs_cor_CashAndDeposits - データ型:xbrli:monetaryItemType ・・・ 項目の定義  項目名やID、扱われ方などを定義 NetSalesの定義 - 項目名:NetSales - ID :jppfs_cor_NetSales - データ型:xbrli:monetaryItemType ・・・ FilerNameInJapaneseDEIの定義 - 項目名:FilerNameInJapaneseDEI - ID :jpdei_cor_FilerNameInJapaneseDEI - データ型:xbrli:stringItemType ・・・

Slide 10

Slide 10 text

他… XBRL タクソノミ文書 - リンクベース 項目間の関係や、項目に対する追加情報などの定義  XBRL2.1 標準のリンク5種 + 拡張リンク 表示リンク [損益計算書] - 売上(1) - 売上原価(2) - 売上総利益(3) - ・・・ - 営業外収益(6) -- 受取利息(1) -- 雑収入(2) -- ・・・ - ・・・ 計算リンク [損益計算書] ・・・ { 1*売上総利益 = 1*売上 + (-1)*売上原価 ) } ・・・ 定義リンク 項目間の様々な関係 名称リンク 項目の表示名称 参照リンク 参考文献(会計概念定 義の根拠文献) ディメンションリンク 項目間の多次元データ構造 - 連結 / 個別 - セグメント - … 拡張 XBRL2.1標準

Slide 11

Slide 11 text

目次 1. XBRLの基本 2. EDINETの有報XBRLを見てみよう 3. Arelle の紹介 4. PythonでXBRL形式の有報を扱ってみよう

Slide 12

Slide 12 text

EDINET (Electronic Disclosure for Investors' NETwork) 金融庁の 「金融商品取引法に基づく有価証券報告書等の開示書類に関する電子開示システム」  EDINET閲覧サイトで開示書類を閲覧可能 – 有価証券報告書は5年 – 四半期報告書は3年 – ・・・  段階的にXBRLが導入されてきた – 有報、四半期報告書は全文XBRL化されている EDINET 概要書から引用

Slide 13

Slide 13 text

 EDINETタクソノミ – 金融庁が提供するタクソノミ (毎年更新、種類は複数)  提出者別タクソノミ – 提出者がEDINETタクソノミをベースに 作成するタクソノミ – 必要に応じて独自定義を追加 EDINETのタクソノミ文書 提出者別タクソノミ作成ガイドラインから引用 提出者ごとにタクソノミが異なる

Slide 14

Slide 14 text

EDINETの有報XBRLを見てみよう とりあえず手動で、XBRL形式の有価証券報告書を1つダウンロード 1. EDINET書類詳細検索画面 にアクセス 2. 「書類種別を指定する 」で有価証券報告書を指定して検索 3. 検索結果の「XBRL」のアイコン押下 →ZIPファイルがダウンロードされる EDINET書類閲覧操作ガイド から引用

Slide 15

Slide 15 text

EDINETの有報XBRLを見てみよう ZIPファイル展開例 インスタンス文書+ 提出者別タクソノミ Ccc ・・・ファイル構成定義 インラインXBRL インスタンスの値と表示情報が一緒になったもの。 提出者がインラインXBRLを提出すると EDINETでインラインXBRLから.xbrl が作成される ※ *_gla.xml(ジェネリックラベルリンク)が存在するケースもあり得る

Slide 16

Slide 16 text

EDINETの有報XBRL - インスタンス文書の読み方 - インスタンス文書(~.xbrl) 【単位の定義】 iso4217:JPY 【コンテキストの定義】 EXXXXX-NNN 2019-04-01 2020-03-31 jppfs_cor:NonConsolidatedMember 【報告値】 349105000000 連結 / 個別を表す軸 個別 (※) ※ 連結の場合は設定しない - 値 - 単位 - コンテキスト - 期間: 2019/04/01 - 2020/03/31 - シナリオ - 連結 / 個別:個別 : 34,9105,000,000 : JPY Jppfs_cor: NetSales

Slide 17

Slide 17 text

タクソノミスキーマ(~.xsd) 【項目の定義】 インポートされている~.xsd http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2019-11-01/jppfs_cor_2019-11-01.xsd 【EDINETタクソノミのスキーマ のインポート】 【項目の定義】 (提出者の独自定義) ・・・ ダウンロードしたzipファイル内の ~.xsd NetSalesの定義 - 項目名 :NetSales - データ型:金額 - 抽象区分:いいえ - 貸借区分:貸方 - ID:jppfs_cor_NetSales - 代替グループ:その他 - nil可否 :可 - 期間時点 :期間 EDINETの有報XBRL – タクソノミスキーマの読み方 -

Slide 18

Slide 18 text

リンクベース:計算リンク(~_cal.xml) 【タクソノミスキーマの項目の呼び名】 ・・・ 【関係の定義】 jppfs_cor_GrossProfit = 1*jppfs_cor_NetSales + (-1)*jppfs_cor_CostOfSales http://.・・・ jppfs_cor_2019-11-01.xsd(タクソノミスキーマ) の jppfs_cor_GrossProfit を、ここでは“jppfs_cor_GrossProfit” と呼ぶよ “jppfs_cor_GrossProfit” → “jppfs_cor_NetSales” という 足し算関係 をorder(順番)とweight(重み)で定義しているよ EDINETの有報XBRL – リンクベースの読み方① -

Slide 19

Slide 19 text

リンクベース:名称リンク(~_lab.xml) ・・・日本語 【タクソノミスキーマの呼び名、値を定義して呼び名】 売上高 【関係の定義】 参照されている~_lab.xml http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2019-11-01/label/jppfs_2019-11-01_lab.xml 【関係の定義】 (提出者の独自定義) ダウンロードしたzipファイル内の ~_lab.xml 【EDINETタクソノミの名称リンク の参照】 ダウンロードしたzipファイル内の ~.xsd NetSales は「売上高」 EDINETの有報XBRL – リンクベースの読み方② -

Slide 20

Slide 20 text

XBRLデータの読み方がだんだん分かってきた 解析してみようかな

Slide 21

Slide 21 text

NetSales は「売上高」と表示する、という情報をプログラムで取得するには・・・ • ダウンロードしたzipファイル内~.xsd を開き、参照しているEDINETタクソノミの(複数あるが該当の)名称リンクのURLを取得 • URL(名称リンクのファイル)にアクセス • この名称リンクファイル内で、対象の項目を示すlocater型の要素を探す • 見つけた要素のxlink:labelの値を取得 • 取得した値を from とする arc型の要素を探す • 見つけたarc型の要素のtoの値を取得 • ・・・ 続く ・・・ とにかく定義たどる・・・ 面倒だなぁ

Slide 22

Slide 22 text

目次 1. XBRLの基本 2. EDINETの有報XBRLを見てみよう 3. Arelle の紹介 4. PythonでXBRL形式の有報を扱ってみよう

Slide 23

Slide 23 text

Arelle とは  Apache License 2.0 の Python製OSS  XBRL International (XBRLを開発・保守・推進する国際組織) により、XBRL仕様に準拠し たソフトウェアとして認定されている – https://software.xbrl.org/  公式ページ: https://arelle.org/arelle/  Github : https://github.com/Arelle/Arelle

Slide 24

Slide 24 text

ArelleでXBRL解析する メリット  らく – XBRLの仕様に沿って解析してくれる • インスタンス文書を読み込むとその参照先のタクソノミも解析してくれる → 定義を辿るような煩雑な処理を自分で書く必要がない • XBRLの仕様をすべて把握することは困難だが、Arelleを使うことによりある程度のXBRL知識でも解析できる → データ収集にかける労力を減らし、目的である財務分析に時間を使うことができる  無償

Slide 25

Slide 25 text

ArelleでXBRL解析する デメリット  取得したい情報によっては、無駄に重い処理となる場合がある – 複雑な解析不要なケースでは、自分でプログラムを書いた方が良い (項目名を指定して報告値を取得するだけで済むケースなど)  (今のところ)情報が少ない

Slide 26

Slide 26 text

目次 1. XBRLの基本 2. EDINETの有報XBRLを見てみよう 3. Arelle の紹介 4. PythonでXBRL形式の有報を扱ってみよう

Slide 27

Slide 27 text

PythonでXBRL形式の有報を扱ってみよう 流れ 1. 有報を取得(EDINET API) 2. XBRL解析(Arelle)

Slide 28

Slide 28 text

有報を取得(EDINET API)  EDINETが提供するAPI  EDINET API のドキュメント – https://disclosure.edinet-fsa.go.jp/EKW0EZ0015.html > 「EDINET API関連資料」  2種類のAPIがある – 書類一覧API : 書類を把握するためのAPI – 書類取得API : 書類を取得するためのAPI

Slide 29

Slide 29 text

 エンドポイント  HTTPメソッド: GET  リクエストパラメータ – date (必須) : YYYY-MM-DD形式のファイル日付 提出処理が行われた日、書類情報修正日、開示不開示区分の変更日 – type (任意) : 1(デフォルト)・・・メタデータのみ 2・・・提出書類一覧及びメタデータ https://disclosure.edinet-fsa.go.jp/api/{バージョン}/documents.json 有報を取得(EDINET API) - 書類一覧 -

Slide 30

Slide 30 text

 提出書類一覧及びメタデータの取得例 import requests import json endpoint = "https://disclosure.edinet-fsa.go.jp/api/v1/documents.json" params = { "date" : "2019-05-13", "type": 2 } res = requests.get(endpoint , params=params) res_dict = json.loads(res.text) # 処理・・・ 有報を取得(EDINET API) - 書類一覧 -

Slide 31

Slide 31 text

 提出書類一覧及びメタデータの取得結果例 { "metadata": { "title": "提出された書類を把握するためのAPI", "parameter": { "date": "2019-05-13", "type": "2" }, "resultset": { "count": 492 }, "processDateTime": "2020-06-01 00:03", "status": "200", "message": "OK" }, "results": [ { ・・・ }, { ・・・ }, { ・・・ }, , ・・・ ] } { ・・・ } 【文書情報】 書類管理番号、書類種別など項目たくさん { "seqNumber": 1, “docID”: “XXXXXX”, ← 書類管理番号(書類取得で使う) "edinetCode": "EXXXXX", "filerName”: “株式会社XXXXXX", "formCode": "043000", “docTypeCode”: “140”, ← 書類種別(有報は120) ・・・(省略)・・・ }, 有報を取得(EDINET API) - 書類一覧 -

Slide 32

Slide 32 text

 エンドポイント  HTTPメソッド: GET  リクエストパラメータ – type (必須) : 1~4 (XBRLを取得するには1を指定) https://disclosure.edinet-fsa.go.jp/api/{バージョン}/documents/{書類管理番号} 有報を取得(EDINET API) - 書類取得 -

Slide 33

Slide 33 text

 取得例 import requests docid = "S100FIZV" endpoint = f"https://disclosure.edinet-fsa.go.jp/api/v1/documents/{docid}" params = { "type" : 1 } res = requests.get(endpoint, params=params) # 返ってくるバイナリデータをzip形式のファイルとして保存 (typeに1を指定した場合) ・・・省略・・・ 有報を取得(EDINET API) - 書類取得 -

Slide 34

Slide 34 text

ZIPファイル展開例 (再掲) 有報を取得(EDINET API) - 書類取得 - インスタンス文書+ 提出者別タクソノミ ・・・ファイル構成定義 インラインXBRL インスタンスの値と表示情報が一緒になったもの。 提出者がインラインXBRLを提出すると EDINETでインラインXBRLから.xbrl が作成される ※ *_gla.xml(ジェネリックラベルリンク)が存在するケースもあり得る ここだけ抽出すればOK

Slide 35

Slide 35 text

XBRL解析(Arelle)  基本 from arelle import Cntlr, ModelManager ctrl = Cntlr.Cntlr() model_manager = ModelManager.initialize(ctrl) model_xbrl = model_manager.load(“~.xbrl”) ・・・処理・・・ model_manager.close() 初期化・インスタンス文書読込み 文書情報を解放

Slide 36

Slide 36 text

 QName指定でfact取得 全企業共通の必須項目であれば、QName指定で取得すると楽。 タクソノミ要素リストというエクセルファイル(EDINETサイトからダウンロードできる)を見るとQnameが分かりやすい。 例: 会計基準のQName jpdei_cor:AccountingStandardsDEI タクソノミ要素リストより抜粋 ※EDINETタクソノミは毎年更新される XBRL解析(Arelle)

Slide 37

Slide 37 text

 QName指定でfact取得例 : jpdei_cor:AccountingStandardsDEI(会計基準) from arelle.ModelValue import qname ・・・ ns = model_xbrl.prefixedNamespaces[“jpdei_cor”] print(ns) # -> http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/jpdei_cor qn = qname(ns, name="jpdei_cor:AccountingStandardsDEI") facts = model_xbrl.factsByQname[qn] print(facts) # -> {modelFact[87390, qname: jpdei_cor:AccountingStandardsDEI, contextRef: FilingDateInstant, unitRef: None, value: Japan GAAP, jpcrp030000-asr-001_EXXXXX-000_2019-11-30_01_2020-02-27.xbrl, line 2337]} プレフィックスをキーとして 名前空間URIが格納されている辞書 QName文字列 → QName型 QNameをキーとして factが格納されている辞書。 値はfactのset(同じQNameのfactは複数あり得る) XBRL解析(Arelle)

Slide 38

Slide 38 text

 factから項目の表示名称を取得する例 fact = list(facts)[0] print(fact.concept.label()) # -> 会計基準 print(fact.concept.label(lang="en")) # -> Accounting standards from arelle import XbrlConst print(fact.concept.label(preferredLabel=XbrlConst.verboseLabel)) # ->会計基準、DEI conceptはタクソノミスキーマで定義されている項目を表す。 その項目に名称リンクで設定されている表示名称が取得される。 XBRL解析(Arelle) 「冗長ラベル」なども取得可能 デフォルト言語はマシン環境による。 lang=で他の言語を指定可能。 (その言語の名称リンクが用意されていれば)

Slide 39

Slide 39 text

 他にも便利機能 – 指定したディメンションが設定されているfactを一括取得 – 表示リンク、計算リンク、定義リンク関連 – 項目の階層構造やコンテキストを反映した一覧表を出力 など・・・ Arelleを利用したサンプルコード https://github.com/miya8/xbrl_parser  使う人が増えて情報も増えると嬉しい XBRL解析(Arelle)

Slide 40

Slide 40 text

まとめ 以下を紹介しました。  XBRLの基本的な仕様とデータの読み方  XBRL解析に便利なArelleの基本的な使い方 ご清聴ありがとうございました。

Slide 41

Slide 41 text

補足 : EDINETのXBRLデータをArelleで扱う際の注意 EDINETで採用する技術仕様(下図赤枠) ArelleがXBRL準拠認定を受けている仕様 ★ ★ ★ • EDINETで採用されているXBRLの拡張仕様Generic Labels 1.0 が Arelleの準拠認定を受けている仕様リストに記載されていない。 → XBRL International のテスト対象モジュールのリスト(https://software.xbrl.org/)に Generic Labels が記載されていない(→認定テスト対象外と思われる)。 また、適用箇所である~.gla.xml(EDINETタクソノミ内)の定義の一部を対象に、Arelleの 機能(modelRoleType.genLabelメソッド)で正しく取得できることを確認できた。 問題なく使えそうではあるが、品質を求められる場面で使う際は要注意。 • Inline XBRL のバージョンが異なる → 適用箇所であるインラインXBRLは通常XBRL解析に使わないので問題ないが、インラ インXBRLで何かする場合はArelleを使わない方が良いと思われる(Inline XBRL 1.1と 1.0の違いについては未調査) EDINET フレームワーク設計書 から引用 XBRL Certified Software から引用

Slide 42

Slide 42 text

企業によって使用する勘定科目が異なる 例: 売上高を示す勘定科目 複数社の財務諸表をまとめて扱う場合、 QName指定では意図した通りにデータを取得できない(ケースがある) 補足 : 財務諸表の解析に関する注意 表示名称 QName 企業A 売上高 jppfs_cor:NetSales 企業B 営業収益 jppfs_cor:OperatingRevenue1 ※ 勘定科目はQname指定で取得するには向いていない。どのようなデータを作りたいかに合わせて処理を検討する。