AI Trading Analyst 의 눌림 대기를 채점하는 법 — 진입가가 종가 아래일 때 무엇을 재는가

이 도구의 관망은 AVOID 가 아니라 진입가입니다. 3회 모두 종가보다 낮은 진입가를 낸 판단을 반사실로 옮겨 본 절차이고, 이번엔 폐장으로 미판정이 난 것까지 그대로 적었습니다.

AI Trading Analyst 의 눌림 대기를 채점하는 법 — 진입가가 종가 아래일 때 무엇을 재는가

이 글의 완료 조건: 독자가 「방향은 롱인데 지금은 사지 마라」는 판단을 반사실로 옮기고, 그 도구의 대기 폭이 실제로 벌렸어야 할 값이었는지를 묻는 절차를 손에 넣으면 성공입니다. 이번 회차는 그 답이 「미판정」으로 나왔고, 왜 그런지도 이 글에 있습니다.

하는 일 AI Trading Analyst 가 낸 눌림 대기 주문(진입가가 마지막 종가 아래)을 반사실 시험 주문으로 옮겨, 그 「기다림」이 비용으로 정당화되는지 잽니다
맞는 사람 레벨형 도구를 쓰는 사람. 방향만 보고 "이 도구는 매수 의견이네"라고 읽어 온 사람
안 맞는 사람 크립토를 보는 사람(이 도구는 미국 주식 전용) · 장중 실시간 판단이 필요한 사람
이 글의 결과물 「대기 폭」을 숫자로 만드는 절차, 그리고 미판정을 미판정이라고 적은 기록
준비물·비용 도구 설치 무료(MIT) · 금융 데이터 키 0개 · 모델은 Claude Code 구독분 · weltiq pro 계정
시간·난도 설치 0.129초 + 한 판 4~5분 + 반사실 왕복 15분 · 중 (curl·JSON)
검증 환경·날짜 2026-09-28 (KST) · 격리 서버 · 합성 호가 · 커밋 0431b2a9 (5절에 한계를 그대로 적었습니다)
제휴 고지 필자는 weltiq 로부터 이 연재의 원고료를 받습니다. 아래 숫자는 전부 필자가 직접 돌린 것이고, 이번 회차에서 답이 안 나온 것도 그대로 적었습니다

1. 이 도구가 남기던 빈칸

1.1 먼저 정정합니다 — 여기엔 진짜 AVOID 가 없습니다

AI Trading Analyst(github.com/zubair-trabzada/ai-trading-claude · MIT)는 Claude Code 스킬 묶음입니다. 마크다운 지시문 16장과 PDF 생성 스크립트 하나가 전부이고, 키가 하나도 필요 없습니다.

이 도구의 출력 서식은 방향을 LONG / SHORT / AVOID 셋으로 받습니다. 그래서 저는 AVOID 기록을 찾아 반사실을 만들려고 했는데, 이 도구가 실제로 낸 AVOID 판단은 없었습니다. 원자료에서 AVOID 가 나오는 곳은 두 군데뿐입니다.

  1. 서식 자리표시자 — 지시문 안의 DIRECTION: <LONG / SHORT / AVOID>. 판단이 아니라 빈칸의 모양입니다.
  2. 스키마 버그의 산물 — 기록에 AAPL · Trade Score 0/100 · Grade F · Signal AVOID 가 남아 있는데, 이건 PDF 스크립트가 못 찾은 키를 조용히 기본값으로 바꾼 결과입니다(data.get("ticker","AAPL"), data.get("overall_score", 0)). 티커도 점수도 도구의 판단이 아니라 기본값입니다.

지시문대로 만든 페이로드로 뽑은 PDF 1쪽

NVDA 분석을 넣었는데 표지가 AAPL 이고 점수가 0점, 신호가 AVOID 입니다. 넣은 값이 하나도 읽히지 않았다는 뜻입니다 — 이 AVOID 를 판단으로 읽으면 안 되는 이유가 이 한 장에 다 있습니다. 지시문이 만들라는 JSON 의 키와 스크립트가 읽는 키가 서로 다릅니다.

그래서 AVOID 로 반사실을 만들지 않았습니다. 대신 이 도구가 실제로 낸 「주문하지 않기로 한 결정」을 썼습니다.

1.2 이 도구의 관망은 방향이 아니라 진입가입니다

