数値の集計は Python、結果の文章化は生成AI、という役割分担を明確にすると、レポート作成の作業時間が大きく短くなります。本記事は、同業他社の主要指標を比較して数百〜千文字程度のレポートを生成する流れを、コード・プロンプト・落とし穴の順で公開します。
過去の集計結果は将来の業績や株価を保証しません。本記事は売買推奨を目的にしたレポートではなく、データ整理と文章生成の手順を学ぶための教材です。
目次
- 役割分担
- 比較に使う指標
- 必要なライブラリ
- コード(指標を作るところまで)
- 生成された文章をレビューする観点
- 自動化するときの注意
- 落とし穴
役割分担
レポート作成を 2 つに分けます。
| 工程 | 担当 | 出力 |
|---|---|---|
| データ取得・正規化 | Python | 表(CSV) |
| 文章化・要約 | 生成AI | 文章(Markdown) |
生成AI に「J-Quants から取得して」と全部任せると、API キー漏れ・架空数字の混入・列名の食い違いといった問題が起きやすくなります。数値はコードで作る が原則です。
比較に使う指標
5 銘柄(架空)で次の指標をそろえます。
| 列名 | 内容 |
|---|---|
| Close | 直近終値 |
| market_cap | 時価総額(億円) |
| per | 株価 / 予想 EPS |
| pbr | 株価 / 1 株あたり純資産 |
| roe | 当期純利益 / 自己資本 |
| dividend_yield | 1 株あたり配当 / 株価 |
| revenue_yoy | 売上高前年比 |
ここまでは集計の段階で確定させ、生成AI には完成済みのデータフレームを渡します。
必要なライブラリ
pip install pandas検証バージョン: Python 3.12.5 / pandas 2.2.3
コード(指標を作るところまで)
実データの取得は J-Quants 経由(#6-5「日次株価四本値を取得する (/equities/bars/daily)」 / #6-7「取得データのローカル保存とキャッシュ戦略」)で行う前提で、本記事では集計後の構造だけ示します。
"""peer_report.py同業他社の比較表を作り、生成AI に渡す Markdown を出力する。"""from __future__ import annotations
import pandas as pd
PEERS = ["A", "B", "C", "D", "E"] # 同業 5 銘柄(架空コード)
def build_peer_table() -> pd.DataFrame: """既に集計済みの指標 CSV を読み込んで peers の表を返す。""" df = pd.read_csv("peer_metrics.csv") df = df[df["Code"].isin(PEERS)].copy() # 表示順を固定 df["Code"] = pd.Categorical(df["Code"], categories=PEERS, ordered=True) df = df.sort_values("Code").reset_index(drop=True) return df
def to_markdown_table(df: pd.DataFrame) -> str: """生成AI に渡しやすい Markdown テーブルに整形する。""" cols = ["Code", "CoName", "C", "market_cap", "per", "pbr", "roe", "dividend_yield", "revenue_yoy"] view = df[cols].copy() # 比率は %、金額・倍率は丸め for c in ["roe", "dividend_yield", "revenue_yoy"]: view[c] = (view[c] * 100).round(2).astype(str) + "%" for c in ["C", "market_cap"]: view[c] = view[c].round(0).astype(int) for c in ["per", "pbr"]: view[c] = view[c].round(2) return view.to_markdown(index=False)
def main() -> None: df = build_peer_table() md = to_markdown_table(df) with open("peer_table.md", "w", encoding="utf-8") as f: f.write(md) print(md)
if __name__ == "__main__": main()peer_table.md が生成されると、生成AI に渡す入力が確定します。
生成AI へのプロンプト例
数値・列名・比較軸まで「具体的に」書きます。要約だけ任せて、表の作り直しは禁止します。
目的:次の同業他社比較表をもとに、800 字程度の比較レポートを作成する。特定銘柄の売買推奨は禁止。学習用の整理として書く。
入力(Markdown 表):(ここに peer_table.md の内容を貼る)
レポートの構成:1. 全体の見立て(2 文)2. 各社の特徴(1 社につき 2 〜 3 文、表の数字を必ず引用)3. 比較から見える共通点と相違点(箇条書き)4. 注意事項(過去データは将来を保証しないこと、データ取得日を明記)
スタイル:- です・ます調で統一- 主観的な強調表現(「圧倒的」「断然」など)は使わない- 二人称・一人称は使わない- 1 段落 3 〜 5 行- 表の数値を改変しない。表に無い数字を新たに導入しない
出力:Markdown(見出しは ##)生成された文章をレビューする観点
生成AI の出力をそのまま使わず、次の観点で 1 度確認します。
- 数値の改変: 表の値と本文の値が一致しているか
- 架空のエピソード: 「先月の決算で〜」のような検証できない文が混じっていないか
- 断定表現: 「割安」「魅力的」など投資助言に近い表現が入っていないか
- 比較軸のすり替え: PER の話を続けて読むつもりが、急に売上高の話に飛んでいないか
ここを通したら、レポート用 Markdown ファイル(peer_report.md)として保存します。
自動化するときの注意
毎週・毎月の定期レポートに広げる場合、次を分けて管理します。
| 要素 | 管理方法 |
|---|---|
| 集計コード | git で履歴管理 |
| プロンプト | テキストファイルとして git 管理 |
| 集計データ | 取得日を入れたファイル名で日次保存 |
| 生成された文章 | 同じく取得日入りで保存 |
「あのレポートは何のデータで作ったのか」を後から再現できることが、自動レポートの価値を決めます。
落とし穴
- 指標の定義揺れ: PER の EPS は予想 / 実績どちらか、ROE は連結 / 単体どちらか、を毎回書く
- ベンチマークがない: 5 社の比較だけでは「業界平均との位置取り」が見えない。業種中央値を 1 行加える
- 似ていない 5 社: 「同業」の定義(同じ事業を 70% 以上の売上比率で行うか)を決める
- AI への過信: 生成された文章は必ず人間が 1 回レビューする
- 画像化: レポートに表をスクリーンショットで貼ると差分が読めなくなる。Markdown ベースを保つ
まとめ
- 集計は Python、文章化は生成AI、という役割分担で再現性を保つ
- 入力は Markdown 表で確定させる
- プロンプトは目的・入力・構成・スタイルを順に書く
- 出力は数値改変・断定表現・架空のエピソードに注意してレビュー
- 自動化するときは取得日入りのファイル名で集計と文章を別ファイル管理
過去のデータでの集計は将来の業績・株価を保証しません。