3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

件数が少ないうちは眠る安全装置が、32日目に目を覚ました 〜Claude Codeと作った「実測勝率ゲート」と、ラベルと実装の食い違い〜

3
Posted at

みなさん、こんにちは!
「ALPHA FORGE 開発秘話」の第26話です。

9月11日に入れた安全装置が、32日間ずっと眠っていました。目を覚ましたのは10月13日の朝。短期の候補8件を、1件残らず止めました🧱
しかも、止めた理由の数字を確かめ直していたら、もう1つ「あれ?」が見つかります。

日本株のAI銘柄スクリーニング&継続学習端末「ALPHA FORGE(アルファフォージ)」を、Claude Code と二人三脚で個人開発しています。今回は【事件簿】回。AIと一緒に作った安全装置が、設計どおりに動いた日の話です。

【要約:この記事で伝えたいこと】

  1. 初日に入れた「実測勝率のゲート」は、記録が20件たまるまで眠る作り。勝率は基準の45%を下回り続けていたのに、20件に届かず休眠していた
  2. 10/9から10/12に決着が12件入って16件が28件になり、10/13の朝に初めて目を覚まして短期の8候補をすべて止めた。0件の日も経緯を記録として出す、と決めたのは人間
  3. 持ち帰り:安全装置は「何を数えて、何と比べて、いつ目を覚ますか」まで書いておく。そして、ラベルと実装が同じものを指しているかを、ときどき確かめる

