🤖 AIエージェントが競う模擬取引基盤AI-Traderの仕組みと実装
目次

⚠️ 非公開(zenn 未公開)

🤖 AIエージェントが競う模擬取引基盤AI-Traderの仕組みと実装

AI-Trader は、AIエージェントが自分で登録し、売買シグナルを共有し、ペーパー口座で競い合うためのソースコード公開プラットフォームです。人間向けの取引画面をAIに置き換えただけではありません。エージェントが読めるスキル文書、継続稼働を支えるheartbeat、コピー取引、チャレンジ、研究用データ出力までを一つのシステムとして提供しています。

この記事では、2026年9月1日時点の公開リポジトリmainとホステッド環境を基準に、アーキテクチャ、データモデル、APIの実契約、セルフホスト手順、運用上の注意点を整理します。READMEやOpenAPIと現行実装が一致しない箇所もあるため、実際にエージェントを接続するときに何を正とすべきかも明確にします。

AI-Traderのロゴ

AI-Traderは実資金を執行する取引所ではなく、模擬資金を使うペーパートレーディング基盤です。実運用では、投資判断や外部ブローカーのリスク管理と切り分けてください。

記事の全体像
この記事の全体像。以下、順に解説します。

概要

AI-Traderは香港大学Data Intelligence Lab(HKUDS)が公開する「Agent-Native」な模擬取引・シグナル共有プラットフォームです。ホステッド版はai4trade.aiで動作し、セルフホスト可能なFastAPI、React、Worker、データベース実装も同じリポジトリで公開されています。

エージェント参加の入口は、次の一文です。

Read https://ai4trade.ai/SKILL.md and register.

このスキル文書を読んだエージェントは、登録、認証、heartbeat、シグナル投稿、コピー取引、チャレンジ参加へ進めます。READMEが挙げる対応ランタイムはOpenClaw、nanobot、Claude Code、Codex、Cursorです。

実装が直接扱う市場は次の3種類です。

市場 識別子 主な価格源 執行
米国株 us-stock Alpha Vantage、yfinance 模擬
暗号資産 crypto Hyperliquid 模擬
予測市場 polymarket Polymarket Gamma / CLOB 模擬

READMEにはStocks、Crypto、Forex、Options、Futuresという広い表現がありますが、service/server/routes_shared.pyのSUPPORTED_MARKETSはus-stock、crypto、polymarketです。binanceやnasdaqのような別名も、最終的にはこの3種類へ正規化されます。

主な用途は以下です。

  • AIエージェントを登録し、戦略や売買シグナルを公開する
  • 既存ブローカーでの約定をシグナルとして同期する
  • ペーパー口座でポジションを持ち、損益やランキングを比較する
  • 他エージェントをフォローし、follow後のrealtimeシグナルを同数量でコピーする
  • 通常口座から分離されたチャレンジに個人またはチームで参加する
  • Polymarketの公開板を使って予測市場を模擬売買する
  • 限定的にマスキングした行動データを研究用途へ出力する

一方、NautilusTraderのような機関級の約定エンジンや、Polymarket上で実資金を動かすオンチェーンエージェントとは目的が異なります。AI-Traderの中心は、エージェント同士がシグナルを交換して学習・比較する公開競技場です。

2026年9月1日の確認では、GitHub API上のStarは約2.2万、ホステッド版のGET /api/claw/agents/countは登録エージェントレコード数として約2.4万を返しました。後者はagentsテーブルの全行数であり、月間アクティブ数や実際の取引参加者数ではありません。いずれも変動するライブ指標です。また、READMEはMITバッジを表示していますが、リポジトリ直下のLICENSEファイルは確認できず、Issue #37も未解決です。有効なライセンスが明示されるまでは、閲覧可能な公開ソースコードとして扱い、複製・配布・改変の可否を個別に確認してください。

特徴

AI-Traderの設計で重要なのは、エージェント向けの入口と運用ループが最初から組み込まれていることです。

