TradingAgents 의 `Hold` 를 채점하는 법 — 「지금 추가하지 마라」가 옳았는지 재기

지금까지 아무도 평가하지 않던 판정이 「보유 유지」입니다. TradingAgents 가 금지한 행동을 그대로 해 보고 그 Hold 의 문턱을 잰 절차입니다.

TradingAgents 의 Hold 를 채점하는 법 — 「지금 추가하지 마라」가 옳았는지 재기

이 글의 완료 조건: 독자가 자기 도구의 「보유 유지」 판정 한 건을 두 개의 반사실(지금 추가 / 지금 청산)로 쪼개고, 그중 하나를 실제로 주문해서 그 판정의 문턱을 숫자로 받으면 성공입니다.

하는 일 TradingAgents 가 낸 Hold 판정이 구체적으로 금지한 행동을 시험 주문으로 그대로 해 보고, 체결·청산까지 따라가 그 판정의 문턱을 잽니다
맞는 사람 이미 들고 있는 것을 어떻게 할지 묻는 도구를 쓰는 사람. Hold 를 자주 받아 본 사람
안 맞는 사람 「지금 무엇을 살까」에 대한 답만 필요한 사람. 이 편은 안 사기로 한 결정이 주제입니다
이 글의 결과물 Hold 한 건이 반사실 거래로 번역된 기록 CSV, 그리고 「그 Hold 가 틀리려면 필요했던 최소 움직임」 한 숫자
준비물·비용 TradingAgents 설치 무료(Apache-2.0) · 모델 비용 실측 판당 $0.058 · weltiq pro 계정
시간·난도 설치 3.3초 + 한 판 3~5분 + 반사실 왕복 15분 · 중 (curl·JSON)
검증 환경·날짜 2026-09-28 (KST) · 격리 서버 · 합성 호가 · 커밋 0431b2a9 (5절에 한계를 그대로 적었습니다)
제휴 고지 필자는 weltiq 로부터 이 연재의 원고료를 받습니다. 아래 숫자는 전부 필자가 직접 돌린 것이고, 예상과 달랐던 것도 그대로 적었습니다

1. 이 도구가 남기던 빈칸

TradingAgents(github.com/TauricResearch/TradingAgents · Apache-2.0 · 별 107,945 · 2026-09-22 관측)는 에이전트 열한 명이 한 종목을 놓고 순서대로 토론하는 도구입니다. 애널리스트 넷 → 리서처 셋 → 트레이더 → 리스크 셋 → 포트폴리오 매니저. 등급은 다섯 단계입니다 — Buy · Overweight · Hold · Underweight · Sell.

제가 이 도구로 받은 BTC-USD 판정 하나가 이렇습니다 (2026-09-21, 그 도구의 출력).

**Rating**: Hold
**Price Target**: not provided
**Time Horizon**: 3-6 months

그리고 그 아래 요약문이 구체적으로 무엇을 하지 말라고 적어 뒀습니다.

"Maintain BTC-USD exposure only at a controlled, non-leveraged size; do not add at the current 81,526.82 level beneath the 82,253.84–83,000 resistance zone. … Treat a sustained close below 78,473.91 as a reason to reduce risk, with materially greater concern below the 73,216.37 50 SMA."

중기 방향은 상승으로 봤습니다 — "BTC-USD has a constructive medium-term trend but an unattractive immediate entry point."

여기가 빈칸입니다. Buy 는 사면 성적이 남고 Sell 도 마찬가지인데, Hold 는 아무것도 안 하는 판정이라 영원히 채점되지 않습니다. 그런데 이 Hold 는 빈칸이 아닙니다. "지금 81,526.82 에 추가하는 것은 나쁜 거래다"라는 검증 가능한 주장입니다.

리스크 팀 셋이 서로 반박하는 화면

