TradingAgents/Docs/tradingagents_codex_task.md

32 KiB

TradingAgents 개선 작업 지시서 (Codex용)

1) 목적

이 문서는 nornen0202/TradingAgents 저장소를 대상으로, 현재 구현을 정확도·재현성·시장 확장성 관점에서 개선하기 위한 작업 지시서다.

핵심 목표는 다음 4가지다.

  1. 정합성 문제 수정: 프롬프트/툴 시그니처 불일치, 설정값 미반영, 최종 시그널 파싱의 비결정성 제거.
  2. 데이터 품질 개선: yfinance 중심 뉴스 계층을 다원화하고, 소셜/공시/거시 데이터를 역할별로 분리.
  3. 한국 시장 확장: 미국 대형주 중심 구조를 KRX 종목에도 실효성 있게 확장.
  4. 평가 가능성 확보: 개선 전후를 비교할 수 있는 테스트와 평가 하네스 도입.

2) 현재 구조 요약

이 프로젝트는 대체로 다음 흐름으로 동작한다.

  • Analyst Team: market, social, news, fundamentals
  • Researcher Team: bull, bear, research manager
  • Execution/Risk Team: trader, aggressive/conservative/neutral risk, portfolio manager
  • 최종적으로 SignalProcessor가 텍스트형 최종 결정을 다시 파싱해 등급을 추출

구조 자체는 좋다. 하지만 현재 병목은 에이전트 수가 아니라 데이터 계층의 얕음, 역할 중복, 결정 스키마 불일치에 있다.


3) 현재 상태 진단 요약

A. 기본 설정이 지나치게 yfinance 중심

  • default_config.py에서 core_stock_apis, technical_indicators, fundamental_data, news_data가 모두 기본값 yfinance로 설정되어 있다.
  • max_debate_roundsmax_risk_discuss_rounds 기본값도 각각 1이다.

의미:

  • 데이터 다양성이 좁다.
  • 에이전트 토론이 사실상 1회 왕복 수준이라, 상호 반박/증거 대조가 충분히 이뤄지기 어렵다.

B. Social agent의 역할과 실제 데이터가 맞지 않음

  • social_media_analyst.py는 실제 툴로 get_news 하나만 사용한다.
  • 프롬프트는 “social media posts”, “what people are saying”, “sentiment data of what people feel each day”를 요구하지만, 실제 툴은 소셜 데이터가 아니라 뉴스 데이터다.
  • 더구나 프롬프트는 get_news(query, start_date, end_date)라고 설명하지만 실제 툴 시그니처는 get_news(ticker, start_date, end_date)이다.

의미:

  • 현재 social agent는 사실상 소셜 분석기가 아니라 회사 뉴스 재요약기에 가깝다.
  • 프롬프트-툴 계약이 깨져 있어 LLM이 잘못된 tool call을 시도할 위험이 있다.

C. 뉴스 계층이 개선 여지는 있지만 여전히 제한적

  • yfinance_news.py는 ticker 뉴스에 대해 (20, 50, 100) 개수로 점진 fetch를 시도하고, 필터링된 기사 수는 최대 25개로 제한한다.
  • 이는 “20개 고정”보다는 낫지만, 여전히 기사 source diversity와 coverage는 제한적이다.
  • 글로벌 뉴스는 고정된 영어 쿼리 목록으로 검색한다.
    • "stock market economy"
    • "Federal Reserve interest rates"
    • "inflation economic outlook"
    • "global markets trading"
  • 글로벌 뉴스 경로는 미래 기사 차단은 하지만, 엄격한 lower-bound 필터링이나 지역/언어 다양성 측면이 약하다.

의미:

  • 미국/영문 중심의 매크로 뉴스에는 어느 정도 맞지만,
  • 한국 종목, 비영어권 이벤트, 지역 뉴스, 공시 중심 이벤트 대응에는 부족하다.

D. 벤더 fallback 구조는 있지만 실질적 회복력은 약함

  • interface.py는 comma-separated vendor chain을 허용한다.
  • 하지만 실제 fallback은 AlphaVantageRateLimitError일 때만 작동한다.
  • 빈 결과, 일반 예외, malformed payload, 품질 저하 상황에서는 다음 벤더로 자연스럽게 넘어가지 않는다.

의미:

  • 추상화는 이미 존재하지만, 품질 회복력(resilience) 은 충분하지 않다.

