EDINETからダウンロードしたXBRLから有価証券報告書の情報を抜き出す

2023-09-15-03-51-05.webp
目次

はじめに

IHIという会社の株で20万円を失いました。 製品の不具合については、開発状況やプロジェクトの規模や期間から予想する手法もあるようですが外部から読み取ることは非常に難しいものです。

こうした外れ値は仕方がないのですが、企業価値を判断し投資していきたいと考えています。

前回の記事で、EDINETから大量のXBRLが入ったZIPファイルの取得ができました。

今回はその前回の記事を元にダウンロードしたXBRLの解析を進めていきます。

EDINET タクソノミの概要説明

この資料が詳しそうなので、内容を参考にしつつ実装していきます。

まずは1つ、情報を抜き出して見るところからやっていきたいですね。

XBRLとは

XBRLとは、”各種財務報告用の情報を作成、流通及び利用できるように標準化されたXMLベースの言語「eXtensible Business Reporting Language」の略”とのことです。

このXBRLにはタクソノミとインスタンスという概念が存在します。

ある要素には、日本語名称と英語名称が存在します。その要素と紐づいた日本語・英語名称をタクソノミとして定義されているようです。 インスタンスでは、その要素の数値と、期間(いつのデータ)、通貨単位などをまとめて定義されています。

手法

まずは財務状況が良さそうな株のスクリーニングを行うことを目的に進めていきます。

前回作成したコードに手を加え、過去5年分の有価証券報告書を取得します。 ZIPファイルがダウンロードできるため、解凍し中にあるXBRLを抜き出します。 今回の解析には使用しないデータも多量に含まれるため、各社で共通的な項目をピックアップして抜き出してみます。

抜き出す主な要素

一般的な損益計算書(収益計算書)、貸借対照表、純資産額計算書、損益及び剰余金計算書の主要なセクションと共通的な要素を抜き出して見ました。

財務は明るくないため、誤りがあればTwitterまで一報お願い致します。

損益計算書(収益計算書)

収益(売上高、売上収益、その他の収益) 総売上原価(費用、原材料費、労働費など) 総利益(総利益率) 営業費用(販売費用、一般管理費用など) 営業利益(営業利益率) 金利費用 税引前利益 法人税およびその他の税金 当期純利益(当期利益率)

貸借対照表

資産部門(流動資産、固定資産など) 負債部門(流動負債、固定負債など) 純資産部門(株主資本、利益剰余金など) 資産合計 負債合計 資産合計と負債合計の差(純資産額)

純資産額計算書

初期純資産額 当期純利益または純損失 分配金(配当など) 最終的な純資産額

損益及び剰余金計算書

過去の純資産額 当期純利益または純損失 分配金 最終的な純資産額

XBRLの解析

まずは一件の有価証券報告書のデータ抜き出しをやっていきましょう。 arellというライブラリがあるようなのでまずはこれで試してみましょう。

適当に取ってきたZIPファイルの名称はこのようにしておきます

'S100FFK6_有価証券報告書_株式会社 クボタ.zip'
pip install arelle-release
import os
import re
import zipfile
from arelle import Cntlr, ModelManager

def remove_html_tags(text):
    """HTMLタグを除去する関数"""
    clean = re.compile('<.*?>')
    return re.sub(clean, '', text)

def main():
    # ZIPファイルのパス
    zip_file_path = 'S100FFK6_有価証券報告書_株式会社 クボタ.zip'

    # 一時フォルダを作成
    temp_dir = 'temp'
    os.makedirs(temp_dir, exist_ok=True)

    # ZIPファイルを一時フォルダに展開
    with zipfile.ZipFile(zip_file_path, 'r') as zip_file:
        zip_file.extractall(temp_dir)

    # 展開したXBRLファイルのパスを取得
    xbrl_file_path = None
    for root, dirs, files in os.walk(temp_dir):
        if "Public" in root:  # Publicフォルダ内のみを対象とする
            for file in files:
                if file.endswith('.xbrl'):
                    xbrl_file_path = os.path.join(root, file)
                    break
            if xbrl_file_path:
                break

    if xbrl_file_path:
        # Arelleのコントローラーを作成
        controller = Cntlr.Cntlr()

        # モデルマネージャーを初期化
        model_manager = ModelManager.initialize(controller)

        # XBRLファイルを読み込む
        xbrl_instance = model_manager.load(xbrl_file_path)

        # すべてのコンセプトを取得
        all_concepts = xbrl_instance.qnameConcepts

        for qname, concept in all_concepts.items():
            # コンセプトの値を取得
            facts = xbrl_instance.factsByQname[qname]
            for fact in facts:
                value = remove_html_tags(fact.value)  # 修正
                split_name = str(qname).split("}")
                concept_name = split_name[1] if len(split_name) > 1 else split_name[0]  # XMLタグを取り除く
                print(f"{concept_name}: {value}")

        # コントローラーを終了
        controller.close()
    else:
        print("XBRLファイルがZIP内に見つかりませんでした。")

