Vibe Trading の考察:いつAIを使うべきか、いつ使うべきでないか。
最近、「Vibe Trading」という概念が注目されています。取引意図を自然言語で記述し、AIに実行させるというものです。「保守的な戦略で、低ボラティリティ資産を優先」と言えば、AIが自動でポートフォリオを組んでくれます。とても魅力的に聞こえます。
しかし、Vibe Tradingの話に入る前に、最近起こったある出来事についてお話ししたいと思います。それはどんな理論よりも、「AIをどこに使うべきか」を明確に示してくれます。
3月31日、AnthropicのClaude Codeがnpmの更新中にソースコードを誤って公開しました。約512,000行のTypeScript(注:これはパッケージ後の総コード量で、依存関係や生成コードを含みます)。コミュニティによるリバースエンジニアリング解析がすぐに広がり、世界中の開発者が新機能を求めてコードを調べました。
しかし、私が最も驚いた発見は、AIとは関係ありませんでした。この発見自体もトレードとは関係ありませんが、その背後にあるエンジニアリング哲学は、定量取引に携わる人には共感できるはずです。
ある解析者によってuserPromptKeywordsとラベル付けされたモジュールに、shit、wtf、fucking brokenといった罵倒語を検出するための正規表現がありました。ユーザーが怒っているかどうかを素早く判断するためのものです。
世界最先端の大規模言語モデル企業が、感情検出に正規表現を使っているのです。
Claudeに感情分析をさせるのではなく、分類器を訓練するのでもなく、マイクロ秒で動作する文字列マッチングです。
なぜでしょうか?
一、なぜAnthropicは自社のAIを使わないのか
これは怠慢ではありません。熟慮されたエンジニアリング上の決定です。
Claude Codeは1日に数十万回のユーザーインタラクションを処理します。毎回のインタラクションで「ユーザーがフラストレーションを表現しているか」を判断し、応答戦略を調整する必要があります。もし毎回LLMを呼び出して判断すると:
- レイテンシ:LLMの推論は少なくとも数百ミリ秒かかるのに対し、正規表現マッチングは数マイクロ秒
- コスト:LLM呼び出しはトークン課金、正規表現マッチングはほぼ無料
- 決定論:正規表現はマッチするかしないかのどちらかで、結果は100%確定。LLMの出力は決定論的ではなく、同じ入力でも異なる判断が下される可能性がある
そこでAnthropicが選んだのは、正規表現で素早くフィルタリング(低コスト・高速・決定論的)し、LLMの計算リソースは真に意味理解が必要な判断に残すということです。
これは単なる技術的詳細ではありません。すべての問題をAIで解決すべきではないというアーキテクチャ哲学です。
定量取引に携わる方には、特に心に響く言葉ではないでしょうか。
二、定量取引における同じ選択
あなたの戦略には2種類の判断があります。
決定論的判断——「ルール」を使うべき
FMZでストラテジーを書いたことのある人なら、最もコアな取引ロジックはたいてい数行の決定論的なコードで書かれていることを知っています。
javascript
// 移動平均線クロスシグナル —— FMZ JavaScript サンプル
var records = exchange.GetRecords(PERIOD_D1)
var ma5 = TA.MA(records, 5)
var ma20 = TA.MA(records, 20)
var idx = records.length - 1
// ゴールデンクロスで買い
if (ma5[idx] > ma20[idx] && ma5[idx-1] <= ma20[idx-1]) {
exchange.SetDirection("buy")
exchange.Buy(records[idx].Close, 1)
Log("移動平均線ゴールデンクロス、買い")
}
条件は明確、結果は確定、意味を「理解」する必要はありません。if-elseで書けば、100%信頼でき、ミリ秒で実行できます。
これはAnthropicが正規表現で感情を検出するのと似た考え方です——決定論的な問題には、決定論的なツールを使う。 もちろん、正規表現は文字列マッチング、移動平均は数学計算で、ツールは異なりますが、それぞれのシステムで果たす役割は似ています。どちらもAIを介入させる必要のない決定論的判断です。
損失カットは、if-elseの信頼性は100%ですが、AIの信頼性は「高い確率」に過ぎません。あなたの口座はそのわずかな確率を許容できません。
曖昧な判断——AIを使うべき
しかし、if-elseでは書けない判断もあります。
- ニュース感情分析:FRBの声明が出ました。ハト派でしょうか、タカ派でしょうか?「現行の金利水準を維持するが、委員会はデータの変化を注視する」——これは好材料ですか、悪材料ですか?移動平均線は教えてくれませんし、正規表現もこの判断はできません。
- 異常検知:あるアルトコインのソーシャルメディアでの言及量が3時間で800%増加したが、価格はまだ動いていません。これは「賢いマネーがポジションを構築している」のか、あるいは「誰かが価格を吊り上げる前に仕掛けている」のか?複数の情報を組み合わせた曖昧な判断が必要です。
- 戦略生成:「最近、このパターンの後にはよく急騰が起こる」という直感がある。しかし、具体的な条件を言葉にできない。この直感をLLMに説明し、バックテスト可能な量的ファクターに変換してもらうことができます。
これらのシナリオの共通点:入力は非構造化、判断基準は曖昧、「マッチング」ではなく「理解」が必要。
三、参考になる階層化の考え方
Claude Codeのアーキテクチャに戻りましょう。コミュニティの分析により、明確な階層構造が明らかになりました。
| 階層 | Claude Codeでの仕組み | 定量取引での対応 |
|---|---|---|
| 高速フィルタリング層 | 正規表現、キーワードマッチング | 移動平均クロス、閾値ストップロス、ポジション制限 |
| エンジニアリング基盤層 | プロセス管理、メッセージング、権限制御 | 取引所API、注文管理、リスク管理エンジン |
| 意味判断層 | LLMプロンプト | ニュース感情分析、異常パターン認識、戦略探索 |
もちろん、Claude Codeと定量取引は全く異なる分野であり、ここでの対応は正確なマッピングではありません。しかし、設計哲学の共鳴は現実に存在します——各階層には最適なツールを選び、すべての釘を一本のハンマーで叩かない。
オープンソースコミュニティでも同様の考え方の実践が見られます。TradingAgents は最近注目されるマルチエージェント定量取引フレームワークです(LangGraphベースで、対応学術論文もあり)。実際のトレーディング会社のチーム構造をシミュレートしています。テクニカルアナリストがローソク足や指標計算を担当し、センチメントアナリストがニュースや世論を解釈し、異なるスタイルのトレーダーが各意見を総合して最終判断を下します。全能のAIがすべてをこなすのではなく、異なる役割がそれぞれの役割を果たします。
注意点として、TradingAgentsは研究フレームワークであり、「AIがどのように取引判断を行うか」という問題を解決します。しかし、実際の運用ではもう半分が必要です。取引所との連携、注文管理、リスク管理の実行、監査ログ——これらのエンジニアリング基盤作業は、まさにFMZのような定量プラットフォームが既に提供しているものです。
四、Vibe Tradingの実装方法:階層的アーキテクチャの例
冒頭のVibe Tradingに戻ります。方向性は間違っていませんが、前提として階層化が明確でなければなりません。
例えば、BTCで移動平均線のゴールデンクロスが発生したが、ニュースはすべて規制の悪材料だ。どうしますか?移動平均だけ見れば買いシグナル、ニュースだけ聞けば動けません。これこそ階層化が必要な典型的なシナリオです。
FMZでは、簡略化された階層的アーキテクチャを次のように実装できます(注:以下は簡略化した例であり、実際の運用ではコントラクト設定やリスク管理を各自で適切に行ってください)。
javascript
/*
策略パラメーター(FMZ 戦略編集ページの「パラメーター」タブに追加):
OPENROUTER_API_KEY : 文字列型、OpenRouter API キーを入力
AI_MODEL : 文字列型、デフォルト値 "google/gemini-2.5-flash"、他のモデルに変更可能
*/
// セマンティック意思決定層:OpenRouter 経由で AI を呼び出し、市場センチメントを取得
function getAISentiment() {
var prompt = "分析当前加密货币市场新闻,给出情绪评分(-1到1,-1极度恐慌,1极度贪婪),只返回一个数字"
var response = HttpQuery("https://openrouter.ai/api/v1/chat/completions", {
method: "POST",
body: JSON.stringify({
model: AI_MODEL,
messages: [{role: "user", content: prompt}],
temperature: 0
}),
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + OPENROUTER_API_KEY
},
timeout: 15000
})
var score = parseFloat(JSON.parse(response).choices[0].message.content)
// AI 返回异常时,回退到中性值——系统可靠性不依赖 AI 的每次正确输出
if (isNaN(score) || score < -1 || score > 1) {
Log("AI 返回格式异常,使用默认值 0")
score = 0
}
Log("AI 情绪评分:", score)
return score
}
function main() {
var lastSignalTime = 0 // 记录上次信号触发的K线时间,防止同一根K线重复触发
while (true) {
var records = exchange.GetRecords(PERIOD_D1)
if (!records || records.length < 20) { Sleep(1000); continue }
var ma5 = TA.MA(records, 5)
var ma20 = TA.MA(records, 20)
var idx = records.length - 1
var curTime = records[idx].Time
var isBullCross = ma5[idx] > ma20[idx] && ma5[idx-1] <= ma20[idx-1]
var isBearCross = ma5[idx] < ma20[idx] && ma5[idx-1] >= ma20[idx-1]
// 查持仓状态
var pos = exchange.GetPosition()
var hasPosition = pos && pos.length > 0
// 第一层:确定性信号做"门槛",金叉触发 + 无持仓 + 未在本根K线处理过,才去问 AI
if (isBullCross && !hasPosition && curTime !== lastSignalTime) {
lastSignalTime = curTime
var sentiment = getAISentiment()
// 第二层:AI 情绪做"参考",影响仓位但不独立触发交易
if (sentiment > 0.2) {
exchange.SetDirection("buy")
exchange.Buy(records[idx].Close, 1)
Log("金叉 + AI看多,全仓开")
} else if (sentiment > -0.3) {
exchange.SetDirection("buy")
exchange.Buy(records[idx].Close, 0.5)
Log("金叉 + AI中性,半仓开")
} else {
Log("金叉但 AI 看空,跳过本次信号")
}
}
// 死叉平仓:确定性规则,不经过 AI
if (isBearCross && hasPosition) {
exchange.SetDirection("closebuy")
exchange.Sell(records[idx].Close, pos[0].Amount)
Log("均线死叉,平仓")
}
// 第三层:止损是"铁律",不经过 AI
if (hasPosition) {
var curPrice = records[idx].Close
var entryPrice = pos[0].Price
if (curPrice < entryPrice * 0.97) { // 跌破开仓价 3%
exchange.SetDirection("closebuy")
exchange.Sell(curPrice, pos[0].Amount)
Log("止损触发,无条件平仓,亏损", ((curPrice/entryPrice - 1)*100).toFixed(2), "%")
}
}
Sleep(60 * 1000)
}
}
このコードの核となるロジックを詳しく説明する必要がある。
1. 移動平均線のゴールデンクロスは「閾値」。 確定的なシグナルが先にトリガーされた場合のみ、AI を呼び出す。すべてのローソク足で大規模モデルに問い合わせるわけではない――コスト削減(大規模モデル API はトークン単位で課金)にもなり、ノイズの回避にもなる。これは Anthropic の考え方と一致する。正規表現で先にフィルタリングし、マッチした場合のみ、より重い処理を起動する。
2. AI のセンチメントは「参考」。 ポジションサイズやシグナルをスキップするかに影響を与えるが、独立して取引をトリガーすることはない。コード内で AI の戻り値に例外処理を施している点に注意――大規模モデルが解析不能な内容を返した場合、直接デフォルト値 0 にフォールバックする。システムの信頼性は AI の毎回の正しい出力に依存すべきではない。
3. ストップロスは「鉄則」。 エントリー価格の 3% を下回ったら無条件でポジションをクローズし、AI の意見は聞かない。AI が「長期的には強気」と言っても、あなたの口座は長期まで耐えられないかもしれない。ここでは価格パーセンテージによるハードストップロスを使用し、あいまいな判断を一切介さない。
これが Vibe Trading の正しい開き方だ。自然言語で AI に市場のムードを「感知」させ、確定的なコードで取引アクションを「実行」させる。 両者の境界線は曖昧にしてはならない。
実践的なアドバイス:FMZ のバックテストシステムで、まず純粋な移動平均線戦略をベンチマークとして走らせ、その後に AI センチメント層を追加して、リターンとドローダウンを比較する。AI を追加したことでむしろパフォーマンスが悪化した場合――階層化に問題がある可能性があり、AI が介入すべきでない場面で介入している可能性がある。AI が返した結果は毎回 Log() で記録し、後で各決定を振り返りやすくしておくこと。
五、持ち帰る一言
最先端の AI 企業がセンチメント検出に正規表現を使うのは、より優れた AI を作れないからではない。
彼らは知っているからだ。適切なツールを選ぶことは、強力なツールを選ぶことよりも重要だと。
移動平均線戦略はセクシーではないし、正規表現は高度ではない。しかし、それぞれの領域では、どんな AI よりも信頼できる。
逆に、5000 文字のマクロレポートから「このレポートは BTC に対して強気か弱気か」という判断を抽出する必要がある場合――移動平均線も正規表現も役に立たない。それが AI が活躍すべき場面だ。
「AI を使うか使わないか」の問題ではなく、「どの層で使うか」の問題である。
Claude Code のソースコードにある目立たない正規表現ファイルは、よく見過ごされる問いに対する答えを私たちに示している。そして FMZ は、既製の階層化インフラを提供している――取引所インターフェース、インジケーター計算、リアル売買管理、ログ監査がすべて整っており、あなたは考慮すべきことだけを考えればよい。どの判断を TA.MA() に任せ、どの判断を AI に任せるかを。
参考資料:
- Alex Kim - Claude Code ソースリーク — 正規表現フラストレーション検出分析
- FMZ - AI駆動の自動取引システム構築 — AI 脳 + FMZ 両手アーキテクチャ
- TradingAgents - マルチエージェントLLM金融取引フレームワーク — マルチエージェントクオンツ取引オープンソースフレームワーク
- TradingAgents 論文 — マルチエージェント金融取引フレームワーク学術研究
- VentureBeat - Claude Code ソースコードリーク
- 1