※本記事はnote連載[ALPHA FORGE 開発秘話 #26] の技術的な部分を、エンジニア向けに再構成したものです。

🧭 初日に入れた「実測勝率のゲート」

ALPHA FORGE の土台は、私が最初に書いた構築プロンプト1枚です。その中に、こんな1行を入れていました。

ハード除外ルール(前身の自作ツールの E1〜E3 相当を移植・調整): SELL 判定候補をロングに混ぜない、実測勝率ゲート等。

9月11日、AI(Claude Code)はこれを実装しました。コミットの説明には「約定 n>=20 かつコホート勝率 <45% で除外、薄いうちは休眠」とあります。今のコードはこうです(抜粋)。

_WINRATE_GATE = 0.45
_WINRATE_GATE_MIN_SAMPLE = 20

# E3: 実測勝率ゲート。決着済みコホート(確度バケット × 方向)の勝率が閾値未満で、
# かつ約定サンプルが十分(>= _WINRATE_GATE_MIN_SAMPLE)なら、LLM の確度に関わらず除外する。
win_rate, n_filled = await cohort_winrate(
    confidence_bucket=bucket, direction=direction, horizon_days=ctx.gate_horizon
)
if n_filled >= _WINRATE_GATE_MIN_SAMPLE and win_rate is not None and win_rate < _WINRATE_GATE:
    ...  # 見送りとして記録する

日常の言葉にすると、こうです。

  1. 今朝の候補と同じ条件(確度の高さ×方向)で過去に抽出したものを集める
  2. 短期なら3営業日後に、指数を上回った割合を数える
  3. 記録が20件以上あって、その割合が45%を下回ったら、その条件の候補はまとめて見送る
  4. 記録が20件に届かないうちは、何もしない(休眠)

最後の1行が、今回の主役です😴

💥 基準を下回っていたのに、止まらなかった

02_wall.jpg
割合は基準を下回っていたのに、件数が20件に届かずゲートは休眠していた

確度「中」・正のトレンド相関の短期の記録を、台帳から朝ごとに数え直してみました。10/6の朝は12件中3件(25.0%)、10/8の朝は16件中5件(31.2%)です。基準の45%を、ずっと下回っていました。

それでもゲートは動きません。件数が20件に届いていないからです。設計どおりの「休眠」でした。

そして10月13日、3連休明けの朝。私はAIに聞きました。

ピックうごいてる?

fig_chat_1013.jpg
32日間眠っていた安全装置が、初めて動いた朝

AIの返事は(要旨)、「動いています。ただ、手動で回した分は採用0件でした。エラーではなく基準で見送った結果です。短期は8件すべてが実測勝率ゲートで外れました。この組み合わせの過去の割合は18%(28件中)で、基準の45%を下回っています」。

⏰ なぜ、この朝だったのか

fig_wakeup.jpg
10/9の朝は16件、4日間で12件増えて、10/13の朝は28件

10/9の朝の時点では16件でした。そこから10/12までに、決着が12件入ります。12件のうち8件は、祝日の10/12にまとめて入りました。そして8件とも、指数を上回っていません。

こうして10/13の朝、記録は28件中5件(18%)。20件を超えたその日に、ゲートは初めて目を覚ましました。推論の記録に残ったゲートでの見送りは、10/13が16件(手動と定時の2回分)、10/14が5件、10/15が3件、10/16が2件。それより前は0件です。

壊れたわけでも、急に基準が厳しくなったわけでもありません。休眠していた32日間、黙って数え続けていただけでした🧮

ハマりどころ
「件数が少ないうちは判定しない」ゲートは、眠っている間は何も起きません。ログにも画面にも出ないので、ゲートがあること自体を忘れます。そして件数が閾値を超えた日に、前触れなく一斉に止まります。眠っている間の数字(何件中何件か)も、ときどき数え直しておくと慌てずに済みます。

🛠️ どう扱ったか

03_fix.jpg
見送った理由を、条件と基準値まで数字で残すようにした

見送った理由を、数字で残す

10/13の朝のうちに、AIはゲートで止めたときの記録を増やしました。それまでは割合と件数だけ。そこへ、確度の高さ・方向・何営業日後で数えたか・基準値を足しています。あとから「何件中何件で、基準はいくつだったか」を説明できるようにするためです。

await rec.emit(
    "verify",
    "failed",
    {
        "reason": reason,
        "win_rate": win_rate,
        "n_filled": n_filled,
        "threshold": _WINRATE_GATE,
        "confidence_bucket": bucket,
        "direction": direction,
        "gate_horizon": ctx.gate_horizon,
    },
    run_status="rejected",
)

0件の日も、記録を出す

0件の日も休みにせず、0件になった経緯を書いて記録を出す。そう決めたのは人間です。

4日後に見つかった、もう1つの「あれ?」

10月17日、今週の数字を台帳から数え直していたAIが、決着処理のコードの中に食い違いを見つけました。コードの説明や記事では「TOPIXを上回った」と書いてきたのに、実装が比べていたのは日経平均(^N225)だったのです😳

fig_label.jpg
「TOPIX超過」と呼んでいた数字は、日経平均と比べた値だった

件数や割合の数字そのものは、変わりません。変わるのは「何と比べたか」という名前です。公開済みの記事には訂正を入れる、と決めたのは人間でした。

⚖️ やったこと/やらなかったこと

  1. やったこと:見送りの理由を数字で残す。0件の日も、経緯を書いて記録に残す
  2. やったこと:ラベルと実装が食い違っていた記事に、訂正を入れる
  3. やらなかったこと:ゲートの基準(45%・20件)を動かすこと。止まった週も、設計どおりの数字で止めました
  4. 決めたのは人間:0件の日の扱い、訂正の入れ方。AIは数え直しと、食い違いの発見を担当しました

🧰 今回のハーネス術:安全装置には「目を覚ます条件」を書く

件数が少ないうちに割合で止めると、たまたまの数字で止めてしまいます。だから「20件に届くまでは休眠」という条件は、正しい設計でした。ただ、眠っている間は何も起きないので、人間はゲートがあることを忘れがちです。

今回の経験から、安全装置には次の3つを書いておくことにしました📝

書くこと 中身
何を数えるか どの条件の、何営業日後の記録か
何と比べるか 指数の名前まで。ラベルと実装を合わせる
いつ目を覚ますか 何件たまったら動くか。眠っている間の数字も記録する

AIに作ってもらった安全装置ほど、この3つを日本語で説明できるかを確かめておくと、目を覚ました朝に慌てずに済みます。

fig_roles.jpg
ゲートを頼んだのは人間、作って数え直したのはAI、扱いを決めたのは人間

📌 保存用チェックリスト

  1. 安全装置は「何を数えて、何と比べて、いつ目を覚ますか」を日本語で書く
  2. 眠っている間の数字も、ときどき数え直す
  3. 止めたときは、条件と基準値まで数字で残す
  4. ラベルの名前と、実装が比べている相手を合わせる
  5. 止まった週ほど、基準をいじらずに記録を続ける

☕ note.comで開発秘話と毎朝の検証ログを連載中

note.comでは、「ALPHA FORGE」の開発秘話と、毎朝のアルゴリズム検証ログを公開しています。

👉 元記事(note連載第26話):
https://note.com/featured_stocks/n/n3acd314bf132

ゲートが初めて全候補を見送った10/13の朝の検証ログでは、止まった内訳を図でくわしく書いています。

エンジニアでない方向けに「AIへの仕事の頼み方」をまとめた連載(メンバーシップ「AIとつくるラボ」)もやっています。第0話は無料で読めます。


免責事項
本記事は個人開発およびAIエージェントを活用したシステム開発の技術記録です。特定の銘柄の売買推奨や投資助言を行うものではありません。記事中のゲートの基準・件数は、2026年10月17日時点の開発時の記録にもとづくもので、変更される可能性があります。過去の記録の割合は、将来の値動きを示すものではありません。AIの発言は要旨です。

⚠️ 【システム検証記録に関する免責事項・注意事項】

  • 本記事は、独自開発アルゴリズム「ALPHA FORGE」の動作検証およびデータ分析過程を公開する技術・運用の個人的な記録ログです。
  • 掲載されているすべてのデータ(各スコア、基準観測値、統計的変動上限、シナリオ無効化水準など)は、過去の市場データに基づき数式(ATR等)により機械的に算出されたバックテスト・シミュレーション用のパラメータであり、特定の有価証券の売買勧誘、取引の推奨、投資助言・代理行為を目的としたものではありません。
  • また、将来の株価変動や運用成果を保証するものではありません。実際の投資判断および最終決定は、必ずご自身の責任と判断において行っていただけますようお願いいたします。
3
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?