開発financial-dataメモ

EDINET DB APIで財務データを取得しIRBankスタイルの年次・四半期チャートを生成した

朝6時からJ-Quants APIの調査に始まり、EDINET DB APIでの財務データ取得、既存記事の数字との突合、IRBankスタイルのHTMLチャート生成まで一気に走り抜けた。途中、APIの研究開発費で円単位と千円単位が混在しているという地雷を踏んだ。最後は有報PDFをPythonで開いて、101ページ目の販管費内訳の数字を拾った。


J-Quants API: 無料プランの壁

最初にJ-Quants APIの無料プラン(Freeプラン)を調べた。結論から言うと、株価データが中心で、財務諸表(BS/PL/CF詳細)はプレミアムプラン限定だった。月額数万円を払う価値があるかと問われると、EDINET DB APIが無料で同等のデータを返してくれる以上、今の用途では不要。ここは5分で切り上げた。


会計ソフトA・Bの財務データ取得とTurso格納

前日(4/9)にTurso DBへの格納パイプラインを構築済みだったので、今日は会計ソフトB(E35325)のデータを追加取得してTursoに流し込む作業がメイン。会計ソフトA(E33390)は既にローカルJSONがあったので、会計ソフトBのEDINETコードをAPI検索で特定し、7エンドポイント分のデータを一括取得した。


既存記事との突合 -- 研究開発費の単位混在を発見

ブログ記事に書いた数字とAPIデータを並べたところ、会計ソフトBの研究開発費が桁違いにずれた

APIが返す rnd_expenses の値:

FY2023: 6,864,000
FY2024: 8,346,000

有報には「研究開発費は83億46百万円」と書いてある。APIの数字を円単位で読むと686万円。3桁足りない。

ここで手が止まった。同じレスポンス内の revenue(売上高)は円単位で正しい値が返ってきている。なのに rnd_expenses だけ千円単位になっている。OpenAPI仕様書にも単位の記載はない。同一レスポンス内で単位が混在しているという、APIとしてはかなり危険な状態だった。

Postmanでの生データ確認

この問題を目視で確認するため、Postmanを使ってAPIの生JSONを叩いた。VS CodeのREST Client拡張も選択肢に上がったが、GUIでヘッダーやパラメータを組み立てられるPostmanの方が今回は合っていた。

確認したエンドポイントは年次財務データの1本:

GET https://api.edinet-db.com/api/v1/companies/{edinet_code}/financials/annual

レスポンスを開くと、revenue: 19,219,994,000(192億円、円単位で正しい)の隣に rnd_expenses: 8,346,000(千円単位で83億円)が並んでいた。同じオブジェクト内で単位が違う。


IRBankスタイルのHTMLチャート生成

IRBankの年次推移テーブルは、数字の横にバーチャートが入っていて費用構造が一目でわかる。これを再現するPythonスクリプト generate_irbank_style.py を書いた。

売上高の共通スケール

最初は各指標ごとにバーの最大幅を決めていたが、設備投資額がバーを突き抜けた。全指標のバーを売上高の最大値でスケーリングすることで、費用が売上に対してどの程度かが視覚的にわかるようにした。

±両方向バー

営業利益が赤字の年度はバーが右に伸びてしまっていた。中央にゼロ線を引き、プラスなら右、マイナスなら左にバーを伸ばすように修正。年次サマリー、年次個別ブロック、四半期テーブルの全てで統一した。

広告宣伝費: APIにない項目の手動補完

EDINET DB APIのレスポンスに広告宣伝費のフィールドがない。IRBankのスクリーンショットから会計ソフトBの数字を読み取り、会計ソフトAもIRBankで確認して、Pythonスクリプト内にハードコードした。最初は記事の概算値「~80億」を入れてしまったが、実際は69.3億で1割以上ずれていた。二次ソースの概算値は使うべきではない、という教訓。


四半期データの追加

年次データに加えて四半期データもチャートに追加した。

累計→単独値変換

APIの四半期データは累計値で返ってくる(2Q = 1Q+2Q の合計)。各Qの単独値を得るために前Qの累計値を差し引く変換処理を入れた。Q4は年次データから3Q累計を引いて算出。

期末月ラベル

年度ラベルが 20192020 のように年だけだと、会計ソフトB(6月期)と会計ソフトA(11月期)の区別がつかない。ラベルを 2019/62019/11 のように期末月付きに変更した。

四半期データの収録範囲

APIの四半期データは最新分が未登録のケースがあった。会計ソフトBのFY2025四半期データはAPIに入っておらず、年次データのみ利用可能。Q4は年次 - Q3累計から自動算出して補完した。


研究開発費→ソフトウェア資産計上の付け替え分析

会計ソフトBのFY2024→FY2025で研究開発費が約35億円減少していた。人件費の削減にしては急すぎる。数字を並べると答えが見えた:

  • 研究開発費: 約35億円減
  • 設備投資額(ソフトウェア): 約25億円増

研究開発費をソフトウェア資産に付け替えた。PLの費用がBSの無形固定資産に移動しただけで、実質的な開発投資額は変わっていない。会計ソフトAも同様にソフトウェア資産計上を行っているが、もともと研究開発費の絶対額が小さいので影響は限定的。


有報PDF解析: 販管費の内訳確認

会計ソフトAの広告宣伝費の中身を調べるため、有報PDFをPythonで解析した。テキストブロックAPIでは要約版しか返ってこず、広告宣伝費の内訳は取れなかった。

PDFをPythonの pdfplumber で開いて101ページに販管費の主な費目の注記を発見。文字化けはあったが数字は読めた。広告宣伝費は「対売上高比率で抑制する方針」という経営方針の記載も確認できた。


学びメモ

  • APIの単位は信用するな: 同一レスポンス内で円と千円が混在するケースがある。Postmanで生データを目視確認する習慣をつける
  • 二次ソースの概算値をハードコードしない: IRBankの正確な数字を使う。「~80億」と「69.3億」は1割以上違う
  • 研究開発費の増減はBSと突合する: PLだけ見ると「開発投資を減らした」に見えるが、ソフトウェア資産計上への付け替えだった
  • 有報PDFはPythonで読める: テキストブロックAPIで取れない販管費内訳も、PDF解析で101ページ目を直接開けば数字が拾える