TradingAgents/README.md

15 KiB
Raw Blame History


TradingAgents: Discord 기반 멀티 에이전트 자동매매 봇

TradingAgents 프레임워크에 Discord 봇, 한국투자증권 Open API, KR/US 워치리스트 전략을 결합한 자동매매 프로젝트입니다.


목차


한눈에 보기

  • Discord 슬래시 명령 11개로 분석, 잔고조회, 수동 주문, 스코어링, 손익 조회를 제공합니다.
  • 한국(KR)과 미국(US) 모두 워치리스트 기반 스코어링 뒤 상위 후보만 AI 분석합니다.
  • 자동매매는 룰 기반 후보 선정 -> 상위 N개 AI 분석 -> BUY 종목만 균등매수 -> 오후 점검 -> 손절/익절 감시 흐름으로 동작합니다.
  • 자동매수 예산은 기준 자금(anchor) × 비율로 계산할 수 있어, 예를 들어 50% 설정 시 절반씩 회전 투자할 수 있습니다.
  • 분석 보고서는 Markdown 파일로 저장되며, 필요하면 Discord에도 자동 업로드합니다.
  • 매매 이력과 실현손익은 SQLite로 누적 관리합니다.

전략 개요

전체 흐름

워치리스트/랭킹 후보 수집
-> 룰 기반 점수 계산
-> 상위 후보만 TradingAgentsGraph AI 분석
-> BUY 종목만 균등분할 매수
-> 오후 매도 점검
-> 손절/익절 모니터링

시장별 자동매매 흐름

시장 후보 풀 자동 매수 오후 점검 장중 감시
KR KR_WATCHLIST 우선, 비어 있으면 시총/거래량 랭킹 fallback AUTO_BUY_TIME (기본 09:30 KST), 예산 AUTO_BUY_BUDGET_RATIO 적용 AUTO_SELL_TIME (기본 15:20 KST) MONITOR_INTERVAL_MIN 간격
US US_WATCHLIST 우선, 비어 있으면 시총/거래량 랭킹 fallback US_AUTO_BUY_TIME (기본 09:35 ET), 예산 US_AUTO_BUY_BUDGET_RATIO 적용 US_AUTO_SELL_TIME (기본 15:50 ET) MONITOR_INTERVAL_MIN 간격

현재 스코어링 규칙

KR/US 공통 골격은 같습니다.

  • 워치리스트 기본 점수: +30
  • 등락률 0~2%: +25
  • 등락률 2~5%: +15
  • 시가총액 랭크 진입: +10
  • 거래량 랭크 진입: +5
  • 필터: 등락률 > 8% 또는 < -5%면 제외

추가 메모:

  • KR은 KIS 현재가와 yfinance 전일 종가를 함께 써서 점수를 계산합니다.
  • US는 yfinance 가격 이력을 기본으로 쓰고, KIS 미국 현재가가 가능하면 현재가를 보정합니다.
  • 랭킹 보너스는 응답이 있을 때만 붙습니다.
  • 현재 코드 기준으로 미국 시총/거래량 랭킹은 모의투자에서 비활성 처리되어, 실전 환경에서만 반영됩니다.

오후 매도 정책

  • 워치리스트에 포함된 종목은 강제 청산하지 않고 스윙 보유합니다.
  • 워치리스트 밖 보유 종목만 오후 점검 시 시장가 매도합니다.
  • 손절/익절 조건은 워치리스트 여부와 관계없이 계속 감시합니다.

손절/익절 규칙

  • 손절: STOP_LOSS_PCT 이하
  • 익절: TAKE_PROFIT_PCT 이상
  • 감시 주기: MONITOR_INTERVAL_MIN

에이전트 아키텍처

TradingAgentsGraph는 아래 구조로 동작합니다.

1. 애널리스트 팀

  • 시장 애널리스트: 기술적 지표와 차트 흐름 분석
  • 소셜 미디어 애널리스트: 투자 심리와 센티먼트 분석
  • 뉴스 애널리스트: 뉴스와 이벤트 리스크 분석
  • 펀더멘털 애널리스트: 재무와 사업 체력 분석

