LLMに投資家の役を演じさせ、決算データを読ませて銘柄を判断させる。そんな投資エージェントを作ると、ほぼ必ずぶつかるのがデータの欠けです。データ源によって項目の揃い方は違い、プロンプトが前提にしている数字が空欄のまま渡ることがあります。
その空欄を、LLMはどう扱うのか。オープンソースの virattt/ai-hedge-fund を日本株(J-Quants API 無料プラン)で動かして実測しました。結論はこうです。
LLMは空欄を「中立」ではなく「弱気の理由」として読んだ。Graham役の弱気の判断の97%(38件中37件)が「負債のデータがない」ことに触れていた。無料データから1項目を補うと、その理由は0件になり、毎週の判断の15%が強気寄りに動いた。
研究用の過去データによる検証で、投資助言ではありません。実際の売買はしていません。コードは TIshow/ai-hedge-fund-jp にあります。
前回の続きみたいなものです。
実験の前提
| 項目 | 内容 |
|---|---|
| 仕組み | ai-hedge-fund 2.4(判断 → 比率 → リスク上限 → 翌営業日の終値で仮想約定)。日本株向けに J-Quants 接続・100株単位・決算短信の換算を追加 |
| 銘柄 | TOPIX Core30・Large70・Mid400 から各10社をルールで無作為に選んだ30社(金融業を除く) |
| 期間 | 2026年2月16日〜6月26日、週1回の見直し(18回) |
| 判断役 | 上流の Buffett 役・Graham 役(指示文は変更なし)。強気/中立/弱気と確信度を返す |
| モデル | Claude Opus 5.5 |
| 財務データ | J-Quants 無料プランの決算短信サマリーを直近12か月に換算。見直し日の前日までの開示だけを使う |
欠けはどこで生まれるか:プロンプトの前提とデータ源のずれ
上流の投資家エージェントは、米国のデータ業者の財務指標を前提に作られています。AIに渡す資料(スナップショット)には次の列があり、日本の無料データでは一部が作れません。
| 資料の項目 | J-Quants 無料プランの決算短信サマリーから | 理由 |
|---|---|---|
| 時価総額・PER | ○ 計算できる | 開示日の終値 × 株式数 |
| ROE・営業利益率・純利益率 | ○ | 利益・売上・自己資本がある |
| 売上成長率・EPS・BPS | ○ | |
| 1株あたりフリーキャッシュフロー | △ | 四半期によってキャッシュフローが空欄 |
| 粗利率 | ✕ | 売上総利益がない |
| 負債資本比率(D/E) | ✕ | 有利子負債がない |
| 流動比率 | ✕ | 流動資産・流動負債がない |
欠けた項目は、資料では「-」として渡っていました。これが問題の出発点です。
LLMは空欄をどう読んだか
1. 空欄を「確かめられないリスク」として扱う
Graham 役の指示文には、次の趣旨の基準があります。
- 流動比率が1.5を十分上回り、負債は控えめであること
- 財務が弱ければ、見通しにかかわらず不合格
空欄はこの基準を「満たしていると確かめられない」状態です。LLM はこれを、弱さと同じように扱いました。Graham 役の判断理由には、たとえば次のような文が並びます。
- "The balance sheet cannot be judged, since neither the current ratio nor debt is reported."(流動比率も負債も報告されていないので、財務は判断できない)
- "The current ratio and debt-to-equity figures are absent, so financial strength cannot be verified, and I will not pay a growth premium for a balance sheet I cannot see."(流動比率と負債資本比率がないので財務の強さを確かめられない。見えない財務に成長の上乗せは払わない)
| Graham役(上流2.4のルール、30社・重複を除いた61の資料) | 件数 |
|---|---|
| 判断(強気・中立・弱気) | 1・22・38 |
| 弱気のうち「負債のデータがない」に触れたもの | 37 / 38 |
| 弱気のうち「流動比率がない」に触れたもの | 36 / 38 |
2. 空欄を悪い方の推測で埋める
ある総合商社について、Graham 役はこう書いていました。
- "no current ratio or debt figures are given for a trading house that is presumably heavily leveraged"(総合商社なのに流動比率も負債の数字もない。おそらく借入は多いのだろう)
空欄を「不明」のまま置くのではなく、業種から悪い方の値を推測して判断に使っています。会社名や業種を渡している場合、LLM の一般知識が空欄を埋める材料になります。
3. データ源の欠けを「企業が開示していない」と読み替える
見落としやすいのがこれです。
- "The filings give me neither a current ratio nor a debt-to-equity figure"(提出書類には流動比率も負債資本比率もない)
- "no current ratio disclosed"(流動比率が開示されていない)
実際には、企業は流動資産・流動負債・借入金を決算短信で開示しています。欠けていたのはデータ提供側の項目です。LLM は、空欄の理由を知らされなければ、もっともらしい理由(「企業が出していない」)を補います。判断の根拠の説明まで、事実と違うものになります。
1項目を補う実験
決算短信サマリーには、総資産と純資産はあります。そこで次の値を作り、資料に加えました。
負債の合計 ÷ 自己資本 = (総資産 − 純資産)÷ 自己資本
大事なのは名前と説明です。この値は有利子負債だけでなく、買掛金なども含む負債の総額です。負債資本比率(D/E)の列に入れると、LLM は「借入金の比率」と誤解します。そこで別の列(liab/E)にし、要約に次の説明を付けました。
Total liabilities/equity (latest): 0.60 (all liabilities incl. payables, not only interest-bearing debt)
実装のポイントは2つです。
- データ型に新しい任意項目を足し、値があるときだけ列と説明を表示する(上流の米国データでは値がないので、プロンプトは1文字も変わらない)
- 比較の条件をそろえる(同じ30社・同じ期間・同じルール・同じモデル。違いはこの1項目だけ)
結果
判断の理由が変わった
| Graham役 | 追加前 | 追加後 |
|---|---|---|
| 判断(強気・中立・弱気) | 1・22・38 | 3・23・35 |
| 弱気のうち「負債のデータがない」 | 37 / 38 | 0 / 35 |
| 弱気のうち「流動比率がない」 | 36 / 38 | 23 / 35 |
追加後、LLM は新しい数字を実際に使っていました。
- "total liabilities only 0.42 times equity"(負債は自己資本の0.42倍にすぎない)
- "a jump in liabilities from 0.32x to 0.48x"(負債が0.32倍から0.48倍に増えた)
負債については、「データがない」という理由が、数字に基づく評価に置き換わりました。Buffett 役も、弱気の理由で負債の欠けに触れたものが9件中3件から、8件中0件になりました。
判断そのものが動いた
| 結果 | |
|---|---|
| 毎週の判断のうち変わった割合 | 15%(1,080件中157件) |
| 判断が変わった会社 | 30社中10社(残り20社は1件も変わらない) |
| 強気と弱気が正反対になった判断 | 0件(すべて中立との間の移動) |
| 変化の向き | 強気寄り(Buffett役「中立→強気」40件、Graham役「弱気→中立」43件) |
| 株に投資していた割合(平均) | 6.3% → 12.3% |
変わらなかったもの
- Graham 役の弱気の割合は62% → 57%と小幅でした。残る弱気の理由は、PER の基準(15〜20倍まで)、履歴の短さ(無料データでは4〜5期分)、流動比率の欠けです
- 流動比率は無料データでは作れないので、その欠けへの言及は23/35件残りました
この結果をどこまで信じてよいか
- 判断は各資料1回ずつ聞いた結果です。上流は temperature を指定しておらず、同じ入力でも判断は揺れます。一方、上流は同じ入力なら保存済みの回答を再利用するので、その揺れは見えません
- 「負債のデータがない」という理由が37件から0件になったのは、揺れでは説明できない大きさです
- 弱気の割合の小さな差(62% → 57%)は、揺れの範囲かもしれません
- 判断の変化(15%)は、揺れだけなら向きがおおむね半々になるはずのところ、強気寄りにそろっていました
- 30社・約4か月半・判断役2人・モデル1種類の探索的な結果です
設計への示唆
1. 項目の対応表を作り、欠けを数える
プロンプトが前提にする項目と、データ源の項目の対応表を最初に作ります。空欄になる項目があれば、それが判断にどれだけ影響するかを、判断理由の中の言及として数えます。今回は正規表現で拾い、候補を全件目で確認しました(機械的な判定だけでは、「負債の数字を使ったうえで流動比率に触れた文」を誤って数えていました)。
2. 空欄の意味をLLMに伝える
「-」だけでは、LLM は「データ源にない」「企業が開示していない」「該当しない」を区別できません。たとえば資料の冒頭に、次のような説明を入れる方法が考えられます(今回は未検証の案です)。
Fields shown as "-" are not available from this data source.
They are not a statement that the company failed to disclose them;
do not treat their absence as evidence of weakness.
ただし、欠けを「弱さの証拠にしない」と指示するのが正しいかは、投資の考え方にもよります。Graham 的に「確かめられないなら投資しない」のが妥当な場面もあります。どちらにするかを設計者が決め、明示することが大事です。
3. 代わりの値を足すときは、正直な名前を付ける
今回の「負債の合計 ÷ 自己資本」は、有利子負債の比率ではありません。既存の列に流し込むと、判断は動いても、その根拠は誤解に基づくものになります。別の名前の列と、何が含まれるかの一文を付けました。
4. データ源が違う結果は比べない
同じエージェント・同じ銘柄・同じ期間でも、項目が1つ違うだけで判断の15%が動きました。米国データで調整したエージェントを別のデータ源で動かした成績や、データ源の違うエージェント同士の成績は、そのままでは比べられません。
5. 条件の比較は、揺れを測ってから
データ源の変更が判断をどれだけ動かすかを測るなら、まず同じ入力を複数回聞いて、判断の揺れの大きさを測ります。変化がその揺れより大きいかどうかで判断します。
チェックリスト
- プロンプトの前提項目とデータ源の項目の対応表を作った
- 空欄になる項目と、その件数を把握した
- 空欄の意味(データ源にない/開示されていない/該当しない)を資料で説明している
- 代わりの値には、既存の列と混同しない名前と説明を付けた
- 判断理由の中で、欠けへの言及を数えて確認した(機械的な判定は目で確かめる)
- 同じ入力を複数回聞いて、判断の揺れを測った
- データ源の違う結果同士を比べていない
次にやること
- 同じ資料を複数回聞き、判断の揺れの大きさを測る
- 流動比率も揃えたとき(有料プランかEDINET)に、Graham役の弱気がどこまで減るかを見る
- 空欄の意味を説明する文を加えたとき、判断がどう変わるかを比べる