E. 설정값 일부가 실제 실행에 반영되지 않음

  • Propagatormax_recur_limit 인자를 받도록 구현되어 있다.
  • 그러나 TradingAgentsGraphself.propagator = Propagator()로 생성하여 config의 max_recur_limit를 넘기지 않는다.

의미:

  • 사용자가 설정을 바꿔도 graph invocation recursion limit에 반영되지 않는다.

F. 의사결정 스케일이 단계별로 일관되지 않음

현재 결정 스케일은 다음처럼 제각각이다.

  • research_manager.py: Buy / Sell / Hold
  • trader.py: FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL**
  • portfolio_manager.py: Buy / Overweight / Hold / Underweight / Sell
  • signal_processing.py: 최종 텍스트를 다시 LLM에 넣어 BUY / OVERWEIGHT / HOLD / UNDERWEIGHT / SELL 중 하나를 추출

의미:

  • agent 간 의미 손실이 발생한다.
  • 마지막 단계가 deterministic parser가 아니라 LLM 재해석이라 재현성이 떨어진다.

G. Memory/Reflection은 있으나 평가 루프와 느슨하게 연결됨

  • memory.py는 BM25 기반 lexical retrieval만 사용한다.
  • reflect_and_remember()는 존재하지만 자동 평가 루프와 강하게 연결되어 있지 않다.
  • trader.pyportfolio_manager.pyn_matches=2 메모리만 참조한다.

의미:

  • 과거 사례 회상이 문맥적으로 얕다.
  • semantic similarity, regime metadata, outcome-conditioned reflection이 부족하다.

H. Fundamentals agent의 도구 구성이 미완성

  • fundamentals_analyst.pyget_insider_transactions를 import하지만 tools 목록에 넣지 않는다.
  • 프롬프트는 “past week” 중심인데, 펀더멘털은 본질적으로 주간 신호보다 분기/연간/가이던스/공시 이벤트와 더 잘 맞는다.

의미:

  • 펀더멘털 agent가 본연의 강점을 충분히 활용하지 못하고 있다.

I. 미국 종목에는 상대적으로 맞지만, 한국 종목은 실효성이 낮음

  • upstream 계열은 exchange-qualified ticker 지원을 명시한다.
  • Yahoo Finance에도 005930.KS 같은 한국 종목 페이지가 존재한다.
  • 하지만 이 포크는 사용자 입력을 거의 그대로 company_of_interest에 넣고, 한국 종목명/숫자코드 → Yahoo/DART/거래소 심볼로 정규화하는 resolver가 없다.
  • 또한 한국 전용 뉴스/공시/거시/수급 adapter가 없다.

의미:

  • 미국 대형주는 “연구용/실험용”으로 꽤 쓸 만할 수 있다.
  • 한국 종목은 현재 상태로는 동작 가능효과적 수행 가능을 구분해야 하며, 후자는 아직 부족하다.

4) 핵심 판단

결론 1: 문제의 본질은 “에이전트 수 부족”이 아니라 “독립적인 증거원 부족”이다

지금 구조는 여러 agent가 존재하지만, 실제로는 동일하거나 유사한 데이터(yfinance 뉴스 등)를 서로 다르게 요약하는 경우가 많다. 특히 social agent와 news agent의 독립성이 약하다.

결론 2: yfinance만으로 뉴스 계층을 운영하는 것은 부족하다

yfinance는 prototyping에는 좋지만, 아래가 부족하다.

  • source diversity
  • 언어/지역 다양성
  • 소셜 감성 전용 신호
  • 공시(event) 계층
  • 한국 시장 로컬 정보
  • point-in-time completeness

결론 3: 이 프로젝트는 “미국 상장 대형주” 쪽으로 더 최적화돼 있다

현재 글로벌 뉴스 검색 방식과 벤더 구성, 프롬프트 설계, ticker 정규화 부재를 종합하면 US-optimized, KRX-compatible-but-not-KRX-specialized라고 보는 것이 정확하다.


5) Codex가 구현해야 할 작업 범위

작업은 P0 → P1 → P2 → P3 순서로 진행하라.


P0. 정합성 / 결정성 / 회귀 위험이 낮은 수정 (최우선)

P0-1. max_recur_limit 실제 반영

수정 대상

  • tradingagents/graph/trading_graph.py
  • tradingagents/graph/propagation.py

