Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PyConJP2020_5_0828_1450
Search
miya8
August 27, 2020
Programming
5.2k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PyConJP2020_5_0828_1450
miya8
August 27, 2020
Other Decks in Programming
See All in Programming
えっ!!コードを読まずに開発を!?
hananouchi
0
210
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
フィードバックで育てるAI開発
kotaminato
1
120
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
370
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
100
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
2
1.5k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
250
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
170
自作OSでスライド発表する
uyuki234
1
3.8k
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
6.2k
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.6k
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
Featured
See All Featured
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
370
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
290
Evolving SEO for Evolving Search Engines
ryanjones
0
240
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Why Our Code Smells
bkeepers
PRO
340
58k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
650
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.7k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.6k
Writing Fast Ruby
sferik
630
63k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
Transcript
PythonでXBRL形式の 財務情報を扱おう PyCon JP 2020 2020/8/28 Miyasaka Eriko
自己紹介 宮坂 絵里子 (みやさか えりこ) • 株式会社リーディング・エッジ社 所属 • Python歴
2年 • 元経理
対象 XBRLビギナーの方 – 有価証券報告書(有報)の財務情報などを収集したい方が主な対象 話すこと XBRL解析するための基本知識、ラクに解析するための情報
目次 1. XBRLの基本 2. EDINETの有報XBRLを見てみよう 3. Arelle の紹介 4. PythonでXBRL形式の有報を扱ってみよう
目次 1. XBRLの基本 2. EDINETの有報XBRLを見てみよう 3. Arelle の紹介 4. PythonでXBRL形式の有報を扱ってみよう
XBRL (eXtensible Business Reporting Language) 事業報告用の情報の再利用などを便利にするグローバルな規格 XMLベース
XBRL データ構造(概要) インスタンス文書 (報告値) タクソノミ文書 (構造定義) タクソノミスキーマ (項目定義) 表示リンク 計算リンク
定義リンク 名称リンク 参照リンク ディメンションリンク 他… XBRL2.1標準 拡張 リンクベース
・・・ 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 と呼ぶ
・・・ 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 ・・・
他… XBRL タクソノミ文書 - リンクベース 項目間の関係や、項目に対する追加情報などの定義 XBRL2.1 標準のリンク5種 +
拡張リンク 表示リンク [損益計算書] - 売上(1) - 売上原価(2) - 売上総利益(3) - ・・・ - 営業外収益(6) -- 受取利息(1) -- 雑収入(2) -- ・・・ - ・・・ 計算リンク [損益計算書] ・・・ { 1*売上総利益 = 1*売上 + (-1)*売上原価 ) } ・・・ 定義リンク 項目間の様々な関係 名称リンク 項目の表示名称 参照リンク 参考文献(会計概念定 義の根拠文献) ディメンションリンク 項目間の多次元データ構造 - 連結 / 個別 - セグメント - … 拡張 XBRL2.1標準
目次 1. XBRLの基本 2. EDINETの有報XBRLを見てみよう 3. Arelle の紹介 4. PythonでXBRL形式の有報を扱ってみよう
EDINET (Electronic Disclosure for Investors' NETwork) 金融庁の 「金融商品取引法に基づく有価証券報告書等の開示書類に関する電子開示システム」 EDINET閲覧サイトで開示書類を閲覧可能
– 有価証券報告書は5年 – 四半期報告書は3年 – ・・・ 段階的にXBRLが導入されてきた – 有報、四半期報告書は全文XBRL化されている EDINET 概要書から引用
EDINETタクソノミ – 金融庁が提供するタクソノミ (毎年更新、種類は複数) 提出者別タクソノミ – 提出者がEDINETタクソノミをベースに 作成するタクソノミ
– 必要に応じて独自定義を追加 EDINETのタクソノミ文書 提出者別タクソノミ作成ガイドラインから引用 提出者ごとにタクソノミが異なる
EDINETの有報XBRLを見てみよう とりあえず手動で、XBRL形式の有価証券報告書を1つダウンロード 1. EDINET書類詳細検索画面 にアクセス 2. 「書類種別を指定する 」で有価証券報告書を指定して検索 3. 検索結果の「XBRL」のアイコン押下
→ZIPファイルがダウンロードされる EDINET書類閲覧操作ガイド から引用
EDINETの有報XBRLを見てみよう ZIPファイル展開例 インスタンス文書+ 提出者別タクソノミ Ccc ・・・ファイル構成定義 インラインXBRL インスタンスの値と表示情報が一緒になったもの。 提出者がインラインXBRLを提出すると EDINETでインラインXBRLから.xbrl
が作成される ※ *_gla.xml(ジェネリックラベルリンク)が存在するケースもあり得る
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
タクソノミスキーマ(~.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 – タクソノミスキーマの読み方 -
リンクベース:計算リンク(~_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 – リンクベースの読み方① -
リンクベース:名称リンク(~_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 – リンクベースの読み方② -
XBRLデータの読み方がだんだん分かってきた 解析してみようかな
NetSales は「売上高」と表示する、という情報をプログラムで取得するには・・・ • ダウンロードしたzipファイル内~.xsd を開き、参照しているEDINETタクソノミの(複数あるが該当の)名称リンクのURLを取得 • URL(名称リンクのファイル)にアクセス • この名称リンクファイル内で、対象の項目を示すlocater型の要素を探す •
見つけた要素のxlink:labelの値を取得 • 取得した値を from とする arc型の要素を探す • 見つけたarc型の要素のtoの値を取得 • ・・・ 続く ・・・ とにかく定義たどる・・・ 面倒だなぁ
目次 1. XBRLの基本 2. EDINETの有報XBRLを見てみよう 3. Arelle の紹介 4. PythonでXBRL形式の有報を扱ってみよう
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
ArelleでXBRL解析する メリット らく – XBRLの仕様に沿って解析してくれる • インスタンス文書を読み込むとその参照先のタクソノミも解析してくれる → 定義を辿るような煩雑な処理を自分で書く必要がない
• XBRLの仕様をすべて把握することは困難だが、Arelleを使うことによりある程度のXBRL知識でも解析できる → データ収集にかける労力を減らし、目的である財務分析に時間を使うことができる 無償
ArelleでXBRL解析する デメリット 取得したい情報によっては、無駄に重い処理となる場合がある – 複雑な解析不要なケースでは、自分でプログラムを書いた方が良い (項目名を指定して報告値を取得するだけで済むケースなど) (今のところ)情報が少ない
目次 1. XBRLの基本 2. EDINETの有報XBRLを見てみよう 3. Arelle の紹介 4. PythonでXBRL形式の有報を扱ってみよう
PythonでXBRL形式の有報を扱ってみよう 流れ 1. 有報を取得(EDINET API) 2. XBRL解析(Arelle)
有報を取得(EDINET API) EDINETが提供するAPI EDINET API のドキュメント – https://disclosure.edinet-fsa.go.jp/EKW0EZ0015.html
> 「EDINET API関連資料」 2種類のAPIがある – 書類一覧API : 書類を把握するためのAPI – 書類取得API : 書類を取得するためのAPI
エンドポイント HTTPメソッド: GET リクエストパラメータ – date (必須)
: YYYY-MM-DD形式のファイル日付 提出処理が行われた日、書類情報修正日、開示不開示区分の変更日 – type (任意) : 1(デフォルト)・・・メタデータのみ 2・・・提出書類一覧及びメタデータ https://disclosure.edinet-fsa.go.jp/api/{バージョン}/documents.json 有報を取得(EDINET API) - 書類一覧 -
提出書類一覧及びメタデータの取得例 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) - 書類一覧 -
提出書類一覧及びメタデータの取得結果例 { "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) - 書類一覧 -
エンドポイント HTTPメソッド: GET リクエストパラメータ – type (必須)
: 1~4 (XBRLを取得するには1を指定) https://disclosure.edinet-fsa.go.jp/api/{バージョン}/documents/{書類管理番号} 有報を取得(EDINET API) - 書類取得 -
取得例 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) - 書類取得 -
ZIPファイル展開例 (再掲) 有報を取得(EDINET API) - 書類取得 - インスタンス文書+ 提出者別タクソノミ ・・・ファイル構成定義
インラインXBRL インスタンスの値と表示情報が一緒になったもの。 提出者がインラインXBRLを提出すると EDINETでインラインXBRLから.xbrl が作成される ※ *_gla.xml(ジェネリックラベルリンク)が存在するケースもあり得る ここだけ抽出すればOK
XBRL解析(Arelle) 基本 from arelle import Cntlr, ModelManager ctrl =
Cntlr.Cntlr() model_manager = ModelManager.initialize(ctrl) model_xbrl = model_manager.load(“~.xbrl”) ・・・処理・・・ model_manager.close() 初期化・インスタンス文書読込み 文書情報を解放
QName指定でfact取得 全企業共通の必須項目であれば、QName指定で取得すると楽。 タクソノミ要素リストというエクセルファイル(EDINETサイトからダウンロードできる)を見るとQnameが分かりやすい。 例: 会計基準のQName jpdei_cor:AccountingStandardsDEI タクソノミ要素リストより抜粋 ※EDINETタクソノミは毎年更新される XBRL解析(Arelle)
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)
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=で他の言語を指定可能。 (その言語の名称リンクが用意されていれば)
他にも便利機能 – 指定したディメンションが設定されているfactを一括取得 – 表示リンク、計算リンク、定義リンク関連 – 項目の階層構造やコンテキストを反映した一覧表を出力 など・・・ Arelleを利用したサンプルコード
https://github.com/miya8/xbrl_parser 使う人が増えて情報も増えると嬉しい XBRL解析(Arelle)
まとめ 以下を紹介しました。 XBRLの基本的な仕様とデータの読み方 XBRL解析に便利なArelleの基本的な使い方 ご清聴ありがとうございました。
補足 : 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 から引用
企業によって使用する勘定科目が異なる 例: 売上高を示す勘定科目 複数社の財務諸表をまとめて扱う場合、 QName指定では意図した通りにデータを取得できない(ケースがある) 補足 : 財務諸表の解析に関する注意 表示名称 QName
企業A 売上高 jppfs_cor:NetSales 企業B 営業収益 jppfs_cor:OperatingRevenue1 ※ 勘定科目はQname指定で取得するには向いていない。どのようなデータを作りたいかに合わせて処理を検討する。