もともと https://nousergon.ai/blog/posts/multi-agent-research/ に掲載
Post 1 では、Nous Ergon — 自律的にトレードを行うシステム — を紹介しました。このシステムは、知能を4つのレイヤーに分割しています。研究判断のための LLM エージェント、パターン認識のための ML、執行のための決定論的ルール、そしてシステム全体の学習のためのバックテスターです。この投稿では、LLM が最前線でハードに働くレイヤーである「Research(研究)」モジュールの中身を掘り下げます。
週末の稼働がどんな感じになるか
週末に AWS Lambda が起動します。S&P 500 と S&P 400(およそ 900 の米国の中〜大型株)をロードし、加えて最近の価格履歴も取り込みます。そしてそれらを、6つのセクターに特化したチームへ分配し、並行して実行させます。各チームは、自分たちのセクターにおける最良の機会をスクリーニングし、分析し、議論します。CIO エージェントは、すべてのチームからの上位候補を評価し、どの銘柄をポートフォリオに入れる/出すかを決定します。
このパイプラインは、システムの残り部分 — Predictor、Executor、Backtester — が消費するための単一の signals.json ファイルを S3 に書き込みます。月曜の朝に市場が開くまでに、その週の研究は完了しています。
この投稿では、このプロセスがどのように動くのかを説明します。
ファネル:900 → 約25
ユニバースを絞り込む単一のボトルネック・フィルターはありません。代わりに、約900銘柄は、GICS のセクター分類(Technology、Healthcare、Financials、Industrials、Consumer、Defensives)に基づいて6つのセクターチームへ分配されます。各チームは、セクター全体の割り当て(通常 100〜200 銘柄)を受け取り、独自にスクリーニングを実行します。
各チームの中では、プロセスは4段階のパイプラインに従います。
1. Quant Analyst — スクリーニングツールにアクセスできる ReAct エージェントです。具体的には、出来高フィルター、テクニカル指標、アナリストコンセンサス、貸借対照表比率、価格パフォーマンス、オプションフローなどです。クオンツは、セクターのティッカー全リストを受け取り、自律的に「どのツールを呼ぶべきか」「どの指標を優先すべきか」「約150の候補からトップ10へどう絞るか」を判断します。各セクターチームには、重点指標がパラメータとして設定されています。たとえばテクノロジーチームは「売上成長」や「R&D の強度」といった手がかりが見えており、金融チームは「ROE」や「ネット・インタレスト・マージン」を見る一方で、エージェント自身が最終的にスクリーニング戦略を決めます。
2. Qual Analyst — こちらも ReAct エージェントで、クオンツの上位候補を、より深い定性ツールでレビューします。最近のニュース、インサイダー取引、機関投資家の蓄積(積み増し)、RAG による SEC ファイリング検索、そして過去のシグナル失敗からの学びです。クオールアナリストは、ナラティブ(物語)の層を追加します。つまり「なぜこの銘柄か」「なぜ今なのか」「何がうまくいかない可能性があるのか」です。
3. Peer Review — クオンツとクオールが協力して、最終的な推奨を 2〜3 件に合意します。それぞれについて、強気の見立て(bull case)、弱気の見立て(bear case)、具体的な触媒(キャタリスト)、および確信度(conviction level)が裏付けられます。
4. CIO Evaluation — 6つのチームは並行して動き、合計 12〜18 件の推奨を生成します。CIO エージェント(Sonnet を1回呼び出すだけで実行)は、それらを4つの次元でまとめて評価します。チームの確信度、マクロとの整合性、ポートフォリオとの適合性、そして触媒の具体性です。CIO は、ポートフォリオの継続性を維持するために過去の判断を読み込みます。つまり毎週ゼロから新しいポートフォリオを組むのではなく、(通常2〜10件の)不人気なポジションを少数だけ入れ替え、投資委員会のレビューで最も強い新規候補と置き換えます。
その結果、約25銘柄のポートフォリオが得られます。セクターのバランスがとれていて、論拠(thesis)が裏付けられており、毎週更新されます。
以下は、クオンツアナリストのツールが実際にどんなものかの例です。LangChain の @tool で、ReAct エージェントが上位候補のために貸借対照表データが必要になったときに呼び出します:
@tool
def get_balance_sheet(tickers: list[str]) -> str:
"""Get balance sheet metrics: debt/equity, current ratio, PE, revenue growth, gross margins."""
import yfinance as yf
results = {}
for t in tickers[:20]:
info = yf.Ticker(t).info
results[t] = {
"debt_to_equity": info.get("debtToEquity"),
"current_ratio": info.get("currentRatio"),
"pe_ratio": info.get("trailingPE"),
"forward_pe": info.get("forwardPE"),
"revenue_growth": info.get("revenueGrowth"),
"gross_margins": info.get("grossMargins"),
}
return json.dumps(results)
エージェントは、自身のセクター・サブセットにあるティッカーのリストを受け取って順に処理します。通常は、最初の出来高およびモメンタムのスクリーニング後の有望候補です。エージェントはツールのドックストリングを確認し、貸借対照表データが分析に関係するのはいつかを判断します。価値スクリーニングのために get_balance_sheet を呼び出す場合もあれば、モメンタム確認のために get_technical_indicators を呼び出す場合もあります——推論ループがシーケンスを駆動し、ハードコードされたロジックではありません。(現在は、これらのツールは実行のたびに yfinance からデータをライブ取得しています。長期的には、予測器の特徴量ストアから読み取る計画です。そこでは、同じようなファンダメンタルおよびテクニカル指標がすでに事前に計算されているため、より高速で信頼性が高くなり、パイプライン中のレート制限を回避できます。)
なぜセクター・チームなのか?
FDAの判断を待っているバイオテクノロジーと、安定した規制収益を持つ公益事業(ユーティリティ)を比較するのは、りんごとオレンジを比べるような問題です。重要になる指標、株価を動かす触媒、注視すべきリスクは、本質的にまったく異なります。単一の汎用的なプロンプトでは、これらすべてをうまく評価できません。
セクター・チームは、この問題を 同一の ピア・グループ内で比較することで解決します。ヘルスケアチームは、創薬パイプラインを創薬パイプラインと比較します。金融チームは、クレジット・ポートフォリオをクレジット・ポートフォリオと比較します。各チームのプロンプトは、セクター固有の注目指標でパラメータ化されています。テクノロジーのクオンツは売上成長とR&D(研究開発)集約度に寄せられ、ディフェンシブのクオンツは配当利回りと支払いの安定性に寄せられます。株式が本当の同業相手と照らし合わされて評価されれば、ランキングはより意味のあるものになり、触媒もより具体的になります。
重要な注意点があります。私は意図した動作を説明しています。各セクターのクオンツが実際に異なるツールや指標を使っているか——そしてその差別化がより良い推奨につながっているか——は、実証的な問いです。このシステムは、LangSmithトレースを通じて、エージェントごとのすべてのツール呼び出しと反復回数を記録しています。つまり、私はそれに答えるのに必要なデータを蓄積しています。データセットが成長すれば、テクノロジーのクオンツがファイナンシャルのクオンツよりも本当に get_balance_sheet を呼び出す頻度が低いのか、あるいはセクター固有のパラメータ化があるにもかかわらずエージェントの挙動がセクター間で収束しているのかを分析できるようになります。この種のエージェント的な評価は、調査対象として計画されています。
ReActエージェントとツール・エコシステム
定性分析のアナリストは、単に事前に取得されたデータを読んでいるわけではありません。彼らはReActエージェントであり、必要な情報を推論し、それを得るためにツールを呼び出します。各エージェントにはいくつかのツールが用意されています:
| ツール | データソース | 提供するもの |
|---|---|---|
| ニュース記事 | Yahoo Finance RSS | 最近の報道からの見出し、センチメント、触媒 |
| アナリストのコンセンサス | FMP API | レーティング、目標株価、決算のサプライズ |
| インサイダーの活動 | SEC EDGAR Form 4 | クラスタ買い/売り、ネット・センチメント |
| SEC提出書類 | SEC EDGAR | 8-Kのイベント提出 |
| 過去の投資仮説 | SQLiteアーカイブ | 先週の強気/弱気の論拠(継続性のため) |
| オプションのフロー | yfinance | プット/コール比率、IVランク、予想変動(expected move) |
| 機関投資家の活動 | SEC EDGAR 13F | ファンドの蓄積/分配 |
| 提出書類の検索(RAG) | Neon pgvector | 10-K/10-Qの全文に対するセマンティック検索 |
| 教訓(エピソード記憶) | SQLite | 過去のシグナル失敗と抽出された教訓 |
最後の2つのツールは、もう少し深く説明する価値があります——これらは、エージェントが時間とともに蓄積していく、2種類の異なる形の永続的な知識を表しています。
RAG:SEC提出書類の検索
query_filings ツールは、ベクトルデータベースに埋め込みチャンクとして保存された何百ものSEC提出書類を検索するために、リトリーバル拡張生成(RAG)を使用します。エージェントが「メモリ・セミコンダクター市場における競争上のリスクは何ですか?」と尋ねると、管理側が署名して承認した“要約”ではなく、マイクロンの最新10-Qにある実際の「リスク要因」の文章が返ってきます。
ここでRAGが、ヘッドライン以上の深みを加えます。アナリストのコンセンサス・レポートは目標株価が$150であると教えてくれます。10-Kの「リスク要因」セクションは、その目標がなぜ間違っている可能性があるのか——管理が開示した競争上の脅威、彼らが切り抜けようとしている規制リスク、さらされている顧客集中——を示します。定性分析のエージェントは、必要に応じてこの文脈を検索でき、ReActループの中の単なる別のツールであるため、自然に統合されます。
内部では、RAGのリトリーバルはメタデータでフィルタしたベクトル類似度検索です。クエリはVoyageで埋め込まれ、ティッカーと文書タイプでフィルタされ、その後、何千もの提出書類チャンクに対するHNSW(Hierarchical Navigable Small World)インデックス上でコサイン類似度により順位付けされます。エージェントは、出所メタデータ(提出書類の種類、日付、セクションラベル)付きで、最も関連性の高い抜粋を受け取ります。
RAGが利用できない場合(データベースが停止している、埋め込みサービスに到達できないなど)、エージェントは他のツールで進めます。新しい機能は“加法的”です——決してパイプラインを止めません。
エージェントのメモリ:間違いから学ぶ
メモリシステムにより、エージェントは過去のパフォーマンスから蓄積された知識にアクセスできます。
エピソード記憶は、過去のシグナル失敗から得た教訓を保存します。リサーチモジュールは、生成するすべてのBUYシグナルの結果を追跡します。具体的には、各シグナルが10日間のウィンドウ(リサーチデータベース内のscore_performanceテーブル経由)でS&P 500を上回ったかどうかです。アンダーパフォームしたシグナルについては、システムがLLM呼び出しを用いて、構造化された教訓を抽出します——その仮説は何だったのか、市場環境はどうだったのか(レジーム、VIX水準)、そして次回は何を見ておくべきかです。定性分析のアナリストが銘柄を評価するとき、そのティッカーに対する過去の教訓を取得するために get_lessons を呼び出せます。例えば、3か月前にデータセンター需要の上昇を背景にSMCIを推奨していたのに、会計上の懸念で株が崩れたのであれば、定性分析のアナリストは現在の推奨を行う前に、その文脈を目にします。
ツールベースのエピソード記憶に加えて、システムはセマンティックな観測も蓄積します——セクターの力学やマクロの推論に関する、エージェント間の洞察です。各実行の後、システムはセクターチームのレポート、マクロ分析、CIOの意思決定からテーマ的なパターンを抽出します。「セミコンダクター株がメモリからAIアクセラレータへローテーションしている」や「CIOが金利感応度のために公益事業をアンダーウェイトにしている」といった観測です。これらの観測は、その後の実行における定性分析のアナリスト向けのコンテキストとして読み込まれ、前週までの他チームの分析から生まれたパターンへの気づきを与えます。繰り返される観測は強化され、重複して作り直されないため、永続的なテーマは自然に重要度を増していきます。
両方のメモリタイプはSQLiteに保存され、時間とともに蓄積されます。エピソード記憶は、システムが特定の過ちを繰り返さないことを教え、セマンティックな観測は、繰り返し現れるパターンを見分けるのに役立ちます。
生きた投資仮説と重要なトリガー
エージェントは毎週ゼロから始めません。母集団に含まれる各銘柄について、システムは“生きた”投資仮説を維持します。これは、強気シナリオ、弱気シナリオ、主要な触媒、リスク要因、確信度レベルをカバーする構造化ドキュメントです。
返却形式: {"translated": "翻訳されたHTML"}毎週、エージェントには事前に作成された論文(thesis)が渡されますが、だからといってそれを無条件に書き換えるわけではありません。論文の更新が引き起こされるのは、何か重大な変化があったときだけです。たとえば重要なニュースイベント、株式の平均真の値幅(ATR)を2倍以上上回る価格変動、アナリストの格付けの修正、決算が近づいていること、インサイダーのクラスタ活動、そしてセクターのマクロ体制(regime)の変化です。重大な変化がなければ、論文はそのまま保持されます。これは、LLMが「書くように頼まれたから」という理由で、完璧に良い論文を無駄に作り直してしまい、過去数週間で蓄積されてきたニュアンスを失いかねない、ステートレスな振る舞いを防ぎます。
確信度(conviction)のトラッキングは、論文そのものの勢いを捉えます。強気(bull case)が持続的に強まっている銘柄は「上昇(rising)」の確信度になり、リスクが積み上がっている銘柄は「低下(declining)」の確信度になります。これらのシグナルは、そのまま下流のポジションサイズ調整に反映されます。Executorは、上昇の確信度にはより大きなポジションを与え、低下の確信度にはより小さなポジションを与えます。
すべての論文はS3とSQLiteにアーカイブされ、システムが各銘柄について「いつ」「何を」信じていたのかという履歴が残されます。
観測可能性:パイプラインの検証
6つのチームが並行して動き、マクロエージェント、イグジット評価者、そしてCIOがそれぞれ自律的に実行していると、問題が静かに起きる可能性があります。セクターチームが推奨を作れないかもしれません。マクロエージェントが前回レポートを読み込めないかもしれません。ノードが順序どおりに実行されないかもしれません。
こうした問題を検知するために、システムはLangSmithを使って、パイプラインの実行後に毎回、軌跡(trajectory)のバリデーションを行います。バリデータは、必要なすべてのノードが発火したか(6つのセクターチーム、マクロ、CIO、コンソリデータ)、それらが正しい順序で実行されたか、そしてグラフが正常に完了したかを確認します。現時点では失敗はCloudWatchにログ出力されており、より目立つ形での提示(Telegramアラートや朝のブリーフィングメールを通じた通知など)は今後の改善として計画されています。
これは、アルファを直接増やすわけではないものの、時間とともにアルファを蝕んでいく「静かな劣化」を防ぐための観測可能性への投資です。
まだ私が改善していること
これは進行中のプロジェクトであり、完成品ではありません。私が取り組んでいるいくつかの領域:
- RAGの有効性 — フォーリング(filing)検索のインフラは整備され、質の高いアナリスト(qual analysts)に接続されています。完全なSEC提出書類本文へのアクセスが、見出しやコンセンサスのデータだけの場合と比べて、より重大な(material)レベルで良い論文を生むのかどうかは、時間をかけて答えを出したい問いです。
- ドキュメントのカバレッジ — SECの10-K/10-Q提出書類を取り込みます。次の自然な情報源は決算説明会(earnings call)のトランスクリプトですが、トランスクリプトのデータパイプラインはまだ開発中です。
- メモリの蓄積 — エピソード(episodic)メモリとセマンティック(semantic)メモリの仕組みは新しいものです。レッスン(lesson)データベースが成長していくにつれて、エージェントが実際にメモリツールを効果的に使うのか、そしてレッスンがシグナルの質を改善するのかを見守ります。
- エージェント的(agentic)評価 — 私はツール呼び出しと、チームごとのエージェント反復(iterations)をログに記録しています。これが進むと、次のような問いに答えられるようになります。つまり、セクターチームは実際に異なる振る舞いをするのか?より多くのツールを使うエージェントは、より良いシグナルを生み出すのか?このためには時間が必要です。システムは、これらの評価が統計的に意味のあるものになるだけの十分なシグナル履歴を蓄積する必要があります。この種の独自(proprietary)データセットを構築することは、研究レイヤーの発展速度と、評価のされ方に対する自然な制約要因です。
- スコアリングのキャリブレーション — バックテスターは週次でスコアリングの重みを自動調整しますが、最適化が収束するには、より多くのサンプル履歴が必要です。
次に何をするか
リサーチモジュールは、何が魅力的かを特定します。このシリーズの次回投稿では、それらのシグナルに対してシステムの他の部分がどのように動くのかを取り上げます:
- ML予測 — LightGBMの特徴量エンジニアリング、セクター中立のラベリング(各銘柄を広い市場ではなく、そのセクターのETFと比較してベンチマークする)、そして拒否(veto)ゲート
- 自律型バックテスティング — システムが自分自身のシグナル品質をどう評価し、パラメータを自動調整するのか
- 実行(Execution) — アーダーブック(order book)、日中のテクニカルトリガー、そしてリスク管理
シグナルの全チェーン:リサーチは何が魅力的かを特定 → Predictorが短期のタイミングを検証 → Executorがポジションサイズを決めて実行 → Backtesterが何がうまくいったかを測定し、最適化されたパラメータを上流にフィードバックします。各モジュールはS3から読み込み、互いに独立して置き換え可能です。アーキテクチャは、他のコンポーネントに触れずに任意のコンポーネントを差し替えられるように設計されています。
Nous Ergonはオープンソースの自律型トレーディングシステムです。nousergon.aiをフォローするか、GitHubでコードを調べてみてください。