작업 지시

  • TradingAgentsGraph.__init__()에서 Propagator(self.config["max_recur_limit"]) 형태로 생성하라.
  • 필요하면 Propagator 생성자 type hint를 명시하라.
  • 관련 회귀 테스트를 추가하라.

수용 기준

  • config에서 max_recur_limit를 바꾸면 graph invocation config["recursion_limit"]에 동일 값이 반영되어야 한다.

P0-2. 프롬프트-툴 계약 불일치 수정

수정 대상

  • tradingagents/agents/analysts/social_media_analyst.py
  • tradingagents/agents/analysts/news_analyst.py
  • tradingagents/agents/utils/news_data_tools.py

작업 지시

  • 현재 social/news 프롬프트에서 get_news(query, start_date, end_date)라고 설명하는 부분을 실제 시그니처에 맞게 수정하라.
  • 단기적으로는 get_news(ticker, start_date, end_date)를 정확히 반영하라.
  • 추가로, 장기 확장용으로는 get_company_news, get_macro_news, get_disclosures, get_social_sentiment 같은 분리된 인터페이스로 발전시키기 쉽게 설계하라.

수용 기준

  • 프롬프트 설명과 tool signature가 일치해야 한다.
  • social agent가 사용할 수 없는 capability(예: social media posts 수집)를 허위로 암시하지 않아야 한다.

P0-3. 결정 스키마 통일 + 최종 파싱 deterministic화

수정 대상

  • tradingagents/agents/managers/research_manager.py
  • tradingagents/agents/trader/trader.py
  • tradingagents/agents/managers/portfolio_manager.py
  • tradingagents/graph/signal_processing.py
  • 신규: tradingagents/schemas/decision.py (또는 동등 파일)

작업 지시

  • 모든 최종/중간 의사결정 agent가 동일한 구조화 스키마를 출력하도록 바꾸라.
  • 추천 스키마:
{
  "rating": "BUY | OVERWEIGHT | HOLD | UNDERWEIGHT | SELL | NO_TRADE",
  "confidence": 0.0,
  "time_horizon": "short | medium | long",
  "entry_logic": "...",
  "exit_logic": "...",
  "position_sizing": "...",
  "risk_limits": "...",
  "catalysts": ["..."],
  "invalidators": ["..."]
}
  • research_manager, trader, portfolio_manager 모두 이 스키마를 사용하게 하라.
  • signal_processing.py는 더 이상 LLM 재호출로 등급을 추출하지 말고, 구조화 출력에서 rating만 deterministic하게 읽어 오게 하라.
  • NO_TRADE 상태를 도입하라. 현재 구조는 Hold/Buy/Sell 쪽으로 과도하게 액션을 강제한다.

수용 기준

  • 최종 signal extraction에 추가 LLM 재호출이 없어야 한다.
  • parsing failure 시 명시적 예외/검증 오류가 발생해야 하며, 조용히 잘못된 rating이 나오면 안 된다.

P0-4. Fundamentals agent의 도구 누락 수정

수정 대상

  • tradingagents/agents/analysts/fundamentals_analyst.py
  • 필요 시 tradingagents/graph/trading_graph.py

작업 지시

  • get_insider_transactions를 실제 tools 목록에 포함하라.
  • 프롬프트를 “past week” 중심에서 “최근 공시/실적/가이던스/내부자거래/재무변화” 중심으로 재정렬하라.

수용 기준

  • fundamentals agent가 insider 거래를 실제로 조회할 수 있어야 한다.
  • agent 프롬프트가 펀더멘털의 시간축과 맞아야 한다.

P1. 뉴스/소셜/공시 계층의 실질적 강화 (정확도 향상 핵심)

P1-1. 기본 뉴스 벤더를 alpha_vantage,yfinance로 전환

수정 대상

  • tradingagents/default_config.py

작업 지시

  • 아래 기본값으로 조정하라.
"max_debate_rounds": 2,
"max_risk_discuss_rounds": 2,
"data_vendors": {
    "core_stock_apis": "yfinance",
    "technical_indicators": "yfinance",
    "fundamental_data": "yfinance",
    "news_data": "alpha_vantage,yfinance",
},
  • tool-level override 예시도 주석으로 추가하라.
  • 단, alpha_vantage API key가 없거나 rate limit에 걸리면 자연스럽게 fallback해야 한다.