같은 종목(NVDA)에 대해 독립 문맥으로 세 번 물었습니다. 세 판 모두 방향은 LONG 이었습니다. 그런데 —

방향 진입 손절 T1 주수 기간
r1 LONG 222.60 211.00 235.75 22 3–6개월
r2 LONG 217.65 204.40 233.00 22 3–6개월
r3 LONG 217.65 208.00 233.00 22 2–4개월

진입가가 셋 다 마지막 종가 아래입니다. r2 는 아예 못 박았습니다 (그 도구의 출력).

"Entry is not live. Entry Trigger 1 (RSI below 65) is not met at RSI 80.3, and price at $222.27 is above the $217.65 limit. This is a wait-for-pullback plan, not a buy-now plan."

눌림 대기 주문 = 지금은 주문하지 않기로 한 결정입니다. 방향만 보면 "매수 의견"으로 읽히고, 이 관망은 아예 안 보입니다.

/trade thesis NVDA 가 내놓은 열 줄

이 도구가 일하는 화면입니다. 위 두 줄이 문서가 잡은 기준시각과 기준가이고, 초록색 블록이 마지막 절입니다. ENTRY: $222.60 (limit order) 이 그 위 Current Price 보다 아래라는 것 — 지금 사라가 아니라 내려오면 사라는 말이라는 것 — 을 보십시오. 이 한 줄이 이 글의 주제입니다.

숫자 두 개를 헷갈리지 않게 적어 둡니다. 이 도구가 r1 에서 읽은 현재가는 $227.38(웹 검색으로 받은 2026-09-21 종가)이고, weltiq 봉 API 가 잰 그날 마지막 1분봉 종가는 227.30 입니다. 아래 「대기 폭」 계산은 227.30 을 씁니다.


2. 왜 지금까지 못 쟀나

성적표는 지금까지 산 것에만 남았습니다. 지정가 주문이 안 채워지면 아무 기록도 안 남습니다 — 기다렸다는 사실조차 남지 않습니다.

그런데 눌림 대기는 빈칸이 아닙니다. "지금 227.30 에 사는 것보다 222.60 까지 기다리는 게 낫다"는 검증 가능한 주장입니다.

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

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

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

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


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

3.1 먼저 도구에서 판단을 받습니다

대시보드는 없습니다. 웹 UI 도 TUI 도 없고 띄울 주소가 없습니다. Claude Code 터미널 출력과 작업 폴더에 떨어지는 마크다운 파일이 전부입니다.

git clone https://github.com/zubair-trabzada/ai-trading-claude.git
cd ai-trading-claude && ./install.sh

설치 0.129초. 스킬 16·에이전트 5·스크립트 1 이 홈으로 갑니다.

설치가 끝난 화면

./install.sh 한 번의 결과 전부입니다. 맨 아래 세 줄 — 스킬 16·에이전트 5·스크립트 1 이 각각 어디로 갔는지 — 이 보이면 설치가 끝난 것입니다. 중간 노란 줄은 reportlab 경고인데 PDF 를 안 쓸 거면 무시해도 됩니다.

호출은 슬래시 명령을 못으로 박아야 합니다.

/trade thesis NVDA

자연어로 시키면 안 붙습니다 — 제 실측에서 "Build me an investment thesis on NVDA with entry, stop loss and price targets" 는 이 도구가 아니라 다른 플러그인을 3/3 으로 불렀고, 미션 문장("Trade NVDA and make me a profit")은 0/3 으로 아무 스킬도 안 붙었습니다. /trade thesis NVDA 는 1/1 즉시 고정입니다.

4~5분 뒤 TRADE-THESIS-NVDA.md 가 떨어지고, 볼 것은 마지막 절 ## 10. Action Plan Summary 하나입니다.

3.2 기다리지 않는 쪽을 실제로 냅니다

레시피 전문은 05-trial-order-ai-trading-analyst-pullback.sh 에 있습니다. 두 건을 냅니다.

# 롱 — "지금 말고 222.60 까지 눌리면 사라"의 반대. 종가에 지금 산다
curl -sS -X POST "$WELTIQ_BASE_URL/v1/trial-buys" \
  -H "Authorization: Bearer $WELTIQ_API_KEY" -H 'Content-Type: application/json' \
  -d '{"venue": "us-equity", "symbol": "NVDA",
       "client_order_id": "ai-trading-analyst-1-long", "side": "long",
       "exit_plan": {"close_after_seconds": 600,
                     "stop_loss": "211.00", "take_profit": "235.75"},
       "client_tracking_id": "ai-trading-analyst-1",
       "tags": ["counterfactual", "part-27"]}'