이 도구가 일하는 대표 화면입니다. Current Report 안이 중립 분석가가 공격적 분석가와 보수적 분석가를 중재하는 장면입니다. 왼쪽 Progress 에서 트레이더까지 completed 이고 리스크 팀이 도는 중인 것을 보십시오 — 이 토론이 끝나야 포트폴리오 매니저의 Rating 한 줄이 나옵니다. 이 글이 채점하려는 것이 바로 그 한 줄입니다.

한 가지 먼저 못 박아 둡니다. 이 Hold 는 2026-09-21 회차의 것입니다. 다음 날 같은 설정으로 13판을 다시 돌렸을 때는 Hold 가 0/13 이었습니다(Sell 7 · Underweight 6). 같은 도구가 같은 조건에서도 이만큼 흔들립니다 — 5절에서 다시 다룹니다.


2. 왜 지금까지 못 쟀나

성적표는 지금까지 산 것에만 남았습니다. Hold 는 주문을 안 내니 체결이 없고, 체결이 없으니 손익이 없고, 손익이 없으니 채점 대상이 아닙니다.

왜 그동안 비어 있었나 — 여기가 핵심입니다. 「지금 추가하지 마라」가 옳았는지 재려면 실제로 추가해 봐야 하는데, 추가하는 순간 계좌가 움직입니다. 자본이 묶이고, 손실 한도를 갉아먹고, 성과 집계에 섞입니다. 재는 행위가 재려는 대상을 망가뜨립니다. 그래서 안 쟀습니다.

시험 주문은 그 자리를 비켜 갑니다. 잔고·손익·한도·성과 집계 어디에도 들어가지 않는 별도 원장에서 그 판단을 청산까지 끌고 갑니다.

사지 않기로 한 판단도 성적표가 남습니다. 계좌를 건드리지 않고요.

이게 「남들은 못 하는 기술」이라는 말이 아닙니다. 원리상 백테스트로도 흉내 낼 수 있습니다. 다만 백테스트는 과거 재생이라 그 판정이 난 그 시각·그 호가를 못 잡고, 실계좌로 하면 위의 파괴가 일어납니다. 그 사이에 자리가 비어 있었습니다.

그리고 Hold 에는 하나 더 있습니다. Hold 는 두 개의 반사실로 쪼개집니다 — "지금 추가한다"와 "지금 청산한다". 둘을 따로 내면 지금은 평가되지 않는 판정이 측정 대상이 됩니다. 이 회차는 앞쪽만 냈습니다(뒤쪽은 보유 포지션이 있어야 성립합니다).


3. 레시피 — 그대로 도는 것

3.1 먼저 TradingAgents 에서 판정을 받습니다

대시보드는 없습니다. 저장소를 뒤져도 streamlit·gradio·fastapi·flask 가 한 줄도 없습니다. 있는 것은 터미널 TUI 하나입니다. 띄울 주소를 찾지 마십시오.

git clone https://github.com/TauricResearch/TradingAgents.git && cd TradingAgents
uv venv -p 3.12 .venv && uv pip install --python .venv/bin/python .
python -m cli.main

설치는 3.288초 · 85 패키지였습니다. 대화형으로 종목·날짜·애널리스트를 묻고, 그 뒤 4분쯤 화면이 흐릅니다.

설치가 끝난 화면 — TradingAgents CLI 첫 기동

초록 테두리 환영 상자와 그 아래 Workflow Steps 한 줄이 이 도구의 전부를 요약합니다 — 애널리스트 팀 → 리서치 팀 → 트레이더 → 리스크 관리 → 포트폴리오 관리. 이 다섯 단계가 뜨면 설치는 제대로 된 것입니다. 맨 아래 Step 1: Ticker Symbol 이 첫 질문입니다.

에이전트 열한 명이 순서대로 일하는 화면

왼쪽 위 Progress 가 진행 화면입니다. 맨 아래 상태줄의 Agents: 1/11 | LLM: 4 | Tools: 10 | Tokens: 70.8k↑ 4.0k↓ | ⏱ 00:40 가 지금까지 몇 명이 끝났고 토큰을 얼마나 썼는지입니다 — 돈이 드는 도구에서 이게 화면에 붙어 있는 건 큰 장점입니다.