수용 기준

  • default news path에서 alpha_vantage를 우선 시도하고 실패 시 yfinance로 내려가야 한다.

P1-2. route_to_vendor()의 fallback을 일반화

수정 대상

  • tradingagents/dataflows/interface.py

작업 지시

  • 현재는 AlphaVantageRateLimitError에서만 fallback한다.
  • 이를 다음 상황에서도 fallback 가능하게 개선하라.
    • vendor-specific 일반 예외
    • 빈 결과
    • "No news found ..." 류의 empty semantic result
    • malformed payload
  • 단, 명백한 사용자 입력 오류는 fallback 대상이 아니라 즉시 예외를 내는 것이 낫다.
  • should_fallback(result_or_exc) 같은 헬퍼를 만들고 테스트 가능하게 작성하라.

권장 로직

if raises rate limit -> fallback
if raises transient/network/vendor-specific error -> fallback
if result is empty or semantically empty -> fallback
if result is valid non-empty -> return
if invalid user input / unsupported symbol format clearly identified -> raise

수용 기준

  • alpha_vantage,yfinance 구성이 실제 품질 회복력으로 작동해야 한다.
  • “빈 문자열/빈 feed/No news found” 상황에서 다음 벤더로 넘어가야 한다.

P1-3. 뉴스 계층을 역할별로 분리

수정 대상

  • tradingagents/agents/utils/news_data_tools.py
  • tradingagents/dataflows/interface.py
  • 신규 dataflow 파일들

작업 지시

기존 get_news/get_global_news만으로 모든 역할을 처리하지 말고, 아래처럼 분리하라.

  • get_company_news(symbol, start_date, end_date)
  • get_macro_news(curr_date, look_back_days=7, limit=10, region=None, language=None)
  • get_disclosures(symbol, start_date, end_date)
  • get_social_sentiment(symbol, start_date, end_date)

단, 초기 단계에서는 backward compatibility를 위해 기존 get_news()를 남기되 내부적으로 get_company_news()의 thin wrapper로 두어라.

수용 기준

  • company news / macro news / disclosures / social sentiment가 개념적으로 분리되어야 한다.
  • social agent가 더 이상 일반 뉴스 툴 하나에 과도하게 의존하지 않도록 구조를 만들라.

P1-4. Social agent를 “실제 소셜” 또는 “명시적 뉴스 기반 sentiment”로 정직하게 재설계

수정 대상

  • tradingagents/agents/analysts/social_media_analyst.py
  • 필요 시 파일명/클래스명 변경

작업 지시

아래 두 옵션 중 하나를 택하되, 우선은 옵션 A를 추천한다.

옵션 A (권장)

  • 실제 social provider를 추가한다.
  • 예: Finnhub 기반 sentiment 또는 다른 대체 데이터 제공자.
  • provider가 미설정이면 agent는 “social provider unavailable, falling back to news-derived sentiment”를 명시해야 한다.

옵션 B

  • agent 이름을 sentiment_analyst 또는 company_sentiment_analyst로 바꾸고,
  • 실제 capability를 “company news sentiment + public narrative analysis”로 축소 명시한다.

수용 기준

  • agent 이름/프롬프트/도구가 서로 모순되지 않아야 한다.
  • unavailable capability를 허위로 묘사하면 안 된다.

P1-5. 뉴스 표준 객체 도입

수정 대상

  • 신규: tradingagents/dataflows/news_models.py (또는 동등 파일)
  • yfinance_news.py, alpha_vantage_news.py, 이후 추가 벤더들

작업 지시

모든 뉴스/이벤트 source를 아래와 같은 공통 스키마로 정규화하라.

@dataclass
class NewsItem:
    title: str
    source: str
    published_at: datetime | None
    language: str | None
    country: str | None
    symbols: list[str]
    topic_tags: list[str]
    sentiment: float | None
    relevance: float | None
    reliability: float | None
    url: str
    summary: str
    raw_vendor: str
  • URL 또는 (publisher, title, timestamp) 기반 dedupe를 공통 처리하라.
  • agent에는 raw article dump 전체가 아니라 핵심 이벤트 목록 + evidence summary 형태로 전달하라.

수용 기준

  • 서로 다른 벤더의 뉴스 결과를 하나의 공통 객체로 다룰 수 있어야 한다.
  • dedupe와 evidence summarization이 일관되어야 한다.

P2. 한국 시장 대응 (KRX 실효성 확보)

