この連載の読む順番
TDnet①〜④で、書類の役割からXBRLの解析・グラフ化までを順に扱います。その後、EDINET①〜④へ進みます。共通の基本操作はTDnet編を参照し、EDINET編では違いを確認します。
- TDnet解析① TDnetとは?決算短信・適時開示とEDINETの違い
- TDnet解析② XBRLとは?決算短信のPDFと数値データを図解
- TDnet解析③ XBRLの値を比較する前に、期間・単位・欠損を確かめる
- TDnet解析④ 累計と四半期単独、実績と予想を分けてグラフにする(この記事)
- EDINET解析① EDINETとは?有価証券報告書から企業を理解する
- EDINET解析② XBRLとは?有価証券報告書の構造とタグの仕組みを理解する
- EDINET解析③ TDnetの次に読むXBRL――ファイル・タグ・コンテキストの違いを確かめる
- EDINET解析④ 財務データを継続的な分析に使う
TDnet解析③では、公式サンプルの一つの数値について、期間・単位・範囲を確かめました。今回は、その確認を済ませた値から比較表やグラフを作るところまで進みます。
新しく学ぶのは、取得した数値と、計算して作った数値を区別することです。四半期単独の値を求める計算、予想の表示、訂正を受け取った場合の確認を順に扱います。Pythonの準備やXBRLの参照先の読み方はTDnet③を参照し、ここでは繰り返しません。
以下の会社・金額・日付・識別子は、全て説明用の架空例です。JPX公式サンプルやZENITH Codeの実データではありません。公式サンプルは構造を確かめる教材として使いましたが、JPXも数値の整合性を意識したサンプルではないと説明しています。そのため、今回は計算を追えるよう整合した架空データを用意します。JPX「XBRLデータの仕様」
1. グラフを描く前に、何を比べるか決める
架空の青葉製作所について、「今年度は3か月ごとにどれだけ売れたか」を調べるとします。先に、次の条件を固定します。
| 条件 | この例で使うもの |
|---|---|
| 会社・項目 | 青葉製作所の売上高 |
| 対象範囲 | 連結 |
| 会計基準・集計の前提 | 比較する期間で同じと仮定 |
| 実績・予想 | 四半期ごとの比較には実績だけを使う |
| 保存する単位 | 円 |
| 表示する単位 | 億円 |
| 比較する期間 | 2025年4月から2026年3月までの各3か月 |
「同じ会社で同じ売上高だから引き算できる」とは限りません。連結範囲や会計上の扱いが変わった場合、単純差分で比較できるかを注記まで確認します。ここでは、その確認を済ませた単純な例に限定します。
2. 6か月の累計は、後半3か月の値ではない
次の実績が手元にあるとします。
| 呼び方 | 開始日 | 終了日 | 売上高(億円) |
|---|---|---|---|
| 第1四半期累計 | 2025-04-01 | 2025-06-30 | 20 |
| 第2四半期累計 | 2025-04-01 | 2025-09-30 | 45 |
| 第3四半期累計 | 2025-04-01 | 2025-12-31 | 72 |
3行とも開始日が4月1日です。45億円は7〜9月だけの売上高ではなく、4〜9月の6か月分です。期間は「Q2」というラベルだけで判断せず、コンテキストの開始日・終了日から確かめます。報告書の呼び方が違っても、実際の対象期間で判断する考え方は同じです。
後半の3か月を求めるには、同じ条件で集計された前半3か月を引きます。
7〜9月の売上高 = 4〜9月の累計 − 4〜6月の累計
= 45億円 − 20億円
= 25億円
図:期間を分けるための独自図解です。横幅は期間を表し、金額の大小を表す棒グラフではありません。単位・範囲などが一致する架空例です。
| 表示したい期間 | 計算 | 四半期単独の売上高(億円) | 値の由来 |
|---|---|---|---|
| 4〜6月 | 20 | 20 | 元の累計と対象期間が同じ |
| 7〜9月 | 45 − 20 | 25 | 累計差分で算出 |
| 10〜12月 | 72 − 45 | 27 | 累計差分で算出 |
| 翌年1〜3月 | 通期実績がまだない | 未確認 | 算出しない |
差分の25億円を、元書類に直接書かれていた数値のように保存しないことが大切です。「どの二つの値から作ったか」を残せば、計算結果を後から確かめられます。
引き算してよい項目かも確認する
この例は、期間について足し合わせられる売上高を対象にしています。同じ操作を全ての指標へ適用することはできません。
| 項目の例 | この累計差分の方法をそのまま使うか |
|---|---|
| 同じ集計条件の期間売上高 | 対象期間・範囲・訂正などを確認したうえで使う |
| 期末の総資産・現金残高 | 使わない。時点の残高差は、3か月分の売上のような期間合計ではない |
| 利益率などの比率 | 使わない。比率同士の差は、その期間の比率を表さない |
| 1株当たり利益 | 単純差分を一般化しない。計算の分母や算定方法の確認が必要 |
今回のコードも、期間売上高の限定例です。項目を入力したら何でも四半期単独へ変換する処理にはしません。
3. 通期予想から引いた値を「第4四半期実績」にしない
ここで、会社が当年度の通期売上高を110億円と予想していたとします。第3四半期累計の実績72億円を引くと38億円になります。
通期予想110億円 − 第3四半期累計実績72億円 = 38億円
計算はできますが、38億円はまだ公表されていない第4四半期の実績ではありません。両者の対象範囲や予想の時点が揃っているなら、「通期予想と9か月実績との差」として扱える値です。企業が第4四半期単独の予想を直接発表したとも限りません。
実績グラフに38億円の棒を追加してしまうと、読者は4四半期とも実績が揃ったと受け取ってしまいます。この例では第4四半期実績は空欄にし、通期予想は別の表へ分けます。
| 通期の比較 | 金額(億円) | 区分 |
|---|---|---|
| 前年度の1年間 | 100 | 実績 |
| 当年度の1年間 | 110 | 会社予想 |
この表から説明できるのは、「会社が前年度実績を10%上回る通期売上高を予想している」ということです。「当年度の売上高が10%増えた」と、確定済みの結果のようには書きません。
図にする場合も、実績と予想はラベル・塗り・線種を変えて区別します。色だけで区別すると、白黒表示や色の見分け方によって伝わりにくくなります。
4. 訂正を受け取ったら、差分の計算に使った値も見直す
累計差分は、二つの入力に依存します。例えば第1四半期累計が20億円から21億円へ訂正され、第2四半期累計45億円は同じ比較条件で有効だと確認できた場合、7〜9月の計算結果は25億円から24億円へ変わります。
| 入力・結果 | 当初の計算 | 訂正を反映した計算 |
|---|---|---|
| 4〜6月累計 | 20億円 | 21億円 |
| 4〜9月累計 | 45億円 | 45億円 |
| 差分で求める7〜9月 | 25億円 | 24億円 |
ただし、訂正という文字を見つけたら必ず数値が変わる、という意味ではありません。TDnet①で紹介した開示情報の履歴・状態の変更と、書類の中の財務数値を直す訂正開示は、混同しないようにします。タイトルだけで旧データを削除せず、何が変更されたかを実際の情報・資料で確認します。
書類の識別や履歴項目の読み方はTDnet解析①にまとめています。ここで追加するのは、「元の値を差し替えると、それを使った計算結果にも影響する」という視点です。
| 確認するもの | 理由 |
|---|---|
| 元書類の識別子と状態 | 同じ期間の別書類を、訂正対象と取り違えないため |
| 訂正箇所と比較の前提 | 変更が数値・単位・範囲・注記のどこかを確かめるため |
| 公表日時と取得日時 | 会社が公表した時刻と、自分が取得した時刻を分けるため |
| 計算に使った入力の組 | 影響する表・グラフを再計算するため |
最新の訂正を反映したグラフと、ある過去時点で知り得た情報だけを使う分析では、採用する情報が異なる場合があります。どちらを作るかを先に決め、後日の訂正値を過去に分かっていた値として使わないようにします。一般的な訂正の自動統合や採用優先順位の実装は、この入門記事の対象外です。
5. 小さなPythonで、累計から単独期間を求める
XBRLの読取りはTDnet③で扱ったため、今回は確認済みの値を入力するところから始めます。下の入力は説明用の独自形式で、XBRLの構文やZENITH CodeのAPI応答ではありません。
この練習では、入力3件が同じ版の資料として整合しており、主体・会計基準・連結範囲も確認済みだと仮定します。コードが全ての前提を自動確認しているわけではありません。
quarterly_sales.pyという名前で保存し、TDnet③と同じPythonで実行します。追加ライブラリは使いません。
.venv/bin/python quarterly_sales.py
WindowsのPowerShellでは、.\.venv\Scripts\python.exe quarterly_sales.pyです。
from decimal import Decimal
# 架空の売上高。実際のAPI応答ではありません。
rows = [
{"source": "sample-q1", "start": "2025-04-01", "end": "2025-06-30",
"scope": "consolidated", "kind": "actual", "unit": "JPY", "value": "2000000000"},
{"source": "sample-q2", "start": "2025-04-01", "end": "2025-09-30",
"scope": "consolidated", "kind": "actual", "unit": "JPY", "value": "4500000000"},
{"source": "sample-q3", "start": "2025-04-01", "end": "2025-12-31",
"scope": "consolidated", "kind": "actual", "unit": "JPY", "value": "7200000000"},
]
periods = [
("2025-04-01", "2025-06-30"),
("2025-07-01", "2025-09-30"),
("2025-10-01", "2025-12-31"),
]
if len(rows) != len(periods):
raise ValueError("This example requires three cumulative actuals")
previous = None
for row, (start, end) in zip(rows, periods):
expected = ("2025-04-01", end, "consolidated", "actual", "JPY")
observed = tuple(row[k] for k in ("start", "end", "scope", "kind", "unit"))
if observed != expected or row["value"] is None:
raise ValueError("Check period, scope, actual/forecast, unit and missing value")
cumulative = Decimal(row["value"])
if not cumulative.is_finite():
raise ValueError("A finite value is required")
if previous is None:
value = cumulative
basis = row["source"]
else:
value = cumulative - previous["value"]
basis = row["source"] + " minus " + previous["source"]
print(start, end, value / Decimal("100000000"), "億円", basis)
previous = {"value": cumulative, "source": row["source"]}
出力は次の3行です。
2025-04-01 2025-06-30 20 億円 sample-q1
2025-07-01 2025-09-30 25 億円 sample-q2 minus sample-q1
2025-10-01 2025-12-31 27 億円 sample-q3 minus sample-q2
コードで変わったのは、どこか
| 処理 | 意味 |
|---|---|
expectedとobservedの比較 |
今回の既知の期間・範囲・実績区分・円単位が揃うか確認する |
previous is None |
最初の3か月は、その累計を同じ3か月の値として使う |
cumulative - previous["value"] |
その後は、一つ前までの累計を引く |
basis |
どの架空の入力から作った値かを残す |
最後のprint
|
円単位の計算結果を億円表示へ換算する |
入力の順番が違う場合は、単純に並べ替えて成功扱いにするのではなく、必要な期間の実績が揃っているかを確認します。このコードは3件の既知の入力を読む例なので、決算期変更や欠けた四半期を自動的に補う処理は持ちません。
value=Noneや予想値を入れれば、確認行で停止します。これは「データがゼロ」という結果ではありません。入力の意味がこの計算の前提に合わない、という結果です。
6. グラフにも、値を確かめた結果を残す
計算した20・25・27億円を描くと、次のようになります。第4四半期の実績はまだないため、ゼロの棒や予想差分を置いていません。
図:全て架空データ。上は同じ長さの3か月実績、下は1年間の実績と予想です。上の四半期値と下の通期値を、同じ期間の値として並べたグラフではありません。
読み手が迷わないように、画面には少なくとも次の情報を出します。
- タイトルに「四半期単独」か「累計」かを書く。
- 軸や見出しに、表示単位を付ける。
- 対象期間と連結・個別の範囲を示す。
- 実績・予想を、文字と見た目の両方で区別する。
- 差分で算出した値には、その旨と元資料への導線を付ける。
- 未確認の値を空欄にし、訂正を反映した基準時点を示す。
図の見た目だけでなく、元の表・計算式・出典へ戻れることが大切です。今回の架空例なら、本文の累計表と3行の出力が、その確認先になります。
7. TDnet編でできるようになったこと
TDnet①で書類の役割と識別、②で実際のタグや仕様、③で一つの値の抽出と検算、④で比較と表示を扱いました。次の順番で説明できれば、この入門編の到達点です。
書類を選ぶ → タグと参照先を読む → 条件に合う値を選ぶ
→ 必要な計算を行う → 実績・予想・欠損を区別して表示する
ここまでの例は限定した学習用です。企業別の例外、科目の対応表、全書類への自動対応、訂正の統合処理まで完成したものではありません。
自分の画面で項目や分析条件を組みたい場合は、必要な粒度に合うデータを選びます。私たち株式会社Crabgrassは、財務データAPI「ZENITH Code」を開発・提供しています。TDnet解析ガイドと財務データAPIの選び方では、書類の確認と、用途に合うデータの形を整理しています。
次はEDINET①から、有価証券報告書を扱う流れへ進みます。共通するXBRLの基本操作はTDnet編を参照し、EDINET編では書類・ファイル構造・タグやコンテキストの違いに重点を置きます。