2. 리서치 팀

  • 강세 리서처
  • 약세 리서처
  • 리서치 매니저

3. 트레이딩/리스크 팀

  • 트레이더
  • 공격적 리스크 매니저
  • 보수적 리스크 매니저
  • 중립적 리스크 매니저

4. 최종 의사결정

  • 포트폴리오 매니저가 BUY / SELL / HOLD를 확정합니다.

설치

1. 레포지토리 클론

git clone https://github.com/TauricResearch/TradingAgents.git
cd TradingAgents

2. 가상환경

python -m venv .venv
source .venv/bin/activate

Windows는 아래를 사용하세요.

.venv\Scripts\activate

3. 의존성 설치

Discord 봇을 바로 실행하려면 아래 조합이 가장 안전합니다.

pip install -r requirements.txt python-dotenv
pip install -e .

4. 환경변수 파일 준비

cp .env.example .env

환경 설정

기본 템플릿은 .env.example에 있습니다.

# LLM Providers
OPENAI_API_KEY=
GOOGLE_API_KEY=
ANTHROPIC_API_KEY=
XAI_API_KEY=
OPENROUTER_API_KEY=

# Discord
DISCORD_BOT_TOKEN=
# DISCORD_CHANNEL_IDS=123456789012345678,987654321098765432

# KIS
KIS_APP_KEY=
KIS_APP_SECRET=
KIS_ACCOUNT_NO=12345678-01
KIS_VIRTUAL=true
KIS_MAX_ORDER_AMOUNT=1000000
KR_WATCHLIST=005930,000660,005380,005490,035420,105560,069500,114800,226490,229200

# US
ENABLE_US_TRADING=false
US_MAX_ORDER_AMOUNT=5000
US_EXCHANGE_SEARCH_ORDER=NASD,NYSE,AMEX
US_WATCHLIST=AAPL,MSFT,NVDA,AMZN,GOOGL,META,TSLA,AMD,AVGO,QQQ,SPY

# Schedule
DAY_TRADE_PICKS=5
AUTO_BUY_BUDGET_RATIO=1.0
AUTO_BUY_TIME=09:30
AUTO_SELL_TIME=15:20
US_DAY_TRADE_PICKS=5
US_AUTO_BUY_BUDGET_RATIO=1.0
US_AUTO_BUY_TIME=09:35
US_AUTO_SELL_TIME=15:50

# Risk / reports
STOP_LOSS_PCT=-5.0
TAKE_PROFIT_PCT=10.0
MONITOR_INTERVAL_MIN=30
REPORTS_DIR=reports
AUTO_REPORT_UPLOAD=true

# Optional bot model overrides
DEEP_THINK_LLM=gemini-3-flash-preview
QUICK_THINK_LLM=gemini-3-flash-preview
MAX_DEBATE_ROUNDS=1

설정 메모

  • DISCORD_CHANNEL_IDS를 비워두면 수동 명령은 모든 채널에서 사용할 수 있습니다.
  • 자동매매 스케줄은 DISCORD_CHANNEL_IDS가 설정된 경우에만 실제로 동작합니다.
  • 미국 수동/자동 주문은 ENABLE_US_TRADING=true가 아니면 막힙니다.
  • KIS_VIRTUAL=true면 모의투자, false면 실전투자입니다.
  • AUTO_BUY_BUDGET_RATIO=0.5처럼 설정하면 KR 자동매수는 기준 자금의 50%만 사용합니다. 50% 형식도 가능합니다.
  • US_AUTO_BUY_BUDGET_RATIO를 비워두면 미국 자동매수도 같은 비율을 사용합니다.
  • 기준 자금(anchor)은 시장별로 저장되는 자동매수 기준 예수금이며, 더 큰 예수금을 확인하면 자동으로 상향 갱신됩니다.
  • Discord 봇은 모델명만 환경변수로 덮어쓰고, 기본 provider는 tradingagents/default_config.py 설정을 따릅니다.

KIS 앱키 발급

  1. 한국투자증권 API 포털에 로그인합니다.
  2. 앱키를 발급합니다.
  3. 모의투자와 실전투자는 앱키가 다릅니다.
  4. 계좌번호는 12345678-01 형식으로 입력합니다.