P2-1. Instrument resolver 추가

신규 파일

  • tradingagents/agents/utils/instrument_resolver.py

수정 대상

  • tradingagents/graph/propagation.py
  • tradingagents/agents/utils/agent_utils.py
  • 필요 시 여러 tool wrapper

작업 지시

입력값을 정규화하는 resolver를 추가하라.

지원 예시:

  • "AAPL"AAPL
  • "삼성전자"005930.KS
  • "005930"005930.KS
  • "NAVER"035420.KS
  • "035420"035420.KS
  • 이미 suffix가 붙은 005930.KS, 241710.KQ 등은 그대로 통과

추가 요구사항:

  • Yahoo symbol / KRX short code / DART corp code를 함께 다룰 수 있는 구조를 고려하라.
  • 최소한 내부적으로 아래를 분리해 보관 가능해야 한다.
    • display_name
    • primary_symbol
    • exchange
    • country
    • dart_corp_code (있으면)

수용 기준

  • ta.propagate("삼성전자", "2026-01-15") 같은 입력도 최소한 symbol 정규화 단계는 통과해야 한다.
  • resolver 실패 시 명확한 오류 메시지를 제공하라.

P2-2. 한국 전용 데이터 어댑터 추가

신규 권장 파일

  • tradingagents/dataflows/opendart.py
  • tradingagents/dataflows/naver_news.py
  • tradingagents/dataflows/krx_open_api.py
  • tradingagents/dataflows/ecos.py

작업 지시

한국 시장 대응을 위해 최소한 아래를 adapter 형태로 추가하라.

  1. OpenDART

    • 공시 원문/회사개황/재무지표/주요 문서 접근
    • get_disclosures()와 fundamentals 계층에 연결
  2. Naver News Search API

    • 한국어 회사 뉴스 검색
    • get_company_news()의 KRX 경로에 연결
  3. KRX Open API

    • 일별 매매정보, 거래대금, 시장지표, 필요 시 공매도/수급 정보
    • market analysis 보강용
  4. ECOS (한국은행)

    • 한국 거시 데이터
    • macro news / macro context 보강용

구현 원칙

  • API key / auth가 없으면 기능을 끄고 graceful fallback하라.
  • 미국 종목 흐름은 기존처럼 동작해야 한다.
  • 한국어 기사/공시는 원문 기반 사용을 우선하고, 영문은 보조 자료로만 다뤄라.

수용 기준

  • 한국 종목 분석 시 미국 매크로 영어 기사만 보는 상태를 벗어나야 한다.
  • KRX 종목의 company news / disclosure / macro context가 분리되어 공급되어야 한다.

P2-3. 시간대/거래소/통화 정규화

수정 대상

  • 시장/뉴스/리포트 생성 관련 유틸 전반

작업 지시

  • US/Eastern, Asia/Seoul 등 시장별 세션 타임존을 명시적으로 관리하라.
  • 보고서/도구 요약에서 통화단위(USD, KRW)를 혼동하지 않게 하라.
  • 장중/장후/장마감 상태와 이벤트 timestamp를 표준화하라.

수용 기준

  • KRX 종목 보고서에 미국 기준 시간 표현이 섞여 오해를 만들면 안 된다.
  • 숫자와 통화가 명시적으로 표기되어야 한다.

P3. 정확도 개선용 구조 업그레이드

P3-1. Market agent를 “지표 선택형”에서 “레짐 인식 + 해석형”으로 전환

수정 대상

  • tradingagents/agents/analysts/market_analyst.py
  • 필요 시 technical indicator tool 계층

작업 지시

현재는 agent가 최대 8개 지표를 고르는 구조다. 이를 아래처럼 바꾸는 것을 목표로 하라.

  1. 먼저 레짐 분류:
    • trending up / trending down / range-bound / high-volatility / event-driven
  2. 레짐별 고정 feature bundle 계산
  3. LLM은 feature를 “선택”하기보다 “해석”하게 함

추가 추천 feature:

  • benchmark relative strength
  • sector ETF 대비 상대 성과
  • ATR / realized volatility
  • gap + volume shock
  • earnings-event proximity
  • 거래대금/유동성 필터
  • KRX의 경우 외국인/기관 수급, 공매도 가능 시그널

수용 기준

  • LLM이 tool parameter를 임의로 잘못 조합하는 위험이 줄어야 한다.
  • 보고서가 narrative뿐 아니라 수치적 feature 기반으로 더 일관적이어야 한다.