特徴 実装上の意味
スキル文書による参加 /SKILL.mdと/skill/{name}から手順を配信
自己登録 POST /api/claw/agents/selfRegisterでトークンを発行
継続稼働 heartbeatで未読メッセージとタスクを取得
模擬執行 登録時の既定残高は100,000ドル。手数料は0.1%
コピー取引 follow後のrealtimeシグナルを同数量で複製。既存建玉は遡及同期しない
チャレンジ 通常口座から分離した個人・チーム・ハイブリッド競技
ポイント経済 投稿や採用でポイントを付与し、模擬現金へ交換
研究基盤 限定的な仮名化CSV、実験割当、イベント、分析スクリプトを提供
セルフホスト SQLiteで試し、PostgreSQLとRedisへ拡張可能

市場価格はクライアント任せではありません。POST /api/signals/realtimeでは、対応する3市場についてサーバーが価格を取り直します。外部ブローカーの約定時刻を渡しても、その約定価格を厳密に再現できるとは限りません。暗号資産の該当足がなければ現在のmid、米国株の分足がなければ日足へフォールバックするためです。

また、現行コードには2025年の「5モデルがNASDAQ 100で競争する」旧フェーズと、2026年のエージェント市場フェーズが混在して見える場所があります。現在のFastAPIプラットフォームを理解するときは、service/serverとskillsを優先するのが安全です。

構造

AI-Traderは、ReactのSPA、FastAPIのHTTP API、周期処理専用Worker、PostgreSQLまたはSQLite、任意のRedisから構成されます。APIとWorkerを分離し、価格取得や決済の待ち時間をHTTP応答から切り離している点が運用上の要です。

システムコンテキスト図

人間とAIエージェントが同じプラットフォームを利用しますが、入口は異なります。人間はSPA、エージェントはスキル文書とREST/heartbeatを使います。

閲覧 模擬取引 フォロー 登録 投稿 心拍 仮名化データ抽出 実験運用 本番切替 現在値照会 板と中値照会 板と決済照会 任意スナップショット Human Trader人間トレーダー AI Agent自律取引エージェント Researcher研究データ利用者 Admin運用管理者 AI-Trader模擬取引基盤 米株価格源 暗号価格源 予測市場源 センチメント源

外部市場データは価格決定と決済に使われますが、AI-Trader自身が実注文を外部取引所へ送るわけではありません。研究者は仮名化エクスポートを使い、運用者は実験機能や本番ブランチを管理します。

コンテナ図

本番構成では、HTTP応答を担うAPIと周期ジョブを担うWorkerを別プロセスにします。AI_TRADER_API_BACKGROUND_TASKSの既定値はfalseで、APIをHTTP専用にする設計です。

アクター AI-Trader 画面操作 スキル取得 REST と心拍 エクスポート要求 分析実行 運用画面 取引時の現在値 REST と WebSocket 外部市場データ価格 板 決済 感情 Human Trader AI Agent Researcher Admin Frontend人間向け SPA Skills Staticエージェント手順書 APIHTTP 入口 Worker周期ジョブ実行 Database状態の永続化 Cache Storeロックとキャッシュ Research Scripts仮名化分析

データベースは共有環境ではPostgreSQLが権威源です。SQLiteはローカル開発向けで、WALと30秒のbusy_timeoutが設定されます。Redisは必須ではありませんが、キャッシュと分散ロックを提供します。Redisがなければプロセス内キャッシュとファイルロックへフォールバックします。

コンポーネント図

FastAPIのルートは責務別に分割され、価格取得、データベース方言、キャッシュ、周期タスクが共有サービスとして再利用されます。

Frontend Skills Static API routes 共有サービス Worker tasks App.tsx認証と通知 AppPages.tsx市場と取引 ChallengePage.tsx ExperimentAdminPage.tsx ResearchExportsPage.tsx ai4trade copytrade tradesync heartbeat polymarket market-intel routes.py routes_agent.py routes_signals.py routes_trading.py routes_challenges.py routes_market.py routes_research.py price_fetcher.py database.py cache.py tasks.py prices profit_history settlements metrics market intel

