PyConJP2020_5_0828_1450

53b0aad441252758c4e5a34be31a5aa5?s=47 miya8
August 27, 2020

 PyConJP2020_5_0828_1450

53b0aad441252758c4e5a34be31a5aa5?s=128

miya8

August 27, 2020
Tweet

Transcript

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

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

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

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

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

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

  7. XBRL データ構造(概要) インスタンス文書 (報告値) タクソノミ文書 (構造定義) タクソノミスキーマ (項目定義) 表示リンク 計算リンク

    定義リンク 名称リンク 参照リンク ディメンションリンク 他… XBRL2.1標準 拡張 リンクベース
  8. ・・・ 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 と呼ぶ
  9. ・・・ 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 ・・・
  10. 他… XBRL タクソノミ文書 - リンクベース 項目間の関係や、項目に対する追加情報などの定義  XBRL2.1 標準のリンク5種 +

    拡張リンク 表示リンク [損益計算書] - 売上(1) - 売上原価(2) - 売上総利益(3) - ・・・ - 営業外収益(6) -- 受取利息(1) -- 雑収入(2) -- ・・・ - ・・・ 計算リンク [損益計算書] ・・・ { 1*売上総利益 = 1*売上 + (-1)*売上原価 ) } ・・・ 定義リンク 項目間の様々な関係 名称リンク 項目の表示名称 参照リンク 参考文献(会計概念定 義の根拠文献) ディメンションリンク 項目間の多次元データ構造 - 連結 / 個別 - セグメント - … 拡張 XBRL2.1標準
  11. 目次 1. XBRLの基本 2. EDINETの有報XBRLを見てみよう 3. Arelle の紹介 4. PythonでXBRL形式の有報を扱ってみよう

  12. EDINET (Electronic Disclosure for Investors' NETwork) 金融庁の 「金融商品取引法に基づく有価証券報告書等の開示書類に関する電子開示システム」  EDINET閲覧サイトで開示書類を閲覧可能

    – 有価証券報告書は5年 – 四半期報告書は3年 – ・・・  段階的にXBRLが導入されてきた – 有報、四半期報告書は全文XBRL化されている EDINET 概要書から引用
  13.  EDINETタクソノミ – 金融庁が提供するタクソノミ (毎年更新、種類は複数)  提出者別タクソノミ – 提出者がEDINETタクソノミをベースに 作成するタクソノミ

    – 必要に応じて独自定義を追加 EDINETのタクソノミ文書 提出者別タクソノミ作成ガイドラインから引用 提出者ごとにタクソノミが異なる
  14. EDINETの有報XBRLを見てみよう とりあえず手動で、XBRL形式の有価証券報告書を1つダウンロード 1. EDINET書類詳細検索画面 にアクセス 2. 「書類種別を指定する 」で有価証券報告書を指定して検索 3. 検索結果の「XBRL」のアイコン押下

    →ZIPファイルがダウンロードされる EDINET書類閲覧操作ガイド から引用
  15. EDINETの有報XBRLを見てみよう ZIPファイル展開例 インスタンス文書+ 提出者別タクソノミ Ccc ・・・ファイル構成定義 インラインXBRL インスタンスの値と表示情報が一緒になったもの。 提出者がインラインXBRLを提出すると EDINETでインラインXBRLから.xbrl

    が作成される ※ *_gla.xml(ジェネリックラベルリンク)が存在するケースもあり得る
  16. EDINETの有報XBRL - インスタンス文書の読み方 - インスタンス文書(~.xbrl) 【単位の定義】 <xbrli:unit id="JPY"><xbrli:measure>iso4217:JPY</xbrli:measure></xbrli:unit> 【コンテキストの定義】 <xbrli:context

    id="CurrentYearDuration_NonConsolidatedMember"> <xbrli:entity> <xbrli:c scheme="http://disclosure.edinet-fsa.go.jp">EXXXXX-NNN</xbrli:identifier> </xbrli:entity> <xbrli:period> <xbrli:startDate>2019-04-01</xbrli:startDate> <xbrli:endDate>2020-03-31</xbrli:endDate> </xbrli:period> <xbrli:scenario> <xbrldi:explicitMember dimension="jppfs_cor:ConsolidatedOrNonConsolidatedAxis">jppfs_cor:NonConsolidatedMember</xbrldi:explicitMember> </xbrli:scenario> </xbrli:context> 【報告値】 <jppfs_cor:NetSales id="fact38" contextRef="CurrentYearDuration_NonConsolidatedMember" unitRef="JPY" decimals="-6">349105000000</jppfs_cor:NetSales> 連結 / 個別を表す軸 個別 (※) ※ 連結の場合は設定しない - 値 - 単位 - コンテキスト - 期間: 2019/04/01 - 2020/03/31 - シナリオ - 連結 / 個別:個別 : 34,9105,000,000 : JPY Jppfs_cor: NetSales
  17. タクソノミスキーマ(~.xsd) 【項目の定義】 <xsd:element name=“NetSales” id="jppfs_cor_NetSales“ type=“xbrli:monetaryItemType“ substitutionGroup="xbrli:item“ abstract=“false“ nillable="true“ xbrli:balance=“credit“

    xbrli:periodType="duration“ /> インポートされている~.xsd http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2019-11-01/jppfs_cor_2019-11-01.xsd 【EDINETタクソノミのスキーマ のインポート】 <import … /> <import schemaLocation="http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2019-11-01/jppfs_cor_2019-11-01.xsd" namespace="http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2019-11-01/jppfs_cor" /> <import … /> 【項目の定義】 (提出者の独自定義) ・・・ ダウンロードしたzipファイル内の ~.xsd NetSalesの定義 - 項目名 :NetSales - データ型:金額 - 抽象区分:いいえ - 貸借区分:貸方 - ID:jppfs_cor_NetSales - 代替グループ:その他 - nil可否 :可 - 期間時点 :期間 EDINETの有報XBRL – タクソノミスキーマの読み方 -
  18. リンクベース:計算リンク(~_cal.xml) 【タクソノミスキーマの項目の呼び名】 <link:loc xlink:type="locator" xlink:href="http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2019-11-01/jppfs_cor_2019-11-01.xsd#jppfs_cor_GrossProfit" xlink:label="jppfs_cor_GrossProfit" /> <link:loc xlink:type="locator" xlink:href="http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2019-11-01/jppfs_cor_2019-11-01.xsd#jppfs_cor_NetSales"

    xlink:label="jppfs_cor_NetSales" /> <link:loc xlink:type="locator" xlink:href="http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2019-11-01/jppfs_cor_2019-11-01.xsd#jppfs_cor_CostOfSales" xlink:label="jppfs_cor_CostOfSales" /> ・・・ 【関係の定義】 <link:calculationArc xlink:type="arc" xlink:from="jppfs_cor_GrossProfit" xlink:to="jppfs_cor_NetSales" xlink:arcrole="http://www.xbrl.org/2003/arcrole/summation-item" order="1" weight="1" /> <link:calculationArc xlink:type="arc" xlink:from="jppfs_cor_GrossProfit" xlink:to="jppfs_cor_CostOfSales" xlink:arcrole="http://www.xbrl.org/2003/arcrole/summation-item" order="2" weight="-1" /> 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 – リンクベースの読み方① -
  19. リンクベース:名称リンク(~_lab.xml) ・・・日本語 【タクソノミスキーマの呼び名、値を定義して呼び名】 <link:loc xlink:type="locator" xlink:href="../jppfs_cor_2019-11-01.xsd#jppfs_cor_NetSales" xlink:label="NetSales"/> <link:label xlink:type="resource" xlink:label="label_NetSales"

    xlink:role="http://www.xbrl.org/2003/role/label" xml:lang="ja" id="label_NetSales">売上高</link:label> 【関係の定義】 <link:labelArc xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="NetSales" xlink:to="label_NetSales"/> 参照されている~_lab.xml http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2019-11-01/label/jppfs_2019-11-01_lab.xml 【関係の定義】 (提出者の独自定義) ダウンロードしたzipファイル内の ~_lab.xml 【EDINETタクソノミの名称リンク の参照】 <link:linkbaseRef … /> <link:linkbaseRef xlink:type=“simple” xlink:href=“http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2019-11-01/label/jppfs_2019-11-01_lab.xml” ・・・ /> <link:linkbaseRef … /> ダウンロードしたzipファイル内の ~.xsd NetSales は「売上高」 EDINETの有報XBRL – リンクベースの読み方② -
  20. XBRLデータの読み方がだんだん分かってきた 解析してみようかな

  21. NetSales は「売上高」と表示する、という情報をプログラムで取得するには・・・ • ダウンロードしたzipファイル内~.xsd を開き、参照しているEDINETタクソノミの(複数あるが該当の)名称リンクのURLを取得 • URL(名称リンクのファイル)にアクセス • この名称リンクファイル内で、対象の項目を示すlocater型の要素を探す •

    見つけた要素のxlink:labelの値を取得 • 取得した値を from とする arc型の要素を探す • 見つけたarc型の要素のtoの値を取得 • ・・・ 続く ・・・ とにかく定義たどる・・・ 面倒だなぁ
  22. 目次 1. XBRLの基本 2. EDINETの有報XBRLを見てみよう 3. Arelle の紹介 4. PythonでXBRL形式の有報を扱ってみよう

  23. 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
  24. ArelleでXBRL解析する メリット  らく – XBRLの仕様に沿って解析してくれる • インスタンス文書を読み込むとその参照先のタクソノミも解析してくれる → 定義を辿るような煩雑な処理を自分で書く必要がない

    • XBRLの仕様をすべて把握することは困難だが、Arelleを使うことによりある程度のXBRL知識でも解析できる → データ収集にかける労力を減らし、目的である財務分析に時間を使うことができる  無償
  25. ArelleでXBRL解析する デメリット  取得したい情報によっては、無駄に重い処理となる場合がある – 複雑な解析不要なケースでは、自分でプログラムを書いた方が良い (項目名を指定して報告値を取得するだけで済むケースなど)  (今のところ)情報が少ない

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

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

  28. 有報を取得(EDINET API)  EDINETが提供するAPI  EDINET API のドキュメント – https://disclosure.edinet-fsa.go.jp/EKW0EZ0015.html

    > 「EDINET API関連資料」  2種類のAPIがある – 書類一覧API : 書類を把握するためのAPI – 書類取得API : 書類を取得するためのAPI
  29.  エンドポイント  HTTPメソッド: GET  リクエストパラメータ – date (必須)

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

    : 1~4 (XBRLを取得するには1を指定) https://disclosure.edinet-fsa.go.jp/api/{バージョン}/documents/{書類管理番号} 有報を取得(EDINET API) - 書類取得 -
  33.  取得例 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) - 書類取得 -
  34. ZIPファイル展開例 (再掲) 有報を取得(EDINET API) - 書類取得 - インスタンス文書+ 提出者別タクソノミ ・・・ファイル構成定義

    インラインXBRL インスタンスの値と表示情報が一緒になったもの。 提出者がインラインXBRLを提出すると EDINETでインラインXBRLから.xbrl が作成される ※ *_gla.xml(ジェネリックラベルリンク)が存在するケースもあり得る ここだけ抽出すればOK
  35. XBRL解析(Arelle)  基本 from arelle import Cntlr, ModelManager ctrl =

    Cntlr.Cntlr() model_manager = ModelManager.initialize(ctrl) model_xbrl = model_manager.load(“~.xbrl”) ・・・処理・・・ model_manager.close() 初期化・インスタンス文書読込み 文書情報を解放
  36.  QName指定でfact取得 全企業共通の必須項目であれば、QName指定で取得すると楽。 タクソノミ要素リストというエクセルファイル(EDINETサイトからダウンロードできる)を見るとQnameが分かりやすい。 例: 会計基準のQName jpdei_cor:AccountingStandardsDEI タクソノミ要素リストより抜粋 ※EDINETタクソノミは毎年更新される XBRL解析(Arelle)

  37.  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)
  38.  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=で他の言語を指定可能。 (その言語の名称リンクが用意されていれば)
  39.  他にも便利機能 – 指定したディメンションが設定されているfactを一括取得 – 表示リンク、計算リンク、定義リンク関連 – 項目の階層構造やコンテキストを反映した一覧表を出力 など・・・ Arelleを利用したサンプルコード

    https://github.com/miya8/xbrl_parser  使う人が増えて情報も増えると嬉しい XBRL解析(Arelle)
  40. まとめ 以下を紹介しました。  XBRLの基本的な仕様とデータの読み方  XBRL解析に便利なArelleの基本的な使い方 ご清聴ありがとうございました。

  41. 補足 : 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 から引用
  42. 企業によって使用する勘定科目が異なる 例: 売上高を示す勘定科目 複数社の財務諸表をまとめて扱う場合、 QName指定では意図した通りにデータを取得できない(ケースがある) 補足 : 財務諸表の解析に関する注意 表示名称 QName

    企業A 売上高 jppfs_cor:NetSales 企業B 営業収益 jppfs_cor:OperatingRevenue1 ※ 勘定科目はQname指定で取得するには向いていない。どのようなデータを作りたいかに合わせて処理を検討する。