if __name__ == "__main__":
    main()

結果

タグ情報と抜き出した情報の一覧が得られるはずです。

jppfs_cor:CashAndDeposits: 103269000000
jppfs_cor:CashAndDeposits: 97235000000
jppfs_cor:NotesReceivableTrade: 2418000000
jppfs_cor:NotesReceivableTrade: 4083000000
jppfs_cor:AccountsReceivableTrade: 309434000000
jppfs_cor:AccountsReceivableTrade: 303689000000
jppfs_cor:ShortTermInvestmentSecurities: 20000000000
jppfs_cor:ShortTermInvestmentSecurities: 20000000000
jppfs_cor:FinishedGoods: 41892000000
jppfs_cor:FinishedGoods: 48040000000
jppfs_cor:WorkInProcess: 25804000000
jppfs_cor:WorkInProcess: 20682000000
jppfs_cor:DeferredTaxAssetsCA: 9000000000
jppfs_cor:DeferredTaxAssetsCA: 9919000000
jppfs_cor:OtherCA: 74793000000
jppfs_cor:OtherCA: 71145000000
jppfs_cor:AllowanceForDoubtfulAccountsCA: -40000000
jppfs_cor:AllowanceForDoubtfulAccountsCA: -40000000
jppfs_cor:CurrentAssets: 630087000000
jppfs_cor:CurrentAssets: 621035000000
jppfs_cor:BuildingsNet: 45390000000
jppfs_cor:BuildingsNet: 38089000000
jppfs_cor:MachineryAndEquipmentNet: 33635000000
jppfs_cor:MachineryAndEquipmentNet: 29642000000
jppfs_cor:Land: 53576000000
jppfs_cor:Land: 54333000000
jppfs_cor:ConstructionInProgress: 6628000000
jppfs_cor:ConstructionInProgress: 3926000000
jppfs_cor:OtherNetPPE: 12879000000
jppfs_cor:OtherNetPPE: 10326000000
jppfs_cor:PropertyPlantAndEquipment: 136318000000
jppfs_cor:PropertyPlantAndEquipment: 152108000000
jppfs_cor:Software: 10849000000
jppfs_cor:Software: 8068000000
jppfs_cor:OtherIA: 720000000
jppfs_cor:OtherIA: 798000000
jppfs_cor:IntangibleAssets: 11569000000
jppfs_cor:IntangibleAssets: 8866000000
jppfs_cor:InvestmentSecurities: 108318000000
jppfs_cor:InvestmentSecurities: 141884000000
jppfs_cor:StocksOfSubsidiariesAndAffiliates: 171036000000
jppfs_cor:StocksOfSubsidiariesAndAffiliates: 180760000000
jppfs_cor:LongTermLoansReceivable: 40091000000
jppfs_cor:LongTermLoansReceivable: 51706000000
jppfs_cor:OtherIOA: 28935000000
jppfs_cor:OtherIOA: 27869000000
jppfs_cor:AllowanceForDoubtfulAccountsIOAByGroup: -245000000
jppfs_cor:AllowanceForDoubtfulAccountsIOAByGroup: -248000000
jppfs_cor:InvestmentsAndOtherAssets: 406279000000
jppfs_cor:InvestmentsAndOtherAssets: 395571000000
jppfs_cor:NoncurrentAssets: 551464000000
jppfs_cor:NoncurrentAssets: 559250000000
jppfs_cor:Assets: 1180286000000
jppfs_cor:Assets: 1181552000000
jppfs_cor:NotesPayableTrade: 764000000
jppfs_cor:NotesPayableTrade: 735000000
jppfs_cor:AccountsPayableTrade: 69894000000
jppfs_cor:AccountsPayableTrade: 59450000000
jppfs_cor:AccountsPayableOther: 12895000000
jppfs_cor:AccountsPayableOther: 9264000000
jppfs_cor:AccruedExpenses: 22805000000
jppfs_cor:AccruedExpenses: 25313000000
jppfs_cor:IncomeTaxesPayable: 1023000000
jppfs_cor:IncomeTaxesPayable: 27671000000
jppfs_cor:DepositsReceived: 125127000000
jppfs_cor:DepositsReceived: 122871000000
jppfs_cor:ProvisionForProductWarranties: 7693000000
jppfs_cor:ProvisionForProductWarranties: 6967000000
jppfs_cor:ProvisionForBonuses: 8135000000
jppfs_cor:ProvisionForBonuses: 8450000000
jppfs_cor:ProvisionForDirectorsBonuses: 232000000
jppfs_cor:ProvisionForDirectorsBonuses: 210000000
jppfs_cor:OtherCL: 19333000000
jppfs_cor:OtherCL: 10770000000
jppfs_cor:CurrentLiabilities: 421523000000
jppfs_cor:CurrentLiabilities: 422653000000
jppfs_cor:BondsPayable: 20000000000
jppfs_cor:BondsPayable: 20000000000
jppfs_cor:LongTermLoansPayable: 90000000000
jppfs_cor:LongTermLoansPayable: 90000000000
jppfs_cor:DeferredTaxLiabilitiesNCL: 20948000000
jppfs_cor:DeferredTaxLiabilitiesNCL: 28729000000
jppfs_cor:OtherNCL: 1096000000
jppfs_cor:OtherNCL: 1112000000
jppfs_cor:NoncurrentLiabilities: 132045000000
jppfs_cor:NoncurrentLiabilities: 139842000000
jppfs_cor:Liabilities: 562496000000
jppfs_cor:Liabilities: 553569000000
jppfs_cor:LiabilitiesAndNetAssets: 1180286000000
jppfs_cor:LiabilitiesAndNetAssets: 1181552000000
jppfs_cor:NetSales: 885385000000
jppfs_cor:NetSales: 844115000000
jppfs_cor:CostOfSales: 650202000000
jppfs_cor:CostOfSales: 717224000000
jppfs_cor:GrossProfit: 168161000000
jppfs_cor:GrossProfit: 193912000000
jppfs_cor:DepreciationSGA: 1662000000
jppfs_cor:DepreciationSGA: 818000000
jppfs_cor:ProvisionForBonusesSGA: 3209000000
jppfs_cor:ProvisionForBonusesSGA: 3128000000
jppfs_cor:SellingGeneralAndAdministrativeExpenses: 111751000000
jppfs_cor:SellingGeneralAndAdministrativeExpenses: 119719000000
jppfs_cor:OperatingIncome: 82161000000
jppfs_cor:OperatingIncome: 48442000000
jppfs_cor:NonOperatingIncome: 49520000000
jppfs_cor:NonOperatingIncome: 54157000000
jppfs_cor:InterestExpensesNOE: 375000000
jppfs_cor:InterestExpensesNOE: 546000000
jppfs_cor:NonOperatingExpenses: 4279000000
jppfs_cor:NonOperatingExpenses: 11897000000
jppfs_cor:OrdinaryIncome: 90702000000
jppfs_cor:OrdinaryIncome: 127401000000
jppfs_cor:IncomeBeforeIncomeTaxes: 127401000000
jppfs_cor:IncomeBeforeIncomeTaxes: 90702000000
jppfs_cor:IncomeTaxesCurrent: 15320000000
jppfs_cor:IncomeTaxesCurrent: 34997000000
jppfs_cor:IncomeTaxesDeferred: 1491000000
jppfs_cor:IncomeTaxesDeferred: -3027000000
jppfs_cor:ProfitLoss: 95431000000
jppfs_cor:ProfitLoss: 95431000000
jppfs_cor:ProfitLoss: 73890000000
jppfs_cor:ProfitLoss: 95431000000
jppfs_cor:ProfitLoss: 73890000000
jppfs_cor:ProfitLoss: 73890000000
jppfs_cor:ProfitLoss: 95431000000
jppfs_cor:ProfitLoss: 73890000000
jppfs_cor:ProfitLoss: 73890000000
jppfs_cor:ProfitLoss: 95431000000
jppfs_cor:IncomeTaxes: 31969000000
jppfs_cor:IncomeTaxes: 16812000000
jppfs_cor:PrepaidPensionCostIOA: 25645000000
jppfs_cor:PrepaidPensionCostIOA: 26096000000
jppfs_cor:RawMaterialsAndSupplies: 8365000000
jppfs_cor:RawMaterialsAndSupplies: 9965000000
jppfs_cor:CurrentPortionOfBonds:
jppfs_cor:CurrentPortionOfBonds: 20000000000
jppfs_cor:ReserveForSpecialDepreciation: 7000000
jppfs_cor:ReserveForSpecialDepreciation: 12000000
jppfs_cor:ReserveForReductionEntryOfLand: 171000000
jppfs_cor:ReserveForReductionEntryOfLand: 171000000
jppfs_cor:GeneralReserve: 321642000000
jppfs_cor:GeneralReserve: 280042000000
jppfs_cor:OtherSGA: 53877000000
jppfs_cor:OtherSGA: 52940000000
jppfs_cor:ProvisionForProductWarrantiesSGA: 6661000000
jppfs_cor:ProvisionForProductWarrantiesSGA: 6321000000
jppfs_cor:OtherNOI: 16903000000
jppfs_cor:OtherNOI: 13633000000
jppfs_cor:InterestAndDividendsIncomeNOI: 17004000000
jppfs_cor:InterestAndDividendsIncomeNOI: 20436000000
jppfs_cor:RoyaltyIncomeNOI: 20087000000
jppfs_cor:RoyaltyIncomeNOI: 15612000000
jppfs_cor:OtherNOE: 3733000000
jppfs_cor:OtherNOE: 11521000000
jppfs_cor:ProvisionForRetirementBenefitsSGA: 1764000000
jppfs_cor:ProvisionForRetirementBenefitsSGA: 2110000000
jppfs_cor:DividendsFromSurplus: -38421000000
jppfs_cor:DividendsFromSurplus: -38421000000
jppfs_cor:DividendsFromSurplus: -38421000000
jppfs_cor:DividendsFromSurplus: -38421000000
jppfs_cor:DividendsFromSurplus: -40697000000
jppfs_cor:DividendsFromSurplus: -40697000000
jppfs_cor:DividendsFromSurplus: -40697000000
jppfs_cor:DividendsFromSurplus: -40697000000
jppfs_cor:PurchaseOfTreasuryStock: -3003000000
jppfs_cor:PurchaseOfTreasuryStock: -13197000000
jppfs_cor:PurchaseOfTreasuryStock: -3003000000
jppfs_cor:PurchaseOfTreasuryStock: -13197000000
jppfs_cor:PurchaseOfTreasuryStock: -3003000000
jppfs_cor:PurchaseOfTreasuryStock: -13197000000
jppfs_cor:DisposalOfTreasuryStock: 0
jppfs_cor:DisposalOfTreasuryStock: 0
jppfs_cor:DisposalOfTreasuryStock: -0
jppfs_cor:DisposalOfTreasuryStock: 0
jppfs_cor:DisposalOfTreasuryStock: 0
jppfs_cor:DisposalOfTreasuryStock: -0
jppfs_cor:DisposalOfTreasuryStock: 0
jppfs_cor:DisposalOfTreasuryStock: 0
jppfs_cor:DisposalOfTreasuryStock: 0
jppfs_cor:DisposalOfTreasuryStock: 0
jppfs_cor:RetirementOfTreasuryStock: -2854000000
jppfs_cor:RetirementOfTreasuryStock:
jppfs_cor:RetirementOfTreasuryStock: -13190000000
jppfs_cor:RetirementOfTreasuryStock:

途中かなり端折ってますがこんな形で取得できました。 XBRLのタグと名称の紐づけについてはEXCELで提供されていますので、そちらに対応していけばよいかと思います。

まとめ

データの抜き出しができるようになりました。 このデータを過去すべての記録に適用できるようにしていきましょう。 また、各データを企業同士で比較できるように、データの紐づけの必要がありそうです。 いい方法考えます。

各パラメータの紐づけができれば情報として扱いやすくなるはずです。 そこからは楽しい楽しい解析の時間が始まります。もうひと踏ん張りやっていきましょう。

Related Post

> EDINETからダウンロードしたXBRLから有価証券報告書の情報を抜き出す
EDINET API v2に登録して株式関連書類をGETしよう
> EDINETからダウンロードしたXBRLから有価証券報告書の情報を抜き出す
EDINET APIを用いて企業情報を取得するPythonコードを書いた。
> EDINETからダウンロードしたXBRLから有価証券報告書の情報を抜き出す
Amazonアフェリエイトリンク生成に必要な、ASINコードと商品名をURLから取得する
> EDINETからダウンロードしたXBRLから有価証券報告書の情報を抜き出す
ブログのタグを調整するためのツール書いた
> EDINETからダウンロードしたXBRLから有価証券報告書の情報を抜き出す
OpenAiのGPT-3を使って自動生成ブログを作ってみたい
> EDINETからダウンロードしたXBRLから有価証券報告書の情報を抜き出す
termextractを使って記事で使われている専門用語の自動抽出を試してみよう

おすすめの商品

>