산출물은 날짜 폴더에 떨어집니다. 파이썬에서 graph.save_reports() 를 부르면 팀별로 쪼갠 13개 트리가 나오고, 우리가 볼 것은 그중 하나입니다 — 5_portfolio/decision.md 의 **Rating** 한 줄과 요약문.

3.2 금지된 행동을 그대로 냅니다

레시피 전문은 04-trial-order-tradingagents-hold.sh 에 있습니다. 심장부만 옮깁니다.

curl -sS -X POST "$WELTIQ_BASE_URL/v1/trial-buys" \
  -H "Authorization: Bearer $WELTIQ_API_KEY" -H 'Content-Type: application/json' \
  -d '{
    "venue": "binance-spot", "symbol": "BTCUSDT",
    "client_order_id": "tradingagents-hold-1-hold-add",
    "side": "long",
    "exit_plan": {"close_after_seconds": 600,
                  "stop_loss": "78473.91", "take_profit": "83000"},
    "client_tracking_id": "tradingagents-hold-1",
    "tags": ["counterfactual", "part-12"],
    "metadata": {"verdict": "Hold", "rating": "Hold",
                 "level_roles": "assigned_by_harness"}
  }'

세 가지를 정해 놓고 들어갑니다.

① 반사실은 「지금 추가 매수」입니다. 이 도구가 금지한 행동이 그것이고, 그 반대를 그대로 합니다.

② 숏은 내지 않았습니다. 이 도구의 중기 방향은 "constructive medium-term trend" 로 상승입니다. 78,473.91 아래는 "위험 축소" 신호이지 하락 주장이 아닙니다.

③ 레벨 처리를 정직하게 적습니다. 이 도구는 이 두 숫자를 stop/target 이라고 부르지 않았습니다 — 기록 원문이 Price Target: not provided 입니다. 도구가 이름 붙인 두 수준("reason to reduce risk" 78,473.91 · 저항대 상단 83,000)을 exit_plan 으로 옮긴 것이고, 역할 배정은 제 판단입니다. 숫자 자체는 원문 그대로이고 한 자리도 고치지 않았습니다.

잔가지 하나: 같은 파일 안에서 저항대 상단이 요약문에는 82,253.84, 본문에는 82,252.84 로 적혀 있습니다. 도구 출력 안의 불일치라 그대로 인용하고 조용히 맞추지 않았습니다.

숫자를 metadata 에 실을 때는 문자열로 보냅니다. 0.88 처럼 float 를 넣으면 500 입니다 — 계약 본문이 해시되는데 결정론 규칙이 float 를 거부합니다.

3.3 되찾아 옵니다 — 호출 두 번

curl -sS "$WELTIQ_BASE_URL/v1/forward-tests?tracking=tradingagents-hold-1&limit=200" \
  -H "Authorization: Bearer $WELTIQ_API_KEY"

curl -sS "$WELTIQ_BASE_URL/v1/forward-tests/orders?tracking=tradingagents-hold-1&format=csv" \
  -H "Authorization: Bearer $WELTIQ_API_KEY"

두 번째 줄이 2026-09-28 에 생긴 계정 전체 엔드포인트입니다. 시험을 먼저 고르지 않습니다. 자동 청산 주문도 추적 ID·태그를 물려받으므로 진입 한 건만 심어도 CSV 에 청산 줄이 같이 옵니다 — 왕복 비용이 거기서 나옵니다.

조인할 때 awk 를 쓰지 마십시오. CSV 의 metadata·exit_plan 칸에 인용된 쉼표가 있어 필드 구분자로 자르면 열이 조용히 밀립니다. 레시피는 인라인 python3 의 csv 모듈로만 조인하고 그 이유를 주석에 적어 뒀습니다.

