実運用中の自律トレーディングシステムで起きたインシデントの振り返り。個別の資産額・銘柄・成績値は伏せ、構造と教訓に絞って一般化している。実践編は 目標駆動・自律改善システムの構築ベストプラクティス を参照。
発端:ある素朴な質問
自律的に運用しているトレーディングシステムに、こんな質問を投げたところから始まった。
「ある銘柄を SELL にしているけど損益がマイナス。もっと早く売っていれば良かったのに、シグナルの判断が甘いのでは?」
このシステムは、複数の AI エージェント(テクニカル / センチメント / リスク / 統合)が毎日投資計画を立て、毎日パフォーマンスレビューまで自動で回している。にもかかわらず、含み損銘柄の売りが遅れた。
普通なら「シグナルのしきい値をいじる」で終わる話だ。だが調べていくと、真因はシグナルのロジックではなく、自律改善サイクルそのものが構造的に見えていない盲点にあった。しかも盲点は 1 つではなく、層をなして重なっていた。
この記事は、その調査と修正の記録であり、「自分で回るシステム」を Claude Code のようなエージェントで作るときに踏みやすい落とし穴の一般化でもある。
Part 1:見えていなかった事実
問題の銘柄(以下 X)は、あるタイミングで買い、約 2 週間後に含み損で売った。エージェントの説明は「売りシグナルが揃ったのは執行の直前」。
DB の実際の株価と、毎日の提案が「見ていた」株価を並べると、犯人が浮かんだ(値は相対イメージ)。
| 日付 | 実際の終値(DB) | その日の提案が見ていた終値 | 判断 |
|---|---|---|---|
| 初日 | 100 | 100(正常) | HOLD |
| +1〜4日 | 収集欠損 | 100 のまま | HOLD |
| +5日 | 95(下落) | 「現在値100 > BBミドル」 | HOLD |
| +6日 | 95(売りシグナル点灯) | 100 参照 | HOLD |
| +9日 | 96 | 「100、むしろ強気改善中」 | HOLD |
| +10日 | 97 | ようやく実勢を反映、全シグナル点灯 | SELL |
出口シグナル(BBミドル割れ / MACDデッドクロス / ATRストップ——いずれもテクニカル指標ベースの売り条件)は DB の終値で計算される。その終値が約 1 週間凍結していた。エンジンは「終値100 はBBミドルを上回る → 未点灯」と、古い入力に忠実に判定し続けていた。
シグナルは鮮度の良いデータが来た瞬間に即発火していた。遅れたのは判断ロジックではなく、データ供給だった。
(余談だが、この銘柄は買った直後からほぼずっと含み損で、「もっと早く売れば得」は実は成立しなかった。むしろ凍結のおかげで売値は改善していた。ユーザーの体感は正しく問題を指し示していたが、指していた先は本人の想定と違った——これも自律システムでよくある。)
Part 2:なぜ「毎日レビュー」で気づけなかったのか
ここが本題だ。毎日自動でレビューしているのに、なぜこの事実を拾えなかったのか。 調べると、盲点が 5 層に重なっていた。
① 価格ソースの split-brain(決定と観測が別のデータを見る)
決定エンジン(出口シグナル)は DB の終値を、ポートフォリオ評価・週次ふりかえりは 外部 API のライブ価格を読んでいた。証拠に、同じ日の週次ふりかえりは X を正しい実勢価格・含み損で表示していた。片方は正しく、片方は凍結。両者の食い違いを照合する主体が誰もいなかった。
② レビューは「記述」であって「制御ループ」ではない
レビューは含み損を表に出すが、それを行動(売却・アラート)に変換する経路がない。フィードバック先は「買いのしきい値」に偏っていて、既存保有の出口を是正する回路が欠けていた。観測できることと、行動を変えられることは別物だ。
③ 学習信号のサバイバーシップ・バイアス
実現損益ベースの学習機構はあった。だがその期間の実現損益は「決済トレードなし」。負けを切らずに持ち続けることこそが問題行動なのに、切っていないから統計に一生載らない。 システムは「終わった取引」からは学べても、「終わらせない失敗」は見えなかった。
④ データ鮮度を誰も検査していない
各銘柄の最新日付は記録していたが、「それが今日から何日前か」を検証していなかった。自己修復の再取得は「データが完全に欠損した銘柄」だけが対象で、X のような「存在するが凍結」は素通りだった。
⑤ 目標が「もっと買え」の圧力になっていた
システムには意欲的な長期目標(短期間での資産大幅増)が設定されていた。ところが達成可能性の判定しきい値がゆるく、**現実には過大な必要リターンを「達成可能」**と表示。ペースも「順調」判定。そして「出遅れたら積極化(露出拡大)」というロジックが、勝率の低いエントリーを後押ししていた。レビューの分析も「買い逃し(機会損失)」に偏り、「負けを繰り返している」を言語化しなかった。
5 つの盲点は同じ根につながっていた。自律ループは自分が消費する同じデータ・同じ前提の上に立っているので、その前提が壊れると、全レイヤーが仲良く同じ間違いに合意する。
Part 3:どう直したか
5 つの盲点に対して、5 本の PR で対処した。
| 記号 | 対処 | 塞いだ盲点 |
|---|---|---|
| A | 保有銘柄の価格鮮度ガード(凍結を毎日検知→自己修復、ダメなら通知) | ④ |
| B | DB終値 vs ライブ価格の乖離検知(分割未調整・不良ティック) | ① |
| C | 未決済含み損の「撤退優先度ランキング」を日次レビューに常設 | ②③ |
| D | 診断計器の正直化 + 「出遅れ→積極化」を「出遅れ→エッジ改善」に反転 | ⑤ |
| E | 目標にリスク予算(許容DD=ドローダウン・最低勝率・最低PF=プロフィットファクター)を付与、レビューをリスク調整後で評価 | ②③⑤ |
原則として貫いたのは 1 つ。目標は下げない。診断を正直にする。目標へはレバレッジでなくエッジ(勝率×損益比)で近づく。
D/E を入れた瞬間、同じデータに対して評価が変わった:
- Before:ステータス「順調」/ 達成可能性「達成可能」
- After :ステータス 「出遅れ」 / 達成可能性 「非現実的」、そしてレビューに「🔴 エッジ予算割れ(勝率は5割未満・PF は1未満・期待値マイナス)」が表示されるようになった。
成績自体は前から悪かった。変わったのは、システムがそれを「悪い」と認めて毎日突きつけるようになったことだ。
Part 4:Claude Code で自律システムを作るときの 5 つの教訓
ここからが本題の一般化。自律的に回るシステムをエージェントで組むとき、上の 5 盲点はほぼ普遍的に現れる。
教訓 1:入力の鮮度は、境界で能動的に検査する(GIGO は静かに来る)
自律ループは自分のデータストアを信じて動く。入力が静かに古くなると、エラーも例外も出ないまま全レイヤーが古い答えに合意する。「データが無い」は気づけるが、「データが古い」は気づけない。→ 境界に鮮度ガードを置き、古さを一級市民として扱う。
教訓 2:決定と観測は同じ真実を見る(さもなくば乖離を明示検知する)
「判断に使う値」と「人間が見る値」が別ソースだと、片方だけ壊れたとき誰も気づかない。単一の真実源にできないなら、ソース間の乖離そのものを監視項目にする。
教訓 3:観測(observability)と制御(control)を混同しない
「ダッシュボードに出ている」は「システムが対処できる」を意味しない。レビューが問題を描写するだけで行動を変えられないなら、それはフィードバックループではない。→ ループを閉じる。観測項目には必ず「で、どう動くのか」を紐づける。
教訓 4:学習信号のサバイバーシップに注意する
「完了したアクション」からしか学ばないと、「完了させない」という失敗モードが不可視になる。トレードなら実現損益だけでなく含み損・保有期間を、一般には「やり残し・塩漬け・先送り」を明示的に計測する。
教訓 5:目標は北極星に。計器を目標に合わせて曲げない
達成困難な目標を「達成可能」と表示させる較正は、体温計をいじる行為だ。目標は下げず、計器を正直にして、ギャップを毎日突きつける。 そして「遅れているからリスクを上げる」は多くの場合ギャンブラーの破滅。目標へはエッジ改善で近づき、リスク予算(許容DD・最低勝率)で土台を守る。
そして最大のメタ教訓
自律システムは、自分の盲点を自分では監査できない。
この一件を掘り起こしたのは、精緻なレビュー機構ではなく、外部の人間の素朴な一言だった。「なんでもっと早く売らなかったの?」。自律ループは自分の前提の内側でしか物を見られない。だから——
- 人間が“外側から刺す”経路を設計に組み込む(定期的な素朴な問い、異常系の再現、ランダムな深掘り)。
- エージェントに実行時の状態を渡す。今回デバッグできたのは、コードだけでなく DB・生成された計画の根拠テキスト・レポートが永続化されていたからだ。Claude Code に「コードを読む」だけでなく「実際に起きた状態を辿る」権限を与えると、盲点の考古学ができる。
- エージェントに調査させ、人間は問いと判断を出す。修正は AI が実装し PR にしたが、「目標は下げるな」という原則判断は人間が下した。この分業が効いた。
Part 5:残る改善ポイント
正直に、まだ閉じていない穴を挙げておく。
- 単一 DB を信じる構造は残る — A/B で鮮度と乖離は見るが、収集ジョブ自体がなぜ数日欠損したかの根治は別(収集の可観測性・リトライ)。
- しきい値は依然として人間が置いた定数 — 最低勝率・PF・乖離率など。本当はレジームや資産規模で動くべきで、これ自体が次の「較正ミス」候補。
- エッジ改善の“中身”はまだ薄い — 「出遅れ→エッジ改善要請」に反転したが、要請を受けて具体的に何をどう改善するかは今後の自律ループの宿題。
- メタ盲点は原理的に消えない — 今回塞いだ 5 つは「今わかっている盲点」。次の未知の盲点は、また外部の問いからしか出てこない。だからこそ教訓 5 のメタ(人間の問いを設計に組み込む)が、機能追加よりも本質的だ。
まとめ
「シグナルが甘いのでは?」という一言から、データ鮮度・価格ソースの分裂・観測と制御の混同・学習のサバイバーシップ・目標較正という 5 つの構造盲点が芋づる式に出てきた。共通するのは、自律ループが自分の前提の内側で完結してしまうという一点だ。
Claude Code のようなエージェントで自律システムを作るのは驚くほど速い。だが速さは、盲点も高速に量産する。効くのは派手な機能ではなく、境界での鮮度チェック / ソース乖離の監視 / ループを閉じる / やり残しを測る / 計器を正直に保つ——そして何より、外側から刺す人間の問いを設計に織り込むことだった。
具体的な設計原則・構築順序・Claude Code 機能へのマッピングは、実践編の 目標駆動・自律改善システムの構築ベストプラクティス にまとめている。
この調査・修正・本記事はすべて Claude Code とのセッションで行い、5 本の PR(鮮度ガード・乖離検知・撤退監査・診断正直化・リスク予算)として実装・マージした。