TradingAgents는 실제 트레이딩 회사의 조직 구조를 LLM 멀티에이전트로 시뮬레이션하여, 주식 매매 의사결정을 협업적으로 수행하는 오픈소스 Python 프레임워크입니다. 기술적 분석·뉴스 분석·재무 분석·감성 분석을 담당하는 4명의 애널리스트가 독립적으로 분석한 뒤, Bull vs Bear 연구원이 토론하고, 리스크 관리팀이 3관점으로 검토하여 최종 매매 신호를 생성합니다.
실제 투자회사에서는 기술 애널리스트, 뉴스 애널리스트, 재무 애널리스트, 강세론자, 약세론자, 리스크 매니저, 포트폴리오 매니저가 각자의 관점으로 토론한 후 매매를 결정합니다. TradingAgents는 이 구조를 LangGraph StateGraph로 그대로 코드화합니다.
핵심은 토론(Debate)이 편향을 줄인다는 점입니다. 단일 LLM의 한쪽 방향 편향을 Bull과 Bear의 대립 토론으로 교정합니다.
TradingAgents는 AI 에이전트 + 금융이라는 두 가지 핫 토픽의 교차점에 위치합니다. 단일 LLM이 아닌 다중 전문가 에이전트의 토론(Debate) 메커니즘으로 의사결정 품질을 향상시키고, 거래 후 반성(Reflection)과 메모리 축적으로 경험을 쌓아가는 에이전트를 구현합니다.
일반적인 LLM 트레이딩 봇은 단일 모델이 시장을 분석해 판단합니다. 모델이 가진 훈련 편향이 그대로 반영되고, 손실 후 교훈을 다음 거래에 반영하지 못합니다. 리스크 관리도 단순한 스톱로스 수준에 그칩니다.
Bull과 Bear의 대립 토론으로 편향을 교정하고, Research Manager가 종합 판단합니다. 거래 후 각 에이전트가 자신의 판단을 반성하고 교훈을 메모리에 축적합니다. 공격적·중립·보수적 3관점의 리스크팀이 최종 검토합니다.
| 비교 항목 | TradingAgents | 일반 트레이딩 봇 | FinGPT 류 |
|---|---|---|---|
| 의사결정 구조 | 멀티에이전트 토론 | 단일 모델 판단 | 단일 모델 + 파인튜닝 |
| 리스크 관리 | 3관점 토론 | 단순 스톱로스 | 없거나 기본적 |
| LLM 지원 | OpenAI 호환 13종 + Anthropic/Google/Azure/Bedrock 네이티브 | 보통 1~2개 | OpenAI only |
| 메모리/학습 | Reflection + 메모리 축적 | 없음 | 없음 |
| 확장성 | LangGraph 노드 추가 용이 | 코드 수정 필요 | 모델 재학습 필요 |
| 카테고리 | 라이브러리 | 역할 |
|---|---|---|
| 에이전트 오케스트레이션 | langgraph | StateGraph 기반 워크플로우 정의 및 실행 |
| LLM 연동 | langchain-openai, langchain-anthropic, langchain-google-genai | 멀티 프로바이더 LLM 클라이언트 |
| 금융 데이터 | yfinance, stockstats | 주가, 기술지표, 재무제표 수집 |
| 데이터 처리 | pandas (≥2.3.0) | 시계열 데이터 가공 |
| 캐싱 | redis | 데이터 캐싱 (반복 API 호출 방지) |
| CLI | typer, questionary, rich | 대화형 터미널 인터페이스 |
발산(Divergent): 4명의 애널리스트가 각자 전문 분야에서 독립적으로 분석. 수렴(Convergent): Research Manager가 모든 분석을 종합. 이 사이클을 리스크 관리에서 한 번 더 반복합니다.
# 핵심 아이디어: Bull vs Bear 토론
max_debate_rounds = 1 # 설정 가능
# Bull 연구원: "이 주식을 사야 하는 이유..."
# Bear 연구원: "이 주식을 팔아야 하는 이유..."
# → 조건부 로직이 토론 라운드 관리
# → Research Manager가 양측 논거를 종합하여 판단
class LLMClientFactory:
@staticmethod
def create(provider: str, model: str, **kwargs):
if provider == "openai":
return OpenAIClient(model, **kwargs)
elif provider == "anthropic":
return AnthropicClient(model, **kwargs)
elif provider == "google":
return GoogleClient(model, **kwargs)
# base_client.py → 추상 인터페이스
# openai_client.py / anthropic_client.py / google_client.py / factory.py
StateGraph로 복잡한 멀티에이전트 파이프라인 정의, 조건부 엣지(Conditional Edge)로 토론 라운드 관리, 20개 이상의 필드를 가진 AgentState 스키마 설계, 노드 간 데이터 흐름과 상태 전파 패턴을 배웁니다.
# 미니 토론 그래프 만들어보기
from langgraph.graph import StateGraph
from typing import TypedDict
class DebateState(TypedDict):
topic: str
for_arguments: list[str]
against_arguments: list[str]
rounds: int
verdict: str
# 찬성/반대 에이전트 → 판정 에이전트 워크플로우 구현
추상 베이스 클라이언트로 프로바이더 독립적 코드 작성, 프로바이더별 특수 설정 처리, 런타임에 프로바이더 교체 가능한 유연한 구조를 배웁니다.
거래 결과를 기반으로 에이전트가 자신의 판단을 반성하는 메커니즘, (상황, 교훈) 쌍으로 메모리를 축적하는 패턴, BM25 기반 유사 상황 검색으로 과거 경험 활용, 에이전트 유형별 독립 메모리 관리를 배웁니다.
Bull vs Bear 대립 토론으로 편향(bias) 감소, 3관점 리스크 분석(공격적/보수적/중립), max_debate_rounds 파라미터로 토론 깊이 조절, 판정 에이전트(Judge)의 종합 판단 프롬프트 설계를 배웁니다.
yfinance/Alpha Vantage를 통한 실시간 주가·재무 데이터 수집, stockstats로 기술지표(MACD, RSI, 볼린저밴드) 계산, Redis 캐싱으로 API 호출 최소화, 데이터소스 추상화 인터페이스로 벤더 교체를 배웁니다.
typer + questionary로 대화형 CLI 구축, rich 라이브러리로 실시간 터미널 대시보드, 에이전트 실행 상태 추적 및 시각화, 마크다운 리포트 자동 생성을 배웁니다.
| 항목 | 최소 | 권장 |
|---|---|---|
| Python | 3.10 | 3.13 |
| RAM | 4GB | 8GB+ |
| Redis | 선택사항 | 설치 권장 (캐싱) |
| GPU | 불필요 (API 기반) | Ollama 로컬 모델 시 필요 |
| API 키 | OpenAI 또는 1개 이상 | 복수 프로바이더 |
| 네트워크 | 필수 (API + 금융데이터) | — |
레포 클론 → conda 환경 설정 → API 키 세팅 → AAPL(애플)에 대해 CLI로 분석 실행 → 생성된 리포트를 읽고 각 에이전트의 분석 내용 비교.
결과물: 에이전트별 분석 요약 노트
agents/analysts/ 구조를 분석하여 새로운 애널리스트를 생성합니다. 예: "ESG Analyst" — ESG 점수 기반 투자 적합성 분석. 기존 ToolNode 패턴을 따라 데이터 도구를 연결합니다.
결과물: 작동하는 커스텀 애널리스트 PR
max_debate_rounds를 1, 3, 5로 변경하며 결과를 비교합니다. 토론 라운드 증가가 의사결정 품질에 미치는 영향을 분석합니다.
결과물: 라운드별 결과 비교 리포트
단일 종목이 아닌 5~10개 종목을 동시에 분석합니다. 종목 간 상관관계를 고려한 포트폴리오 최적화 에이전트를 추가하고, LangGraph의 병렬 실행을 활용한 동시 분석을 구현합니다.
결과물: 포트폴리오 추천 시스템 프로토타입
backtrader 통합을 활용하여 과거 데이터로 전략을 검증합니다. 1년치 일별 데이터로 에이전트 의사결정을 시뮬레이션하고 수익률·최대 낙폭·샤프비율 등 성과 지표를 산출합니다.
결과물: 백테스팅 결과 대시보드
LangGraph 공식 문서 정독, StateGraph·노드·엣지·조건부 라우팅 이해, 간단한 2-노드 워크플로우 만들어보기. 참고: LangGraph 공식 튜토리얼 (langchain-ai.github.io/langgraph/)
Agent 역할 분리 패턴(Analyst, Researcher, Manager), 토론(Debate) 메커니즘 구현, 메모리 + Reflection 패턴. 참고: TradingAgents의 graph/setup.py 소스코드 정독.
yfinance API로 주가/재무 데이터 수집, 기술지표(MACD, RSI, 볼린저밴드) 이해 및 구현, pandas로 시계열 데이터 처리. 실습: 관심 종목 3개의 기술지표 대시보드 만들기.
Factory 패턴으로 멀티 프로바이더 지원, 프로바이더별 특수 기능 활용, 비용 최적화: Deep/Quick Think 모델 분리 전략. 실습: 3개 프로바이더를 지원하는 LLM 클라이언트 라이브러리 만들기.
Typer로 CLI 프레임워크 구축, Rich로 실시간 터미널 대시보드 개발, Questionary로 대화형 입력 처리. 실습: 나만의 AI 도구 CLI 대시보드 만들기.
4주차까지 배운 기술을 조합하여 미니 TradingAgents 구현. 2명의 에이전트 + 1명의 판정자로 간소화된 토론 시스템, yfinance 데이터 기반 간단한 매매 시그널 생성.
| 키워드 | 설명 |
|---|---|
| LangGraph | LangChain의 워크플로우 오케스트레이션 프레임워크. 에이전트 간 복잡한 흐름을 StateGraph로 정의 |
| StateGraph | LangGraph의 핵심 개념. 노드(에이전트)와 엣지(전이)로 구성된 상태 기반 그래프 |
| AgentState | TypedDict로 정의된 워크플로우 전체 상태. 모든 에이전트 간 공유되는 데이터 컨테이너 |
| ToolNode | LangGraph에서 외부 도구(API, 데이터소스)를 호출하는 특수 노드 |
| Conditional Edge | 조건에 따라 다음 노드를 결정하는 동적 라우팅. 토론 라운드 관리에 사용 |
| Debate Mechanism | Bull vs Bear 대립 토론으로 다관점 분석을 수행하는 패턴 |
| Reflection | 거래 후 결과를 분석하여 교훈을 추출하는 에이전트 자기 학습 메커니즘 |
| Memory | 에이전트별로 축적되는 (상황, 교훈) 쌍의 장기 기억 저장소 |
| BM25 | 텍스트 유사도 기반 검색 알고리즘. 메모리에서 유사 상황을 찾는 데 사용 |
| Factory Pattern | 객체 생성 로직을 분리하는 디자인 패턴. LLM 프로바이더 교체를 용이하게 함 |
| Deep/Quick Think | 복잡한 종합 판단용 고성능 모델과 빠른 개별 분석용 경량 모델을 분리 운용하는 전략 |
| MACD | Moving Average Convergence Divergence. 이동평균 수렴발산 지표 |
| RSI | Relative Strength Index. 상대강도지수. 과매수/과매도 판단 |
| Alpha Vantage | 프리미엄 금융 데이터 API. 주가, 재무, 뉴스 등 제공 |
| yfinance | Yahoo Finance의 Python 래퍼. 무료 금융 데이터 수집 |
| backtrader | Python 백테스팅 프레임워크. 과거 데이터로 투자 전략 검증 |
| Convergent-Divergent | 분석을 발산(다관점)시킨 후 수렴(종합)하는 반복 패턴 |