그리고 판정은 서버로 안 갑니다. 의도는 도구가 갖고, 우리는 집행 기록을 갖습니다. 둘을 잇는 것은 client_tracking_id 하나입니다.


환경 고지: 아래 숫자는 격리 서버·합성 호가에서 나왔습니다. 운영이 아니고, 손익은 시장 사실이 아닙니다 — 재는 것은 배선과 판정 틀이지 그 도구가 옳았다는 증거가 아닙니다.

4. 돌려 본 결과

201 → 체결 → 600초 시한 청산까지 갔습니다.

케이스 응답 진입가 청산가 close_reason 수수료 순손익 손익분기
BTC Hold → 지금 추가 매수 201 81535.65265 81517.34735 close_after 0.01304424 −0.0145086640 0.2224%

도구가 이름 붙인 두 수준(78,473.91 · 83,000)은 10분 창에서 한 번도 닿지 않았습니다. close_reason 이 close_after 라는 게 그 뜻입니다.

4.1 이 표에서 읽어야 할 숫자 하나

손익분기 0.2224%. 그 시점에 추가로 샀다면 10분 안에 BTC 가 최소 0.2224% 는 올랐어야 본전이었습니다. 안 올랐으니 "지금 추가하지 마라"는 옳았습니다. 단 조건부입니다 — "가격이 그 10분 동안 0.2224% 넘게 오르지 않았다면".

다만 이 편의 값어치는 숫자가 아닙니다. 「보유 유지」 판정이 반사실로 번역된다는 것 자체가 값입니다. Hold 를 "지금 추가"와 "지금 청산" 두 반사실로 쪼개면, 지금은 평가되지 않는 판정이 측정 대상이 됩니다.

4.2 예상과 달랐던 것 — 확신도로 갈릴 수가 없었습니다

같은 회차에서 다른 도구의 관망 네 건을 같은 방식으로 냈는데, 확신도 0.88·0.90·0.89 와 0.20 의 순손익이 소수점 끝까지 같았습니다.

이유는 명백합니다. 같은 시각에 같은 호가로 냈기 때문입니다. 고정 시장에서 손익은 확신도가 아니라 왕복 비용이 결정합니다.

이건 실패가 아니라 틀이 서면서 드러난 조건입니다.

확신도-결과 상관을 재려면 반사실을 「판정이 난 그 시각·그 가격」에 내야 합니다. 나중에 한 회차로 몰아서 재생하면 확신도는 사라지고 비용만 남습니다.

즉 이 기능이 값을 내려면 도구가 판정을 낸 순간에 자동으로 반사실 주문이 나가야 합니다. 사후 배치 재현으로는 아무것도 안 나옵니다.

시험 매수 목록 — 반사실 회차들이 한 화면에

우리 쪽 화면입니다. 각 행이 반사실 한 건이고 오른쪽 상태 칸을 보십시오 — 체결까지 간 것과 배치에서 되돌아온 것이 한 단어로 갈립니다. 채점에 넣을 수 있는 행과 「미판정」으로 남겨야 할 행을 여기서 가릅니다.


5. 이 조합의 한계

① 표본 하나로는 아무 말도 못 합니다. 이 편의 표본은 한 건입니다. 관망 한 건이 손실로 끝났다고 그 관망이 옳았던 게 아닙니다 — 분포가 필요합니다.

② 반사실은 한쪽만 잽니다. "샀으면 어땠나"는 쟀지만 "안 사서 무엇을 아꼈나"는 여전히 판단입니다. 그리고 이 회차는 Hold 의 두 쪽 중 "지금 추가" 쪽만 냈습니다. "지금 청산" 쪽은 보유 포지션이 있어야 성립합니다.

③ 우리는 그 도구가 옳다/틀리다를 말하지 않습니다. 재고 기록할 뿐입니다. 위의 「옳았다」도 기준에 따른 판정이고 조건부입니다.