P3-2. Memory를 hybrid retrieval로 개선

수정 대상

  • tradingagents/agents/utils/memory.py

작업 지시

현재 BM25만 사용한다. 이를 아래 중 하나로 개선하라.

  • BM25 + embedding hybrid
  • BM25 + regime tags + metadata filters
  • outcome-aware memory (승률/드로우다운/보유기간/조건별 성과 메타 포함)

추가 요구사항:

  • n_matches를 고정 상수처럼 쓰지 말고 configurable하게 하라.
  • reflection outcome과 연결해 past memory quality를 점진적으로 높여라.

수용 기준

  • lexical overlap이 낮아도 유사한 시장상황을 더 잘 회수해야 한다.

P3-3. Reflection을 실제 평가 루프에 연결

수정 대상

  • TradingAgentsGraph.reflect_and_remember() 호출 경로
  • backtest/evaluation 스크립트 신규 추가

작업 지시

  • walk-forward evaluation 또는 backtest 루프에서 returns_losses 결과가 나오면 자동으로 reflection을 호출하도록 연결하라.
  • reflection 이전/이후의 memory 변화가 재현 가능하게 저장되도록 하라.

수용 기준

  • reflection이 수동 실험용 기능이 아니라 평가 파이프라인 일부가 되어야 한다.

6) 추천 외부 데이터 소스 설계

미국/글로벌 우선 스택

기본 조합

  • Alpha Vantage NEWS_SENTIMENT → 1차
  • yfinance → fallback

옵션

  • Finnhub → social/sentiment/대체데이터 보강
  • NewsAPI → source diversity 보강
  • GDELT → 글로벌/다국어 이벤트 coverage 보강
  • SEC EDGAR → 미국 공시 계층

한국 우선 스택

  • OpenDART → 공시/재무/원문 문서
  • Naver News Search API → 한국어 뉴스
  • BIGKinds → 국내 뉴스 다양성/아카이브
  • KRX Open API → 거래/시장 데이터
  • ECOS → 한국 거시 통계

주의

  • Finnhub company news는 북미 기업 전용 제약이 있으므로 KRX 회사뉴스의 메인 소스로 쓰지 말 것.
  • DART 영문 공시는 법적 효력이 없는 자발적 번역일 수 있으므로, 한국 종목 분석의 1차 근거는 한국어 원문 공시를 우선할 것.

7) 파일별 상세 수정 지시

7.1 tradingagents/default_config.py

해야 할 일

  • news_data 기본값: "alpha_vantage,yfinance"
  • max_debate_rounds: 2
  • max_risk_discuss_rounds: 2
  • 향후 확장을 위한 선택적 설정 추가
    • social_data
    • market_country
    • timezone
    • enable_no_trade
    • vendor_timeout
    • empty_result_fallback

주의

  • 기존 사용자 config override와 충돌하지 않도록 backward compatible하게 작성

7.2 tradingagents/graph/trading_graph.py

해야 할 일

  • Propagator(self.config["max_recur_limit"]) 적용
  • tool node 구성 재검토
    • social 전용 툴 추가 시 여기서 연결
    • disclosures 분리 시 news/fundamentals 중 적절한 agent에 연결
  • process_signal() 경로를 구조화 스키마 기반으로 변경

7.3 tradingagents/graph/propagation.py

해야 할 일

  • 초기 state 생성 전에 instrument resolver를 호출하도록 설계
  • company_of_interest에 raw input만 넣지 말고 정규화된 symbol/context를 보관 가능하게 개선

예시:

{
  "input_instrument": "삼성전자",
  "company_of_interest": "005930.KS",
  "instrument_profile": {
    "display_name": "삼성전자",
    "primary_symbol": "005930.KS",
    "country": "KR",
    "exchange": "KRX"
  }
}

7.4 tradingagents/graph/signal_processing.py

해야 할 일

  • LLM 기반 문자열 추출 제거
  • pydantic 또는 stdlib validation으로 rating deterministic extraction
  • invalid schema에 대한 명시적 예외 처리

7.5 tradingagents/agents/utils/news_data_tools.py

해야 할 일

  • 기존 get_news()는 유지하되 thin wrapper로 축소
  • 아래 인터페이스 추가
    • get_company_news
    • get_macro_news
    • get_disclosures
    • get_social_sentiment
  • 툴 docstring을 실제 capability에 맞게 다시 작성