Discord 봇 토큰 발급

  1. Discord Developer Portal에서 애플리케이션을 만듭니다.
  2. Bot 탭에서 토큰을 발급합니다.
  3. OAuth2에서 bot, applications.commands 스코프를 추가해 서버에 초대합니다.

사용법

Discord 봇 실행

python bot.py

정상 실행 시 봇은 아래 정보를 콘솔에 출력합니다.

  • 동기화된 슬래시 명령 수
  • KR/US 자동매매 시각
  • 손절/익절 기준
  • 허용 채널 여부
  • 모의/실전 모드

슬래시 명령어

현재 등록되는 명령은 11개입니다.

명령 설명
/분석 <티커> [날짜] 단일 종목 멀티 에이전트 AI 분석, 보고서 파일 첨부
/대형주 [날짜] KR 스코어링 TOP5를 순차 분석하고 BUY 종목에 버튼 제공
/잔고 KRW/USD 계좌 요약과 보유 종목 조회
/매수 <티커> [수량] 시장별 수동 예산 상한 기준 매수 확인 버튼 표시
/매도 <티커> [수량] 보유 수량 기준 매도 확인 버튼 표시
/상태 오늘 자동매매 실행 상태 조회
/봇정보 스케줄, 설정, 계좌 요약, 오늘 이력을 한 번에 조회
/스코어링 [시장] [count] [exclude_held] 실시간 후보 점수 조회
/스코어규칙 [시장] 현재 코드 기준 스코어링 규칙 조회
/수익 누적 실현손익, 승률, 종목별 요약 조회
/수익초기화 [통화] 손익 집계 기준 시점 초기화

수동 주문 동작 방식

  • /매수는 수량을 생략하면 KIS_MAX_ORDER_AMOUNT 또는 US_MAX_ORDER_AMOUNT 기준으로 자동 수량을 계산합니다.
  • /매도는 수량을 생략하면 전량 매도로 동작합니다.
  • 장이 닫혀 있으면 매수 버튼을 띄우지 않습니다.
  • 매수 확인 버튼은 5분, 매도 확인 버튼은 2분 뒤 만료됩니다.

자동매매 스케줄

자동매매는 허용 채널이 있을 때만 실행됩니다.

KR 자동매수

  1. 워치리스트 점수 계산
  2. 보유 종목 제외
  3. 상위 DAY_TRADE_PICKS만 AI 분석
  4. BUY 종목만 기준 자금(anchor) × AUTO_BUY_BUDGET_RATIO 예산 안에서 균등분할 매수
  5. 장 시작 전 분석이 끝나면 개장까지 대기 후 주문

KR 오후 점검

  1. 보유 종목 조회
  2. KR_WATCHLIST 밖 종목만 시장가 매도
  3. 워치리스트 종목은 유지
  4. 결과를 Discord와 손익 DB에 반영

US 자동매매

  • ENABLE_US_TRADING=true일 때만 실행됩니다.
  • KR과 동일한 흐름으로 동작하되 시간대만 ET 기준이며, 예산은 US_AUTO_BUY_BUDGET_RATIO를 따릅니다.
  • 오후 점검도 US_WATCHLIST 밖 종목만 정리합니다.

손절/익절 모니터링

  • KR/US 보유 종목 전체를 감시합니다.
  • 손절 또는 익절 조건에 도달하면 확인 없이 자동 매도합니다.

분석 보고서

  • 보고서는 REPORTS_DIR 아래 Markdown 파일로 저장됩니다.
  • AUTO_REPORT_UPLOAD=true면 자동매매 중 생성된 보고서도 Discord로 업로드합니다.

Python에서 직접 사용

from tradingagents.graph.trading_graph import TradingAgentsGraph
from tradingagents.default_config import DEFAULT_CONFIG

config = DEFAULT_CONFIG.copy()
config["deep_think_llm"] = "gemini-3-flash-preview"
config["quick_think_llm"] = "gemini-3-flash-preview"

ta = TradingAgentsGraph(debug=True, config=config)
final_state, decision = ta.propagate("AAPL", "2026-03-18")
print(decision)