# 숏 — 도구가 기다린 그 눌림(종가 → 222.60)을 산다. 역할만 뒤집고 숫자는 원문
#   take_profit 222.60 = 도구의 진입가 · stop_loss 235.75 = 도구의 T1

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

① 롱의 근거: 도구가 "기다려라"고 한 것의 반대는 "지금 산다"입니다. 손절·목표는 r1 기록 그대로입니다.

② 숏의 근거: 3/3 회 모두 종가보다 낮은 진입가를 냈습니다 = 단기 하락을 명시적으로 기대했습니다. 다만 이 도구의 중기 방향은 LONG 이므로, 이 숏이 재는 것은 도구의 방향 판정이 아니라 타이밍 판정입니다. 그 구분을 케이스에 적어 뒀습니다.

③ 시한 600초의 대가: 이 도구의 지평은 3–6개월인데 계약이 그만큼을 못 담습니다. 이관해 볼 때 3개월(7,776,000초)은 422 invalid_close_after_seconds, 2160시간은 422 invalid_max_duration_hours(허용 1..168) 였습니다. 7일로 자르면 그건 이 도구의 판단이 아닙니다. 그래서 지평을 재지 않고 「지금은 아니다」의 대기 폭만 잽니다.

틱 이야기 하나. 211.00·235.75·222.60 은 미국 주식 틱(0.01)의 배수라 그대로 통과합니다. 이 도구가 정수 센트로 내기 때문이지 제가 다듬은 게 아닙니다. 실수 레벨을 내는 도구는 다릅니다 — 같은 회차의 다른 편에서 stop 82034.9994 가 422 를 받았고 82035.00 으로 반올림한 뒤에야 201 이 됐습니다. 서버는 조용히 반올림해 주지 않습니다 — 조건 가격도 실제 주문과 같은 격자에 있어야 하고, 사용자가 준 가격을 서버가 몰래 바꾸면 그게 더 위험합니다.

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

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

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

두 번째 줄이 2026-09-28 에 생긴 계정 전체 엔드포인트입니다. 자동 청산 주문도 추적 ID·태그를 물려받습니다.

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


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

4. 돌려 본 결과

두 건 다 201 로 접수됐습니다. 그리고 배치에서 rejected:market_closed 로 돌아왔습니다.

케이스 응답 진입가 청산가 close_reason 수수료 순손익
NVDA 롱 (기다리지 않는다) 201 — — rejected:market_closed 0 —
NVDA 숏 (눌림을 산다) 201 — — rejected:market_closed 0 —

실행 시각의 세션 실측이 이랬습니다.

venue=us-equity  local_time=2026-09-28T00:27-04:00  is_open=False  state=closed
next_open=2026-09-28T09:30-04:00   (= 22:30 KST)

그래서 이 편의 「관망이 옳았나」는 미판정입니다. 시각을 속여 돌리지 않았습니다 — 그렇게 얻은 체결은 실전 규칙을 통과한 체결이 아닙니다. 다시 재려면 22:30~05:00 KST 에 같은 레시피를 그대로 돌리면 됩니다.

접수는 됐는데 배치에서 되돌아온 회차

우리 쪽 화면입니다. close_reason 칸의 rejected:market_closed 를 보십시오 — 접수(201)와 체결은 다른 단계이고, 접수만 된 것은 손익이 없습니다. 한도도 되돌아옵니다(체결이 한 번도 없었으니까요). 이 화면이 「빈칸」과 「실패」를 구분해 줍니다.**

4.1 그래도 이 편에서 틀 하나가 섰습니다

레벨형 도구는 방향만이 아니라 진입가로도 "지금은 아니다"를 말합니다. 그 진입가와 현재가 사이의 거리가 그 도구의 대기 폭이고, 반사실은 그 폭이 실제로 벌렸어야 할 값인지를 잽니다.

27 의 대기 폭은 −2.07% 입니다(227.30 → 222.60). 그리고 미국 주식의 왕복 비용은 수수료 0 + 매도세 0.00206% 라 그보다 두 자릿수 작습니다.

여기서 나오는 결론이 이 편의 알맹이입니다. 비용이 대기 폭보다 훨씬 작으므로, 이 도구의 「기다림」은 비용으로는 정당화되지 않습니다. 눌림이 실제로 왔는지로만 정당화됩니다.