7.6 tradingagents/dataflows/interface.py

해야 할 일

  • fallback generalization
  • 신규 tool→category 매핑 추가
  • vendor chain 검증 강화
  • empty result fallback 로직 추가
  • vendor-specific adapter를 공통 normalize layer에 연결

7.7 tradingagents/dataflows/yfinance_news.py

해야 할 일

  • 현 구조의 장점(점진 fetch / dedupe)은 유지
  • global news 검색 쿼리를 고정 영어 4개에서 확장 가능하도록 분리
  • lower-bound filtering 및 region/language filtering 가능성 추가
  • NewsItem 표준화 계층에 맞게 결과 반환 구조 정리

추가 개선 포인트

  • 현재 global query는 미국 거시 편향이 강하므로 지역별 query preset 지원
    • US
    • KR
    • GLOBAL

7.8 tradingagents/dataflows/alpha_vantage_news.py

해야 할 일

  • NEWS_SENTIMENT 결과를 NewsItem으로 정규화
  • ticker/company news와 macro news를 일관된 형태로 내보내기
  • rate limit/empty result 시 fallback-friendly 예외 또는 상태 반환

7.9 tradingagents/agents/analysts/social_media_analyst.py

해야 할 일

  • agent 이름/프롬프트/툴 세트를 capability와 일치시키기
  • 실제 소셜 provider 없으면 “news-derived sentiment analyst”로 안전하게 축소
  • social provider가 있으면 그때만 social-specific prompt 활성화

7.10 tradingagents/agents/analysts/news_analyst.py

해야 할 일

  • company news, macro news, disclosures를 분리된 evidence block으로 사용
  • 단순 장문 요약보다 아래 형식을 권장
    • 핵심 이벤트 3~5개
    • event type
    • source
    • why it matters
    • bullish / bearish implication
    • confidence

7.11 tradingagents/agents/analysts/fundamentals_analyst.py

해야 할 일

  • insider transactions 포함
  • “past week” 중심 문구 수정
  • 공시/실적/가이던스/내부자거래/재무 구조 변화 중심 재구성
  • KRX면 OpenDART 우선, 미국이면 기존/SEC 경로 우선하는 훅 설계

7.12 tradingagents/agents/analysts/market_analyst.py

해야 할 일

  • 지표 선택형 설계를 단계적으로 regime-driven 설계로 전환
  • KRX 전용 feature 확장 가능성을 남길 것

7.13 tradingagents/agents/trader/trader.py

해야 할 일

  • BUY/HOLD/SELL 텍스트 강제를 제거
  • 구조화 출력 사용
  • 진입 조건 / 청산 조건 / 포지션 크기 / time horizon 포함
  • NO_TRADE 허용

7.14 tradingagents/agents/managers/research_manager.py

해야 할 일

  • Hold 억제(action bias) 문구를 완화
  • evidence arbitration 중심으로 프롬프트 재작성
  • 각 주장별 근거와 무효화 조건을 명시하게 유도

7.15 tradingagents/agents/managers/portfolio_manager.py

해야 할 일

  • 최종 결정의 구조화 스키마 사용
  • 리스크 한도, 포지션 사이징, invalidator, catalyst 포함
  • memory 참조 방식을 hybrid retrieval로 연결 가능하게 준비

8) 평가/테스트 지시

필수 단위 테스트

아래 테스트를 추가하라.

  1. config propagation test

    • max_recur_limit가 실제 graph args에 반영되는지
  2. prompt-tool consistency test

    • social/news agent 프롬프트가 실제 tool signature와 모순되지 않는지
  3. vendor fallback test

    • rate limit
    • generic exception
    • empty result
    • malformed payload 각각에서 다음 vendor로 fallback되는지
  4. structured decision parsing test

    • valid schema에서 deterministic하게 rating을 읽는지
    • invalid schema에서 예외가 나는지
  5. instrument resolver test

    • AAPL
    • 005930.KS
    • 005930
    • 삼성전자
    • NAVER
    • 035420
  6. news normalization test

    • yfinance/alpha_vantage 결과가 공통 NewsItem으로 정규화되는지
  7. social agent degrade-gracefully test

    • 소셜 provider 미설정 시 fallback messaging이 정직하게 나오는지

권장 평가 하네스