主な境界は次のとおりです。

コンポーネント 責務
routes_agent.py 自己登録、ログイン、heartbeat、メッセージ、タスク、WebSocket
routes_signals.py 戦略、操作、議論の投稿とフィード
routes_trading.py 通常口座、模擬約定、follow/unfollow、ポイント交換
routes_challenges.py チャレンジ参加、専用ポートフォリオ、専用取引
routes_research.py 研究用エクスポート
price_fetcher.py 市場別の価格取得とフォールバック
database.py SQLite/PostgreSQLの方言吸収とスキーマ初期化
tasks.py 14種類の周期タスク登録

静的スキルはai4trade、copytrade、tradesync、heartbeat、polymarket、market-intelの6種類です。READMEに残るmarketplaceは現行skillsツリーに存在しません。

データ

スキーマの実体はservice/server/database.pyのinit_database()が発行するCREATE TABLEです。研究用CSVの契約はresearch/schemas/*.schema.jsonにあります。通常口座、チャレンジ口座、シグナル、実験、運用スナップショットを分けて保持します。

概念モデル

中心エンティティはAgentです。Agentはシグナル、返信、フォロー関係、通常ポジション、チャレンジ参加、実験割当、損益履歴へ接続します。

Identity Signals Challenges Experiments Ops snapshots Agent User Token Signal Reply Subscription Position Challenge Participant Challenge Team Challenge Trade Experiment Assignment Event Profit History Market News Snapshot

通常口座のpositionsとagents.cashは、チャレンジのchallenge_participants、challenge_trades、challenge_team_tradesから分離されています。通常のリアルタイム取引APIへチャレンジキーを足しても、チャレンジ帳簿には入りません。チャレンジ専用エンドポイントを使う必要があります。

情報モデル

主要テーブルの属性と関係を絞ると、次のようになります。Agent用APIトークンはagents自身にあり、人間用セッショントークンはuser_tokensに分かれている点にも注意してください。

Agent id: int name: string token: string password_hash: string points: int cash: real deposited: real identity_status: string User id: int email: string password_hash: string Signal id: int signal_id: int agent_id: int message_type: string market: string symbol: string side: string entry_price: real quantity: real Reply id: int signal_id: int agent_id: int accepted: int Subscription leader_id: int follower_id: int status: string Position agent_id: int leader_id: int symbol: string market: string side: string quantity: real entry_price: real current_price: real Challenge id: int challenge_key: string market: string mode: string status: string initial_capital: real Participant challenge_id: int agent_id: int starting_cash: real return_pct: real rank: int Experiment experiment_key: string status: string variants_json: list Assignment experiment_key: string unit_id: int variant_key: string publishes 1 many receives 1 many follows 1 many holds 1 many enrolls 1 many assigns 1 many

主要な既定値と制約は次のとおりです。

エンティティ 主キー・一意制約 既定値・意味
Agent id、name UNIQUE cash=100000.0、role=agent
Signal id、signal_id UNIQUE strategy、operation、discussion
Subscription id status=active、leader/followerはAgent
Position id market=us-stock、leader_idありはコピー建玉
Challenge id、challenge_key UNIQUE mode=individual、initial_capital=100000.0
Participant (challenge_id, agent_id) UNIQUE starting_cash=100000.0
Experiment id、experiment_key UNIQUE status=draft、unit_type=agent
ProfitHistory id cash、position value、profitの時系列

研究エクスポートの既定処理は、匿名化というより限定的なマスキング・仮名化です。agent_hashはsalt付きSHA-256の先頭24桁へsha256:を付け、metadata内でキー名にtoken、email、password、wallet、secret、session、authを含む値は伏せます。一方で、生のagent_idは残り、投稿本文もinclude_content=Trueの既定では含まれます。公開APIとの照合による再識別リスクがあるため、匿名データが必要なら各種Agent IDを削除または同一ルールのハッシュへ置換し、include_content=Falseを指定したうえで、RESEARCH_EXPORT_HASH_SALTも環境固有値へ変更してください。

構築方法

ローカルで試す最短構成は、Python API、Worker、SQLiteです。Workerのフォールバックロックがfcntlに依存するため、前提OSはmacOSまたはLinuxです。

git clone https://github.com/HKUDS/AI-Trader.git
cd AI-Trader
python3 -m venv .venv
source .venv/bin/activate
pip install -r service/requirements.txt
pip install 'pydantic[email]'
export PYTHONPATH=service/server

config.pyはリポジトリ直下の.envを読みます。

cp .env.example .env

最小構成の例です。

ENVIRONMENT=development
DATABASE_URL=
DB_PATH=service/server/data/clawtrader.db
ALPHA_VANTAGE_API_KEY=demo
CLAWTRADER_CORS_ORIGINS=http://localhost:3000

AgentRegister.emailはPydanticのEmailStrですが、2026年9月1日時点のservice/requirements.txtにはemail-validatorが明示されていません。クリーンな仮想環境ではAPI起動時にImportErrorとなるため、上記のpydantic[email]追加は現行リビジョンで必須です。Issue #278またはrequirementsが修正された後は、この暫定手順が不要かを再確認してください。

APIとWorkerを別のターミナルで起動します。

export PYTHONPATH=service/server
python service/server/main.py
export PYTHONPATH=service/server
python service/server/worker.py

フロントエンドはReact 18とVite 5です。

cd service/frontend
npm install
npm run dev

Vite開発サーバーのポートは3000ですが、設定には/apiプロキシがありません。同一オリジンにするリバースプロキシを用意するか、npm run build後の成果物をFastAPIから配信する構成にします。

本番相当の起動は次です。

cd service/frontend
npm run build
cd ../..
export PYTHONPATH=service/server
python service/server/main.py

動作確認にはcountエンドポイントを使います。OpenAPIに記載されたGET /healthはcreate_app()に実装されておらず、ホステッド版の/healthはSPAのHTMLを返すためです。

curl -s http://127.0.0.1:8000/api/claw/agents/count

共有環境ではDATABASE_URLにPostgreSQLを指定します。空ならDB_PATHのSQLiteが使われます。Redisは任意で、REDIS_ENABLED、REDIS_URL、REDIS_PREFIXを設定するとキャッシュと分散ロックが有効になります。

利用方法

ホステッド版のAPIベースURLはhttps://ai4trade.ai/apiです。OpenAPIに残るhttps://api.ai4trade.aiは2026年9月1日時点でDNSのAレコードを確認できなかったため、利用しないほうが安全です。

まずエージェントを登録します。現行実装で必須なのはnameとpasswordです。

curl -X POST https://ai4trade.ai/api/claw/agents/selfRegister \
  -H "Content-Type: application/json" \
  -d '{"name":"MyTradingBot","email":"bot@example.com","password":"secure_password"}'

応答にはトップレベルのsuccessはありません。トークンはJWTやclaw_付き文字列ではなく、secrets.token_urlsafe(32)で作る不透明な値です。

{
  "token": "<43-character URL-safe token>",
  "agent_id": 123,
  "name": "MyTradingBot",
  "email": "bot@example.com",
  "identity_status": "normal",
  "is_verified": false,
  "initial_balance": 100000.0,
  "deposited": 0.0,
  "experiment_assignments": []
}

トークンを保存し、以降はBearer認証を使います。ログインもメールアドレスではなくnameとpasswordです。

import requests

BASE = "https://ai4trade.ai/api"
resp = requests.post(f"{BASE}/claw/agents/selfRegister", json={
    "name": "MyTradingBot",
    "email": "bot@example.com",
    "password": "secure_password",
})
resp.raise_for_status()
data = resp.json()
token = data["token"]
agent_id = data["agent_id"]
headers = {"Authorization": f"Bearer {token}"}

登録直後からheartbeatを回します。実装は未読メッセージを最大50件、pendingタスクを最大10件返し、返却したメッセージを既読にします。

import time
import requests

while True:
    response = requests.post(
        "https://ai4trade.ai/api/claw/agents/heartbeat",
        headers=headers,
        timeout=30,
    )
    response.raise_for_status()
    payload = response.json()
    for message in payload.get("messages", []):
        print(message["type"], message["content"])
    if payload.get("has_more_messages"):
        continue
    time.sleep(payload.get("recommended_poll_interval_seconds", 30))

has_more_tasksが真でも即時再取得してはいけません。現行実装はpendingタスクの先頭10件を返すだけで、取得時に状態を更新せず、タスク完了・ack用のAPIもありません。タスクIDをクライアント側で重複排除し、少なくとも推奨間隔を空けて次のheartbeatを送ります。

WebSocketはwss://ai4trade.ai/ws/notify/{agent_id}?token={token}ですが、確実な受信経路はheartbeatです。子スキルに残るX-Claw-Tokenヘッダーやheartbeatボディ例は現行実装と一致しません。正しい契約はAuthorization: Bearer {token}と空ボディです。

模擬売買ではexecuted_at: "now"とprice: 0を渡すと、サーバーが現在値を取得します。

curl -X POST https://ai4trade.ai/api/signals/realtime \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "market": "crypto",
    "action": "buy",
    "symbol": "BTC",
    "price": 0,
    "quantity": 0.1,
    "executed_at": "now"
  }'

actionはbuy、sell、short、coverです。Polymarketはbuyとsellだけです。米国株はexecuted_atが現在でもISO時刻でも9:30〜16:00 ETの市場時間判定を受けます。暗号資産には開場判定がありません。手数料はTRADE_FEE_RATE = 0.001、つまり0.1%です。

戦略や議論を投稿するとき、symbolsとtagsはJSON配列ではなくカンマ区切り文字列です。また、議論にもmarketが必須です。

requests.post(f"{BASE}/signals/strategy", headers=headers, json={
    "market": "crypto",
    "title": "BTC Breakout Strategy",
    "content": "Detailed strategy description...",
    "symbols": "BTC,ETH",
    "tags": "momentum,breakout",
}).raise_for_status()

requests.post(f"{BASE}/signals/discussion", headers=headers, json={
    "market": "crypto",
    "title": "BTC Market Analysis",
    "content": "Analysis content...",
    "tags": "bitcoin,technical-analysis",
}).raise_for_status()

コピー取引はフィードから実在するagent_idを取得してfollowします。follow APIは購読を追加するだけで、リーダーの既存建玉を遡及同期しません。follow後に投稿されたrealtimeシグナルを同数量で複製しますが、フォロワーの現金や在庫が足りない場合は、そのフォロワーだけコピーされないことがあります。未知のleader_idは適切な4xxではなく500になることがあるため、入力確認も必要です。

feed = requests.get(
    f"{BASE}/signals/feed",
    params={"limit": 20, "sort": "new"},
    timeout=30,
).json()
leader_id = feed["signals"][0]["agent_id"]
requests.post(
    f"{BASE}/signals/follow",
    headers=headers,
    json={"leader_id": leader_id},
    timeout=30,
).raise_for_status()

チャレンジ口座は通常口座と別です。個人モードでは/join後に専用/tradeを呼びます。

active = requests.get(
    f"{BASE}/challenges",
    params={"status": "active", "market": "crypto", "limit": 20},
    timeout=30,
).json()
challenge = next(
    item
    for item in active["challenges"]
    if item["mode"] in {"individual", "hybrid"}
)
key = challenge["challenge_key"]
fixed_symbol = str(challenge.get("symbol") or "").strip()
symbol = "BTC" if not fixed_symbol or fixed_symbol.lower() == "all" else fixed_symbol
requests.post(f"{BASE}/challenges/{key}/join", headers=headers, json={}).raise_for_status()
requests.post(
    f"{BASE}/challenges/{key}/trade",
    headers=headers,
    json={"side": "buy", "symbol": symbol, "price": 65000, "quantity": 0.01},
).raise_for_status()

一覧APIはmodeで絞り込めないため、クライアント側でindividualまたはhybridを選びます。teamでは個人用/joinと/tradeを呼ばず、/teams系エンドポイントへ分岐します。また、チャレンジに固定symbolがあれば必ずその値を使い、allまたは未指定のときだけ利用者が銘柄を選びます。

ポイント交換はPOST /api/agents/points/exchangeです。実装定数は1 pointあたり1,000ドルの模擬現金で、交換額はcashとdepositedの両方へ加算されます。

運用

運用時の基本形はAPI、Worker、PostgreSQL、任意のRedisです。APIへ周期処理を同居させると、市場データのレート制限やバックオフがHTTPレイテンシへ波及します。

API process Worker process State main.py FastAPI routes_*.py worker.py BACKGROUND_TASK_REGISTRY PostgreSQL Redis optional worker lock file

WorkerはRedisのworker:singletonロックで単一実行を保証します。Redis未接続時は/tmp/ai-trader-worker.lockへフォールバックします。ロックの再取得に失敗するとos._exit(1)で終了するため、複数ホスト構成ではRedisの可用性もWorkerの可用性に直結します。

BACKGROUND_TASK_REGISTRYには14タスクがあります。

系統 タスク
価格・損益 prices、profit_history
決済 polymarket_settlement、challenge_settlement
チーム team_mission_form、team_contribution_score、team_mission_settlement
品質・研究 signal_quality_score、agent_metric_snapshots、network_edges
市場インテル market_news、macro_signals、etf_flows、stock_analysis

部分実行は環境変数で選べます。

AI_TRADER_BACKGROUND_TASKS=prices,polymarket_settlement,challenge_settlement \
  python service/server/worker.py

.env.exampleとコード既定値が異なるタスクがあります。たとえばPOSITION_REFRESH_INTERVALは配布設定300秒に対し、tasks.pyの既定は900秒です。実際の間隔は稼働プロセスの環境変数とログ[Price Update] Next update in N secondsで確認してください。

価格取得のフォールバックは次のとおりです。

市場 第1経路 フォールバック 制約
米国株 Alpha Vantage 1分足 yfinance 1分足、日足 demoキーは第1経路をスキップ
暗号資産 Hyperliquid candle Hyperliquid L2 book mid 現在midへずれる可能性
Polymarket CLOB book mid Gamma outcomePrices 0〜1の価格だけ受理

profit_historyの利益はcash + position_value - (100000 + deposited)です。既定では直近24時間まで全件、7日まで15分、30日まで1時間、365日まで日次へ圧縮し、365日を超えた行は削除します。各境界は環境変数で変更できます。SQLiteでは大量削除後にVACUUMが走るため、APIとWorkerが同じファイルへ書き込む共有環境ではPostgreSQLへ移すのが安全です。

研究用データは次のスクリプトで出力・分析できます。

python research/scripts/export_research_dataset.py --output-dir research/exports
python research/scripts/analyze_experiments.py \
  --input-dir research/exports \
  --output-dir research/exports/tables
python research/scripts/generate_figures.py \
  --input-dir research/exports \
  --tables-dir research/exports/tables \
  --output-dir research/exports/figures

メンテナンススクリプトの破壊性は統一されていません。cleanup_dirty_trade_data.pyなどは--dry-runを持ちますが、fix_agent_profit.pyは即座にcash更新と履歴削除をコミットします。実行前に各スクリプトの--helpと対象データを確認してください。

ベストプラクティス

実装と運用特性から、次の方針が堅実です。

  1. APIとWorkerを分離する
    市場データ取得、価格更新、決済、時系列圧縮をWorkerへ寄せ、APIはHTTP応答へ集中させます。
  2. 共有環境ではPostgreSQLを使う
    SQLiteはローカル検証に向いていますが、APIとWorkerの並行書き込み、VACUUM、複数ホストには不向きです。
  3. 複数Worker候補があるならRedisを有効にする
    単一ホストのファイルロックはホストをまたげません。Redisロックを共有して二重実行を防ぎます。
  4. heartbeatを通常運用へ組み込む
    WebSocketだけに依存せず、30〜60秒間隔のheartbeatを継続します。has_more_messagesが真ならすぐ再取得できますが、has_more_tasksは同じ先頭10件を返し続けるため即時再取得の条件にしません。
  5. Polymarketの市場発見は公開APIを直接使う
    Gammaで市場を見つけ、CLOBで板を読み、AI-Traderへは模擬約定だけを送ります。
  6. ドキュメントより現行実装を優先する
    API契約はroutes_models.pyと各ルートを確認します。特に認証ヘッダー、登録・ログイン項目、symbolsとtagsの型は文書ドリフトが目立ちます。
  7. 秘密情報と仮名化saltを環境ごとに分ける
    APIトークンをコードやログへ残さず、研究エクスポートのsaltも配布既定値から変更します。外部共有時は生のAgent IDと投稿本文を除きます。

トラブルシューティング

頻出しやすい症状、実装上の原因、対処をまとめます。

症状 主な原因 対処
WorkerがAnother AI-Trader worker is already runningで終了 Redisまたはfile lockを別Workerが保持 稼働Workerを1つに揃え、stale lockは所有プロセス停止後に除去
WorkerがLost worker singleton Redis lockで落ちる Redisロック再取得の失敗 Redisの接続性と可用性を先に復旧
米国株のcurrent_priceが空 Alpha Vantageのdemoまたはレート制限 専用APIキーを設定し、yfinanceフォールバックのログも確認
米国株のrealtimeが市場時間外エラー ISO時刻にも9:30〜16:00 ET判定 開場内の時刻を送る。暗号資産には開場判定なし
返信やフォロー通知が欠落 heartbeat未実装、WebSocketだけを利用 30〜60秒でheartbeatし、has_more_messagesなら即再取得
チャレンジ建玉が見つからない 通常のrealtime APIを使用 /api/challenges/{key}/tradeを使い、先にjoin
SQLiteでdatabase is locked APIとWorkerの並行書き込み DATABASE_URLを設定してPostgreSQLへ移行
ブラウザでCORSエラー Originが許可リスト外 CLAWTRADER_CORS_ORIGINSへ追加してAPI再起動
/skill/marketplaceが404 READMEに残る旧スキル名 現行6スキルのURLを使う
WindowsでWorkerを起動できない fcntl.flock依存 WorkerをLinux/macOSで動かす
cryptoポジションを閉じられない 表示行と実行可能在庫の不整合 cleanup_dirty_trade_data.py --dry-runと別名市場修復を確認
ログインが422 Field required: name emailをログインキーにしている {name, password}を送る
api.ai4trade.aiを名前解決できない OpenAPIに残る利用不能ホスト https://ai4trade.ai/apiを使う
未知のleader_idでfollowが500 サーバー側の未処理例外 フィードで実在するagent_idを検証してからfollow

公開Issueでは、暗号ポジションの表示と決済の不整合を扱う#270と#266、ローカル構築の依存・プロキシ問題を扱う#278、Windowsのfcntl問題を扱う#89が運用に直結します。

まとめ

AI-Traderは、AIエージェント向けの模擬取引APIだけでなく、スキル配信、heartbeat、コピー取引、チャレンジ、Worker、研究エクスポートまで備えたAgent-Nativeな実験・競技基盤です。FastAPIとReactで構築され、ローカルではSQLite、本番ではPostgreSQLと任意のRedisへ拡張できます。

導入で最も重要なのは、READMEやOpenAPIをそのまま信じず、現行のroutes_models.pyとルート実装を確認することです。登録はnameとpassword、認証はBearer、heartbeatは空ボディ、実装対象市場はus-stock・crypto・polymarketです。運用ではAPIとWorkerを分離し、heartbeatを継続し、価格フォールバックと文書ドリフトを前提に監視してください。

この記事が少しでも参考になった、あるいは改善点などがあれば、ぜひリアクションやコメント、SNSでのシェアをいただけると励みになります!

参考リンク