CLI 사용

python -m cli.main

또는 설치 후:

tradingagents

KIS API 연동

핵심 구현은 kis_client.py에 있습니다.

현재 실제로 쓰는 API

기능 엔드포인트 비고
OAuth 토큰 POST /oauth2/tokenP 실전/모의 공통
KR 잔고 조회 GET /uapi/domestic-stock/v1/trading/inquire-balance KRW 요약 포함
US 잔고 조회 GET /uapi/overseas-stock/v1/trading/inquire-balance 거래소별 합산
KR 현재가 GET /uapi/domestic-stock/v1/quotations/inquire-price 국내 6자리 코드
US 현재가 GET /uapi/overseas-price/v1/quotations/price 거래소 탐색 포함
KR 주문 POST /uapi/domestic-stock/v1/trading/order-cash 시장가 매수/매도
US 주문 POST /uapi/overseas-stock/v1/trading/order 시장가 매수/매도
KR 시총 랭킹 GET /uapi/domestic-stock/v1/ranking/market-cap 스코어링 보너스
KR 거래량 랭킹 GET /uapi/domestic-stock/v1/quotations/volume-rank 스코어링 보너스
US 시총 랭킹 GET /uapi/overseas-stock/v1/ranking/market-cap 실전에서만 사용
US 거래량 랭킹 GET /uapi/overseas-stock/v1/ranking/trade-vol 실전에서만 사용

코드에 남아 있는 KR 보조 랭킹 유틸리티

현재 기본 전략은 사용하지 않지만, 아래 API 래퍼도 구현돼 있습니다.

  • 체결강도 순위: get_volume_power()
  • 등락률 순위: get_fluctuation_rank()
  • 대량체결 순위: get_bulk_trans()

중요한 운영 차이

  • KR 워치리스트가 비어 있으면 시총 랭킹, 그다음 거래량 랭킹으로 후보를 보완합니다.
  • US 워치리스트가 비어 있어도 같은 순서로 fallback 합니다.
  • 미국 시총/거래량 랭킹은 현재 코드에서 모의투자 시 빈 결과를 반환하도록 되어 있습니다.

LLM과 데이터 소스

프레임워크가 지원하는 LLM 제공자

  • OpenAI
  • Google
  • Anthropic
  • xAI
  • OpenRouter
  • Ollama

현재 Discord 봇 기본값

  • provider 기본값: tradingagents/default_config.py
  • 봇 환경변수로 덮는 값: DEEP_THINK_LLM, QUICK_THINK_LLM, MAX_DEBATE_ROUNDS
  • 데이터 수집: yfinance
  • 주문/잔고/랭킹: KIS Open API

프로젝트 구조

TradingAgents/
├── bot.py
├── kis_client.py
├── trade_history.py
├── main.py
├── README.md
├── .env.example
├── requirements.txt
├── pyproject.toml
├── reports/
├── data/
├── cli/
└── tradingagents/
    ├── agents/
    ├── dataflows/
    ├── graph/
    ├── llm_clients/
    └── default_config.py

주요 파일:


운영 메모

  • 수동 주문은 예산 상한을 넘기면 차단됩니다.
  • 자동매매는 daily_state 기록으로 중복 실행을 막습니다.
  • 보고서는 저장 실패 시에도 Discord 전송을 가능한 형태로 fallback 합니다.
  • 분석은 asyncio.Lock으로 직렬화되어 동시에 여러 건이 돌지 않습니다.
  • 모의투자에서는 실전과 일부 API 응답 차이가 있을 수 있습니다.

이 프로젝트는 연구/자동화 실험용입니다. 실제 주문 전에는 반드시 모의투자로 충분히 검증하세요.


Citation

@misc{xiao2025tradingagentsmultiagentsllmfinancial,
      title={TradingAgents: Multi-Agents LLM Financial Trading Framework},
      author={Yijia Xiao and Edward Sun and Di Luo and Wei Wang},
      year={2025},
      eprint={2412.20138},
      archivePrefix={arXiv},
      primaryClass={q-fin.TR},
      url={https://arxiv.org/abs/2412.20138},
}