크립토는 정반대였습니다. 같은 회차에서 잰 binance-spot 왕복 비용은 0.2223~0.2224% 이고, 그 뜻은 "10분 안에 0.222% 만 움직이면 그 관망은 틀린다" 입니다. 관망의 값어치는 판단이 아니라 거래소가 정합니다.

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

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

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

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

이 편이 미판정으로 끝난 이유도 결국 같은 뿌리입니다 — 판정이 난 그 시각에 자동으로 나갔어야 했는데, 몰아서 냈더니 장이 닫혀 있었습니다.


5. 이 조합의 한계

① 표본 하나로는 아무 말도 못 합니다. 이 편은 표본이 0건입니다(둘 다 미체결). 한 건이 있었어도 마찬가지입니다 — 관망 한 건이 손실로 끝났다고 그 관망이 옳았던 게 아닙니다. 분포가 필요합니다.

② 반사실은 한쪽만 잽니다. "샀으면 어땠나"는 잴 수 있지만 "안 사서 무엇을 아꼈나"는 여전히 판단입니다.

③ 우리는 그 도구가 옳다/틀리다를 말하지 않습니다. 재고 기록할 뿐입니다. 이 회차는 재지도 못했고, 그 사실을 그대로 적는 것이 이 절의 일입니다.

④ 이 회차는 미판정입니다. 폐장이라 체결이 없었습니다. 위 4.1절의 대기 폭 −2.07% 와 비용 비교는 기록된 값끼리의 산술이고, 반사실 거래로 확인된 것이 아닙니다. 그 구분을 흐리지 마십시오.

⑤ 이 도구의 시세는 웹 검색입니다. 같은 날 현재가가 $222.27 과 $270.34 로 갈리는 자료 위에서 진입가와 손절가가 계산됩니다. r2·r3 이 쓴 $222.27 은 실제 종가보다 5달러 낮습니다. 반사실은 그 오염을 그대로 물려받습니다.

⑥ 지평이 창에 안 들어갑니다. 3–6개월짜리 판단을 10분 창으로 잰 것은 그 지평의 판단이 아니라 「지금」의 판단입니다. 7일로 자르는 것도 마찬가지입니다 — 반올림은 값을 보정하지만 절단은 판단을 바꿉니다.

⑦ 관망의 값어치는 거래소가 정합니다.

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

⑧ 합성 호가입니다. 위 절차에서 확인된 것은 배선과 계약(접수 코드·거절 사유·CSV 열)이고, 거래소 성능이나 실제 수수료 실증이 아닙니다.


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

쓰십시오 — 레벨형 도구라면. 이 편의 교훈이 그것입니다. 방향만 보면 이 도구의 관망이 안 보입니다. 진입가와 현재가의 거리를 보십시오. 그게 그 도구가 "지금은 아니다"라고 말하는 방식입니다.

쓰십시오 — 대기 폭과 왕복 비용을 비교하고 싶다면. 계산 자체는 간단합니다(대기 폭 ÷ 왕복 비용). 값은 그 비율이 어느 쪽으로 크게 기우는지에 있습니다. 두 자릿수 차이면 「기다림」은 비용 논리로 설명되지 않는다는 뜻입니다.

쓰지 마십시오 — 장이 닫힌 시각에. 이 회차가 그래서 미판정입니다. 미국 주식 반사실은 22:30~05:00 KST 에 내십시오. 접수는 언제든 되지만 접수와 체결은 다른 단계입니다.

쓰지 마십시오 — 도구의 지평을 재고 싶다면. 168시간 상한에 걸립니다. 잰 것이 「지금」인지 「그 지평」인지를 글에 매번 적으십시오.

쓰지 마십시오 — AVOID 기록을 찾아서. 1.1절에 적은 대로 그 값은 서식 자리표시자거나 스키마 버그의 산물입니다. 이 도구의 진짜 관망은 진입가에 있습니다. 기록을 읽을 때 무엇이 판단이고 무엇이 기본값인지부터 가르십시오.


이 글의 증거: A축 반사실 측정 기록 · 케이스별 요청·응답 원문 · 이 편의 레시피 · 도구 쪽 실행 기록. 위 숫자는 전부 그 기록에서 가져왔고, 미판정으로 끝났다는 것도 같은 기록에 있습니다.