신규 스크립트를 추가하라.

  • scripts/eval_walk_forward.py
  • 또는 tradingagents/eval/walk_forward.py

평가 메트릭 예시:

  • hit rate
  • forward return by rating bucket
  • turnover
  • max drawdown
  • benchmark excess return
  • abstain(NO_TRADE) frequency
  • US vs KR split metrics

9) 구현 원칙

반드시 지킬 것

  • 기존 공개 API를 불필요하게 깨지 말 것
  • 새 vendor/API key가 없어도 기존 경로로 graceful fallback할 것
  • unavailable capability를 프롬프트에서 허위로 주장하지 말 것
  • 최종 decision은 자유형 텍스트가 아니라 구조화 결과를 우선할 것
  • 한국 종목은 영문 보조 자료보다 한국어 원문 공시/뉴스를 우선할 것

피해야 할 것

  • social agent가 계속 get_news 하나만 쓰면서 “social media”를 분석한다고 말하는 상태 유지
  • signal_processing.py에서 LLM을 한 번 더 호출하는 비결정적 추출 유지
  • fallback 체인이 있어 보이지만 실제로는 rate limit 외에는 동작하지 않는 상태 유지
  • KRX 지원을 “티커 suffix만 붙으면 된다” 수준으로 과대평가

10) 단계별 커밋 권장 순서

Commit 1 — Correctness & determinism

  • recursion limit 반영
  • prompt-tool mismatch 수정
  • structured decision schema 도입
  • signal_processing deterministic화
  • fundamentals tool 누락 보완

Commit 2 — Vendor resilience

  • default config 조정
  • fallback generalization
  • news normalization layer 도입

Commit 3 — Social / disclosure separation

  • company news / macro news / disclosures / social sentiment 인터페이스 분리
  • social agent 정직한 capability 재정의

Commit 4 — KRX support

  • instrument resolver
  • OpenDART / Naver / KRX / ECOS adapter 뼈대
  • timezone/currency normalization

Commit 5 — Evaluation

  • unit tests 확장
  • walk-forward evaluation 스크립트 추가

11) 완료 조건 (Definition of Done)

다음 조건을 만족하면 1차 완료로 본다.

  1. max_recur_limit가 실제로 반영된다.
  2. social/news 프롬프트와 툴 시그니처가 일치한다.
  3. 뉴스 벤더가 alpha_vantage,yfinance 조합에서 실제 fallback한다.
  4. 최종 rating 추출이 구조화/결정적으로 수행된다.
  5. NO_TRADE 상태가 지원된다.
  6. fundamentals agent가 insider transactions를 실제로 쓴다.
  7. KRX symbol normalization이 최소 수준으로 동작한다.
  8. 한국 종목에서 공시/한국어 뉴스/거시 확장 지점을 남긴다.
  9. 관련 단위 테스트가 모두 통과한다.

12) 참고 메모 (설계 판단 이유)

  • 현재 구조는 연구 프레임워크로는 매력적이지만, 실제 정확도는 agent 숫자보다 데이터 source 독립성결정 스키마 일관성에 더 크게 좌우된다.
  • 따라서 이번 패치의 우선순위는 “agent 추가”가 아니라 아래다.
    1. 데이터 역할 분리
    2. fallback/정규화
    3. 구조화 출력
    4. KRX 대응
    5. 평가 루프

13) 외부 참고 링크 (구현 시 참고)

Repo / 코드

미국/글로벌 데이터

한국 데이터


14) Codex에 바로 붙여 넣을 실행 요약

아래 요약을 작업 prompt 첫머리에 붙여 넣어도 된다.

nornen0202/TradingAgents를 분석한 결과, 정확도 병목은 agent 수보다 데이터 계층, 역할 분리, 결정 스키마, KRX 대응성 부족에 있습니다. 우선순위는 (1) recursion/config 반영과 prompt-tool mismatch 수정, (2) final decision의 구조화 및 deterministic parsing, (3) news vendor를 alpha_vantage,yfinance로 바꾸고 fallback을 일반화, (4) company/macro/disclosure/social 인터페이스 분리, (5) instrument resolver와 KRX/OpenDART/Naver/ECOS 확장 포인트 추가, (6) 테스트 및 walk-forward evaluation 추가입니다. 기존 public API는 최대한 유지하고, provider key가 없을 때는 graceful fallback이 되게 해주세요.`