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 가 나오는 곳은 두 군데뿐입니다.
- 서식 자리표시자 — 지시문 안의
DIRECTION: <LONG / SHORT / AVOID>. 판단이 아니라 빈칸의 모양입니다. - 스키마 버그의 산물 — 기록에
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축 반사실 측정 기록 · 케이스별 요청·응답 원문 · 이 편의 레시피 · 도구 쪽 실행 기록. 위 숫자는 전부 그 기록에서 가져왔고, 미판정으로 끝났다는 것도 같은 기록에 있습니다.