はじめに(Why)
投資判断に必要なデータは、日々の株価、企業ニュース、経済指標など多岐にわたります。
このような複雑な判断プロセスを「AIエージェント」に委ねる構成が注目されています。
本記事では、複数の専門エージェントを連携させた「投資判断AIエージェントシステム」の実装パターンについて紹介します。
yfinance、ChromaDB、LangGraph、MLflow、FastAPI などを用いて、LLMと構造化データを組み合わせた構成を実現しました。
AIエージェントとは?
エージェント構成の考え方
投資において「ニュースも見るし、チャートも見るし、決算も見る」──人間の投資判断もマルチソースです。
これを以下のようにモジュール化したのが本プロジェクトのAIエージェント構成です。
├── 短期テクニカル分析Agent(yfinanceで価格取得 + テクニカル指標計算)
├── ニュース・センチメント分析Agent(GoogleNews + Gemini要約)
├── ボラティリティ分析Agent(ATR指標を算出)
├── 中期ファンダメンタル分析Agent(PER, PBR, EPS, 売上成長率など)
├── マクロ経済要因分析Agent(FRED, IMF, FRB, 日銀など)
└── 投資評価統合Agent(LangGraphでワークフロー定義)
使用技術と構成(How)
使用ライブラリ一覧
| 技術/ライブラリ | 用途 |
|---|---|
| yfinance | 株価の取得とテクニカル指標(移動平均、MACD、RSI)に使用 |
| ChromaDB | ニュースや決算情報をベクトル検索して文脈情報をLLMに供給 |
| LangGraph | 各エージェントの呼び出し制御(評価フローの設計)に使用 |
| MLflow | モデルの保存・呼び出し・ステージ管理 |
| FastAPI | API化して各エージェントを独立動作させる |
| Docker Compose | 環境を統一・再利用できる構成に |
実装内容とコード解説
1. yfinance による株価データ取得とテクニカル指標の計算
import yfinance as yf
import pandas as pd
def get_technical_indicators(symbol: str):
df = yf.download(symbol, period="3mo", interval="1d")
df['MA5'] = df['Close'].rolling(window=5).mean()
df['MA20'] = df['Close'].rolling(window=20).mean()
df['RSI'] = compute_rsi(df['Close'])
df['MACD'] = df['Close'].ewm(span=12).mean() - df['Close'].ewm(span=26).mean()
return df.tail(1) # 最新データのみ返す
2. ChromaDB によるニュース文書のベクトル検索
from chromadb import Client
from chromadb.config import Settings
from sentence_transformers import SentenceTransformer
chroma_client = Client(Settings(chroma_db_impl="duckdb+parquet"))
collection = chroma_client.get_or_create_collection("news")
# ニュースの格納
def store_news(documents):
embeddings = SentenceTransformer("all-MiniLM-L6-v2").encode(documents)
collection.add(documents=documents, embeddings=embeddings)
# 検索
def search_related_news(query: str):
query_embedding = SentenceTransformer("all-MiniLM-L6-v2").encode([query])
return collection.query(query_embeddings=query_embedding, n_results=3)
- ここで取得した「類似ニュース文」をLLM(Gemini)に要約させ、Agentに渡します。
3. LangGraph によるエージェント評価フローの定義
from langgraph.graph import StateGraph
builder = StateGraph()
builder.add_node("tech", tech_agent)
builder.add_node("news", news_agent)
builder.add_node("volatility", atr_agent)
builder.add_node("fundamentals", fundamental_agent)
builder.add_node("macro", macro_agent)
builder.add_node("score", evaluate_agent)
builder.set_entry_point("tech")
builder.add_edge("tech", "news")
builder.add_edge("news", "volatility")
builder.add_edge("volatility", "fundamentals")
builder.add_edge("fundamentals", "macro")
builder.add_edge("macro", "score")
- 順に処理を流す評価フローを明示的に構成。
- 将来的にはAgentの応答によって次ノードを変える「if分岐」なども可能です。
4. MLflow × FastAPIでモデルの呼び出し
import mlflow.sklearn
model = mlflow.sklearn.load_model("models:/atr_predictor/Production")
@app.post("/predict/atr")
def predict_volatility(data: PriceData):
df = pd.DataFrame([data.dict()])
return {"atr": model.predict(df)[0]}
- これにより、ボラティリティ分析Agentはステージングされたモデルを使用して予測。
- MLflow UIを使えば、モデル更新・履歴管理が視覚的に操作可能です。
工夫した観点(What was clever?)
-
モジュール化とAPI分割
- 各AgentはFastAPIで独立起動できるAPIとして構成 → 開発・検証がしやすい
- Docker Composeにより再現性のあるエージェント環境を構築可能
-
Gemini活用とRAG(検索強化生成)
- Gemini APIを使って「要約・評価」を行い、RAGにより文脈誤爆を低減
- 投資対象企業のIRやニュースをChromaで埋め込み→検索→要約という流れを自動化
-
LangGraphによるワークフローの明示化
-
各Agentの順序・関係性がコードで明確に管理され、将来的な** 拡張(並列処理、分岐)** も容易
So what:この構成が実務でどう役立つのか?
- 複数視点の分析を統合する実践的構成を試せる
- LLM + データ分析の融合構成(=投資AI以外にも応用可能)
- 小規模チームや個人でも、PoC・プロトタイプが短時間で構築可能
今後の展望
- Slack連携やチャットボット化による対話型インターフェース
- モデル監視(Prometheus + Grafana)とパフォーマンス可視化
- Agentの意思決定プロセス可視化(LIME, SHAP)
GitHub & 参考リンク
GitHub
MLflow
LangGraph
ChromaDB
yfinance
GitHub
この構成が「AIエージェントの構築を通じて、どうLLMやMLOpsを実務に活かすか?」のヒントになれば幸いです。