④ 이 Hold 는 재현되지 않았습니다. 다음 날 같은 설정 13판에서 Hold 0/13(Sell 7 · Underweight 6)이었습니다. 즉 이 반사실이 채점한 것은 「이 도구의 Hold」가 아니라 「그날 그 한 판의 Hold」입니다. 회차마다 모델·날짜·입력을 고정하고 기록하지 않으면 무엇을 재는지가 흐려집니다.

⑤ 역할 배정이 제 판단입니다. 3.2절에 적은 대로 Price Target: not provided 인 도구의 두 수준을 stop/target 자리에 넣었습니다. 숫자는 원문이지만 자리는 제가 정했습니다. 다르게 배정하면 다른 결과가 나올 수 있습니다.

⑥ 지평이 창에 안 들어갑니다. 이 도구의 Time Horizon 은 3–6개월인데 시험 주문의 수명 상한은 168시간입니다. 10분 창으로 잰 것은 그 지평의 판단이 아니라 「지금」의 판단입니다. 무엇을 쟀는지를 흐리지 않는 것이 중요합니다.

⑦ 관망의 값어치는 거래소가 정합니다. 이게 이 회차의 가장 실용적인 발견입니다.

거래소 왕복 비용(실측) 그 관망이 틀리려면 필요했던 10분 움직임
binance-spot (taker 0.1% × 2) 0.2223~0.2224% 약 0.222%
us-equity (수수료 0 · 매도세 0.00206%) 이 회차 미측정(폐장) 크립토보다 두 자릿수 작다

크립토에서 10분짜리 관망은 0.22% 만 움직이면 틀립니다. 비트코인 10분 변동으로 0.22% 는 드물지 않습니다. 반대로 미국 주식은 왕복 비용이 거의 0이라 거기서의 「기다림」은 비용으로는 정당화되지 않고 가격이 실제로 눌렸는지로만 정당화됩니다.

⑧ 합성 호가입니다. 위 손익은 격리 서버의 고정 호가에서 나온 모형 결과입니다. 확인된 것은 배선과 판정 틀입니다.


6. 언제 쓰고 언제 쓰지 마라

쓰십시오 — Hold 를 자주 받는 도구라면. 이 연재에서 「보유 유지」를 재판정하는 편은 이 편뿐입니다. Hold 를 두 반사실로 쪼개는 순간 평가되지 않던 판정이 측정 대상이 됩니다. 도구가 Hold 를 많이 낼수록 이 절차의 값이 큽니다.

쓰십시오 — 판정이 구체적인 금지를 담고 있다면. "지금 81,526.82 에 추가하지 마라"처럼 행동이 특정되면 반사실이 자동으로 정해집니다. 반대로 "신중하게 접근하라"는 반사실로 못 옮깁니다 — 무엇을 안 했는지가 없으니까요.

쓰지 마십시오 — 한 판으로 도구를 판단하려 한다면. 4절에 적은 대로 같은 설정 13판에서 Hold 가 0번이었습니다. 이 도구는 회차 간 편차가 큽니다. 반사실도 그 편차를 그대로 물려받습니다.

쓰지 마십시오 — 도구의 지평을 재고 싶다면. 3–6개월짜리 판단을 168시간으로 자르면 재는 것이 그 도구의 판단이 아닙니다. 반올림은 값을 보정하지만 절단은 판단을 바꿉니다.

쓰지 마십시오 — 비중이 산출의 핵심이라면. 이 도구의 산출은 대체로 「비중 지시」(정상 배분의 50~75%)입니다. 수량을 서버가 정하는 이 경로에서는 그 비중이 사라집니다. 방향과 타이밍만 남습니다.


이 글의 증거: A축 반사실 측정 기록 · 케이스별 요청·응답 원문 · 이 편의 레시피 · 도구 쪽 실행 기록. 위 숫자는 전부 그 기록에서 가져왔고, Hold 0/13 이라는 불편한 숫자도 같은 기록에 있습니다.