マルチエージェントLLM取引フレームワーク(TradingAgents)の解説と実装
戦略概要
TradingAgentsは、実際のトレーディングファームの組織構造を模倣したマルチエージェントLLMフレームワークです。GPT-4oシリーズなどのLLMを基盤に、7つの専門エージェントが連携して取引判断を行います。
この戦略がLLMで実現可能になった理由
| 従来手法 | 課題 | LLMによる解決 |
|---|---|---|
| ルールベース | 市場変化への適応が困難 | 自然言語で柔軟にルール変更可能 |
| 単一モデル予測 | 多角的分析が困難 | 複数エージェントが異なる視点で分析 |
| 人間のトレーダーチーム | コスト高、判断のばらつき | 一貫した基準で24時間稼働 |
| シグナル統合 | 重み付けが固定的 | 議論メカニズムで動的に重み調整 |
TradingAgentsのアーキテクチャ
7エージェント構成
TradingAgentsは5つのコンポーネント(分析チーム、研究チーム、トレーダー、リスク管理チーム、ファンドマネージャー)から成り、7つの主要エージェント役割で構成されます。
| エージェント | 役割 | 入力データ |
|---|---|---|
| Fundamental Analyst | 財務諸表・収益・インサイダー取引を分析し内在価値を評価 | 決算データ、SEC Filing |
| Sentiment Analyst | ソーシャルメディアやセンチメントスコアを処理 | X/Twitter、Reddit、ニュースセンチメント |
| News Analyst | ニュースやマクロ経済指標を分析し市場シフトを検知 | ニュースフィード、経済指標 |
| Technical Analyst | MACD、RSI等のテクニカル指標を計算 | OHLCV価格データ |
| Bullish Researcher | 投資機会を強調する肯定的視点を提供 | 各アナリストのレポート |
| Bearish Researcher | リスクを強調する否定的視点を提供 | 各アナリストのレポート |
| Trader | 分析と研究を統合し取引決定を実行 | 全レポート + 議論結果 |
| Risk Manager | ポートフォリオリスクを監視(ボラティリティ、流動性) | ポジション情報、市場データ |
ワークフロー
[データ収集] → [4アナリストが並列分析] → [研究チームが議論]
↓
[ファンドマネージャー承認] ← [リスク管理チーム議論] ← [トレーダー判断]
各エージェントはReActプロンプティングを採用し、共有環境状態で効率的に連携します。
エージェント間の議論メカニズム
TradingAgentsの特徴的な機能は、構造化されたエージェント間議論です。
議論プロトコル
- 構造化レポート: 各アナリストがレポート・文書・図表を出力
- 研究チーム議論: Bullish/Bearish Researcherがnラウンドの議論を実施
- ファシリテーター統合: 優勢な視点を採用し、バランスの取れた結論を導出
- リスク視点議論: 3つの視点(risky/neutral/safe)でnラウンド議論
- 最終レビュー: ファンドマネージャーが承認
# 議論メカニズムの概念的な実装
class ResearchDebate:
def __init__(self, n_rounds: int = 3):
self.n_rounds = n_rounds
self.bullish_agent = BullishResearcher()
self.bearish_agent = BearishResearcher()
self.facilitator = Facilitator()
def run_debate(self, analyst_reports: dict) -> str:
"""研究チームの議論を実行"""
debate_history = []
for round_idx in range(self.n_rounds):
# Bullish視点
bullish_arg = self.bullish_agent.argue(
reports=analyst_reports,
history=debate_history
)
debate_history.append(("bullish", bullish_arg))
# Bearish視点
bearish_arg = self.bearish_agent.argue(
reports=analyst_reports,
history=debate_history
)
debate_history.append(("bearish", bearish_arg))
# ファシリテーターが統合
conclusion = self.facilitator.summarize(debate_history)
return conclusion
この議論メカニズムにより、バックテストでは最大ドローダウン(MDD)を1.69%に抑制することに成功しています。
リスク管理エージェントによるガードレール設計
評価項目
| リスク種別 | 評価指標 | 緩和策 |
|---|---|---|
| 市場ボラティリティ | VIX、ヒストリカルボラティリティ | ポジションサイズ調整 |
| 流動性リスク | 出来高、ビッドアスクスプレッド | 流動性の低い銘柄を除外 |
| カウンターパーティリスク | 取引所信頼性スコア | 分散取引 |
| 集中リスク | ポートフォリオウェイト | 分散投資の強制 |
3つのリスク視点
リスク管理チームは3つの視点で議論を行います:
- Risky: 高報酬志向、積極的なポジション
- Neutral: リスク・リターンのバランス重視
- Safe: 保守的、資本保全優先
class RiskManager:
def evaluate_trade(self, trade_proposal: dict) -> dict:
"""取引提案のリスク評価"""
risk_assessment = {
"volatility_risk": self._assess_volatility(trade_proposal),
"liquidity_risk": self._assess_liquidity(trade_proposal),
"concentration_risk": self._assess_concentration(trade_proposal),
"overall_risk_score": 0.0,
"recommendation": ""
}
# 総合リスクスコア計算
risk_assessment["overall_risk_score"] = (
risk_assessment["volatility_risk"] * 0.4 +
risk_assessment["liquidity_risk"] * 0.3 +
risk_assessment["concentration_risk"] * 0.3
)
# 推奨判定
if risk_assessment["overall_risk_score"] > 0.7:
risk_assessment["recommendation"] = "REJECT"
elif risk_assessment["overall_risk_score"] > 0.4:
risk_assessment["recommendation"] = "REDUCE_SIZE"
else:
risk_assessment["recommendation"] = "APPROVE"
return risk_assessment
GPUなしでの動作要件とAPIコスト試算
動作要件
TradingAgentsはGPUなしで動作可能です。すべての推論はLLM API経由で実行されます。
| 要件 | 推奨スペック |
|---|---|
| CPU | 4コア以上 |
| メモリ | 8GB以上 |
| ストレージ | 10GB以上(ログ保存用) |
| ネットワーク | 安定したインターネット接続 |
| Python | 3.10以上 |
APIコスト試算
1取引判断あたり11 LLMコール + 20ツールコールが必要です。
| モデル | 用途 | コスト/1Kトークン | 1取引あたり推定コスト |
|---|---|---|---|
| GPT-4o-mini | 軽量タスク(データ収集) | $0.00015 | $0.15 |
| GPT-4o | 分析・議論 | $0.005 | $0.30 |
| o1-preview | 深層推論 | $0.015 | $0.50 |
| 合計 | — | — | $0.50-1.00 |
月間コスト試算:
- 100取引/月: $50-100
- 500取引/月: $250-500
- 高頻度(1000取引/月): $500-1,000
日本株市場への適用方法
kabuステーションAPI連携
日本株市場への適用には、kabuステーションAPI(au カブコム証券)との連携が有効です。
import requests
from typing import Optional
class KabuStationClient:
"""kabuステーションAPI クライアント"""
BASE_URL = "http://localhost:18080/kabusapi"
def __init__(self, api_password: str):
self.api_password = api_password
self.token: Optional[str] = None
def authenticate(self) -> str:
"""APIトークン取得"""
response = requests.post(
f"{self.BASE_URL}/token",
json={"APIPassword": self.api_password}
)
self.token = response.json()["Token"]
return self.token
def get_board(self, symbol: str, exchange: int = 1) -> dict:
"""板情報取得(exchange: 1=東証)"""
headers = {"X-API-KEY": self.token}
response = requests.get(
f"{self.BASE_URL}/board/{symbol}@{exchange}",
headers=headers
)
return response.json()
def send_order(
self,
symbol: str,
side: str, # "1"=売, "2"=買
qty: int,
price: float = 0, # 0=成行
order_type: int = 1 # 1=成行, 2=指値
) -> dict:
"""注文発注"""
headers = {"X-API-KEY": self.token}
order_data = {
"Symbol": symbol,
"Exchange": 1, # 東証
"Side": side,
"CashMargin": 1, # 現物
"DelivType": 2, # お預り金
"FrontOrderType": order_type,
"Qty": qty,
"Price": price if order_type == 2 else 0
}
response = requests.post(
f"{self.BASE_URL}/sendorder",
headers=headers,
json=order_data
)
return response.json()
TradingAgentsとの統合
class JapanStockTradingAgent:
"""日本株市場向けTradingAgents統合"""
def __init__(self, kabu_client: KabuStationClient):
self.kabu = kabu_client
self.fundamental_analyst = FundamentalAnalyst()
self.sentiment_analyst = SentimentAnalyst()
self.risk_manager = RiskManager()
async def analyze_and_trade(self, symbol: str) -> dict:
"""分析から取引実行まで"""
# 1. データ収集
board_data = self.kabu.get_board(symbol)
# 2. 各アナリストが分析
fundamental_report = await self.fundamental_analyst.analyze(
symbol=symbol,
data_source="edinet" # EDINET(有価証券報告書)
)
sentiment_report = await self.sentiment_analyst.analyze(
symbol=symbol,
sources=["twitter_jp", "kabutan", "minkabu"]
)
# 3. リスク評価
trade_proposal = self._generate_proposal(
fundamental_report, sentiment_report
)
risk_assessment = self.risk_manager.evaluate_trade(trade_proposal)
# 4. 取引実行(承認された場合)
if risk_assessment["recommendation"] == "APPROVE":
order_result = self.kabu.send_order(
symbol=symbol,
side=trade_proposal["side"],
qty=trade_proposal["qty"]
)
return {"status": "executed", "order": order_result}
return {"status": "rejected", "reason": risk_assessment}
バックテスト結果
2024年1-3月のパフォーマンス
TradingAgentsの論文では、2024年1-3月のテック株(AAPL、GOOGL、MSFT、NVDA等)でバックテストを実施しています。
| 指標 | TradingAgents | Buy & Hold | 差分 |
|---|---|---|---|
| 累積リターン (CR) | 23-26% | 17-20% | +6-24% |
| 年率リターン (ARR) | 25-30% | 20-25% | +5-10% |
| シャープレシオ (SR) | 5.6-8.2 | 2-3 | +3-5 |
| 最大ドローダウン (MDD) | 0.9-2.1% | 5-10% | -4-8% |
結果の解釈
- 高いシャープレシオ: 議論メカニズムによるリスク調整リターンの向上
- 低いMDD: リスク管理エージェントによるガードレールの効果
- 説明可能性: 自然言語ログで投資判断の根拠を確認可能
注意点
- バックテスト期間が短期間(3ヶ月)のため、実市場でのパフォーマンスは異なる可能性あり
- テック株中心のため、他セクターへの一般化には追加検証が必要
- APIコストは含まれていない
オープンソース代替: FinGPT
FinGPTはAI4Finance Foundationが開発する金融特化オープンソースLLMです。
| 項目 | TradingAgents | FinGPT |
|---|---|---|
| ライセンス | 論文公開 | MIT License |
| 金融特化度 | 高(取引シミュレーション) | 高(金融データ民主化) |
| 月間コスト | $50-100(API) | 無料-$20(オープンソース) |
| GitHubスター | 5,000+ | 10,000+ |
| マルチエージェント | ネイティブ対応 | 拡張が必要 |
FinGPTの活用
# FinGPTのインストール
git clone https://github.com/AI4Finance-Foundation/FinGPT.git
cd FinGPT
pip install -r requirements.txt
# センチメント分析の実行
python fingpt/sentiment/run_sentiment.py --model fingpt-sentiment
リスク要因
| リスク | 発生確率 | 影響度 | 緩和策 |
|---|---|---|---|
| LLMハルシネーション | 5-10% | 高 | 複数エージェントによるクロスチェック |
| API障害 | 1-2%/日 | 高 | フォールバックモデル設定 |
| 市場急変時の不安定性 | 中 | 高 | 議論ラウンド数の増加 |
| 規制リスク(日本) | 低 | 高 | 金融商品取引法の遵守確認 |
| APIコスト急増 | 中 | 中 | 月間上限設定 |
まとめ
TradingAgentsは、マルチエージェントLLMフレームワークとして以下の特徴を持ちます:
- 7エージェント構成: 実際のトレーディングファームを模倣した専門分業
- 議論メカニズム: Bullish/Bearishの対立的視点による多角的分析
- ガードレール設計: リスク管理エージェントによる損失抑制
- GPUなし動作: API経由で月$50-100のコストで運用可能
- 日本株対応: kabuステーションAPI連携で東証銘柄の自動取引が可能
バックテストでは高いシャープレシオと低いドローダウンを達成していますが、短期間のデータに基づく結果であり、実運用前には十分なペーパートレーディングと追加検証を推奨します。
参考文献
- TradingAgents: https://tradingagents-ai.github.io/
- arXiv論文: https://arxiv.org/abs/2412.20138
- FinGPT: https://github.com/AI4Finance-Foundation/FinGPT
- kabuステーションAPI: https://kabucom.github.io/kabusapi/
免責事項: 本記事は情報提供を目的としており、投資助言ではありません。実際の投資判断は自己責任で行ってください。バックテスト結果は過去のデータに基づくものであり、将来のパフォーマンスを保証するものではありません。