daily_stock_analysis 의 「관망」을 채점하기 — 이관에서 안 서던 가격 네 칸이 반사실에서는 섭니다

25편 daily_stock_analysis 가 NVDA 에 낸 `관망`을 계좌를 건드리지 않고 실제 주문으로 내 봤습니다. 폐장이라 미판정으로 끝났고, 그 대신 이 도구의 가격 네 칸이 왜 반사실에서만 주문 세트로 서는지가 드러났습니다.

daily_stock_analysis 의 「관망」을 채점하기 — 이관에서 안 서던 가격 네 칸이 반사실에서는 섭니다

이 글의 완료 조건: 독자가 자기 도구의 관망·hold 한 건을 골라, 그 도구가 낸 가격 칸을 하나도 지어내지 않고 반사실 주문 두 건(롱·숏)으로 옮길 수 있으면 성공입니다. 미국 주식이면 세션까지 확인하고요.

하는 일 도구가 「지금은 사지 마라」고 한 그 시점에 지금 사는 주문과 지금 파는 주문을 각각 내고, 계좌를 건드리지 않은 채 끝까지 끌고 갑니다
맞는 사람 판단과 함께 가격 레벨을 내는 도구를 쓰는데, 그 레벨이 주문으로 성립하는지 확인해 본 적이 없는 사람
안 맞는 사람 미국 주식을 한국 낮 시간에 재려는 사람. 폐장이면 미판정입니다 — 그게 이 글의 절반입니다
이 글의 결과물 도구의 네 칸이 어느 자리에서 서고 어느 자리에서 무너지는지를 보여 주는 대조 한 장, 그리고 세션을 스스로 확인하고 멈추는 레시피
준비물·비용 코드 0원 · 모델 비용 0원 · weltiq pro 계정
시간·난도 도구 기록이 이미 있다면 20분 · 중 (curl·JSON)
weltiq 와의 관계 이 글이 전부 그 이야기입니다 — 절차 글이라 5절이 따로 없습니다
검증 환경·날짜 2026-09-28 (KST) · 격리 서버 · 합성 호가 · 미국 주식 폐장 시간 (5절에 한계를 그대로 적었습니다)
제휴 고지 필자는 weltiq 로부터 이 연재의 원고료를 받습니다. 이 회차는 주 판정이 미판정으로 끝났고, 그 사실을 감추지 않고 글의 일부로 썼습니다

사람 쪽 문장은 실제로 친 명령을 대화로 옮긴 것이고, 출력은 실측이며 숫자는 손대지 않았습니다.


1. 이 도구가 남기던 빈칸

25편에서 daily_stock_analysis 를 돌렸습니다. 이 도구의 간판은 판정 한 줄 + 가격 네 칸입니다. NVDA 를 넣으면 이렇게 나옵니다(raw/levels-verbatim.txt, 일괄 분석 1회차):

symbol: NVDA
decision_type: hold      operation_advice: 관망     confidence_level: 중간
ideal_buy: 219.01   secondary_buy: 219.16   stop_loss: 218.9   take_profit: 230.0

NVDA 결정 대시보드. 상단에 227.38달러, 대응 전략 「관망」, 추세 전망 「횡보」가 있고 아래에 대응 가격대 카드 네 장이 붙어 있습니다. 보실 곳은 **판정 한 줄과 그 아래 네 칸이 같은 화면에 있다는 것** — 이 도구는 "사지 마라"면서 살 가격을 같이 줍니다

근거 숫자도 같이 냅니다(RUN-LOG.md:123): 종가 227.38 · MA5 219.01 · MA20 219.36 · 이격 +3.82% · MACD DIF 1.4828 < DEA 1.5377 · 저항 234.50. 그리고 5회 독립 판단이 전부 hold/관망이었습니다(RUN-LOG.md:125) — 흔들리지 않는 판정입니다.

대응 가격대 카드 네 장을 확대한 화면입니다. 이상적 매수가 설명에 「현재는 역배열이고 이 가격이 MA20 아래이므로 매수 주문 가격이 아닙니다」가 적혀 있습니다. **도구 스스로 이 숫자가 지금 주문이 아니라고 말하고 있습니다** — 이 한 줄이 2절의 전부입니다

이관에서는 이 네 칸이 안 섭니다

앞서 이관 검증(part3)에서 이 네 칸을 그대로 주문에 넣어 봤습니다. 결과가 이랬습니다.

칸 이관에서
stop_loss 218.90 들어간다
take_profit 230.00 들어간다
ideal_buy 219.01 칸이 없다 — 시험 주문에 진입 조건 자리가 없습니다
secondary_buy 219.16 칸이 없다

간판인 네 칸의 절반이 버려집니다. 게다가 남은 둘도 배치가 이상합니다 — ideal_buy 219.01 과 stop_loss 218.90 이 0.05% 붙어 있습니다. 219.01 에 사서 218.90 에 손절하면 손절 폭이 0.05% 입니다. 그리고 2회차에서는 손절(219.36)이 매수가(219.01) 위로 올라왔습니다(docs/tutorials/a/25-daily-stock-analysis.md:184).

부수로 하나 더 나왔습니다 — 그 역전된 값을 그대로 보내도 201 입니다. 계약은 take_profit > stop_loss 만 봅니다. 진입가와의 모순은 안 잡습니다.

여기가 빈칸입니다. 판정은 다섯 번 다 같은데, 그 판정이 옳았는지 잰 적이 없고, 같이 나온 네 칸은 주문으로 옮기면 무너집니다.


2. 왜 지금까지 못 쟀나

「안 사기로 한 판단」의 성적표가 지금까지 비어 있던 이유는 단순합니다.

재려면 사 봐야 하고, 사면 계좌가 움직입니다. 자본이 묶이고, 손실 한도를 갉아먹고, 성과 집계에 섞입니다. 재는 행위가 재려는 대상을 망가뜨립니다.

이 도구는 특히 그렇습니다. 관망 을 재려면 227.38 에 사 봐야 하는데, 그건 도구가 「사지 마라」고 한 바로 그 가격입니다. 실계좌에서 그걸 할 사람은 없습니다.

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

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

그리고 여기서 네 칸이 제자리를 찾습니다

이게 이 편의 핵심입니다.

이관에서는 ideal_buy 219.01 이 진입가입니다. 그 자리에 두면 손절 218.90 이 0.05% 붙고, 2회차에서는 아예 역전됩니다. 주문 세트로 안 섭니다.

반사실에서는 진입이 현재가입니다. 도구가 기다리라고 한 219.01 을 기다리지 않고 지금 삽니다. 그 순간 배치가 이렇게 바뀝니다.

이관 (진입 = ideal_buy 219.01) 반사실 (진입 = 현재가 227.30)
stop_loss 218.90 진입에서 0.05% — 손절이라기엔 붙어 있다 진입 아래 — 손절로 제자리
take_profit 230.00 진입에서 +5.0% 진입 위 — 목표로 제자리
2회차 stop_loss 219.36 매수가 위 — 역전 진입 아래 — 문제없다
세트가 서나 안 선다 선다

같은 숫자가 이관에서는 못 쓰이고 반사실에서는 쓰입니다. 도구가 틀린 값을 낸 게 아니라, 그 값이 「눌림 대기 주문」의 부품이라서 지금 주문의 부품 자리에 안 맞았던 것입니다. 진입을 현재가로 옮기는 순간 제자리를 찾습니다.


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

레시피 한 장을 올려 뒀습니다: 08-trial-order-daily-stock-analysis-wait.sh. 다섯 칸입니다.

칸 무엇
⓪ 세션 GET /v1/capabilities 로 us-equity 가 열려 있나 먼저 봅니다. 닫혀 있으면 멈춥니다
① 심기 롱 한 건 + 숏 한 건. client_tracking_id 를 심습니다
② 회수 GET /v1/forward-tests?tracking=<런 ID> — 정확 일치, 내 계정 안에서만
③ 집행 기록 GET /v1/forward-tests/orders?format=csv&tracking=… — 계정 전체를 한 번에
④ 조인 추적 ID + client_order_id 로 도구 로그와 잇습니다

의도는 도구가 갖습니다. 서버로 가는 것은 client_order_id·client_tracking_id·문자열 metadata 뿐이고, 판정(관망)·확신도(중간)·근거(MACD 데드크로스)는 tool_log.csv 에만 씁니다. metadata 에 숫자를 실을 일이 있으면 문자열로 실어야 합니다 — float 을 넣으면 canonical_json 이 결정론 규칙으로 거부해서 500 입니다.

롱은 왜 롱이고 숏은 왜 숏인가

롱 — 도구는 "219.01 까지 내려오면 사라, 지금은 아니다"라고 했습니다. 그 반대로 지금 시장가로 삽니다. 청산 조건은 도구가 낸 숫자 그대로:

{"symbol": "NVDA", "side": "long",
 "exit_plan": {"stop_loss": "218.90", "take_profit": "230.00", "close_after_seconds": 600}}

숏 — 이 도구는 명시적으로 하락을 시사했습니다: MACD 데드크로스 · 역배열 · MA5 대비 +3.82% 이격 · "추격 금지: 5일선 대비 +5% 초과 시 매수 안 함". "하락 예측이 아니다"라는 유보가 없습니다. 그래서 숏을 따로 한 건 냈습니다. 목표·손절 둘 다 도구가 낸 숫자이고 역할만 뒤집었습니다:

{"symbol": "NVDA", "side": "short",
 "exit_plan": {"take_profit": "219.01", "stop_loss": "234.50", "close_after_seconds": 600}}

219.01 은 도구의 ideal_buy(= MA5), 곧 도구가 지목한 눌림 도착점입니다. 234.50 은 도구의 저항이고 채팅 3/3 회 동일했습니다. 새 숫자를 하나도 안 만들었습니다.

숏에는 고지가 하나 붙습니다 — 미국 주식 숏의 대차수수료가 0 으로 계산됩니다. 10분짜리라 영향이 작지만, 길게 들면 기록이 시장보다 유리해집니다.


아래 숫자의 환경: 격리 임시 서버 · 합성 호가 · 운영이 아닙니다 · 손익은 시장 사실이 아닙니다.

4. 돌려 본 결과

둘 다 201 이었고, 둘 다 체결되지 않았습니다.

케이스 응답 진입가 청산가 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)

우리 쪽 화면 — 201 로 접수됐지만 배치에서 rejected:market_closed 로 되돌아온 건입니다. 보실 곳은 **접수(201)와 집행(거절)이 다른 단계라는 것** — 방향도 청산 계획도 검증을 통과했고 세션에서 막혔습니다

시각을 속여 돌리지 않았습니다. 폐장을 우회해 얻은 체결은 실전 규칙을 통과한 체결이 아닙니다. 그래서 레시피 ⓪이 세션을 먼저 보고 닫혀 있으면 스스로 멈춥니다. 22:30~05:00 KST 에 같은 스크립트를 그대로 돌리면 같은 기준으로 판정됩니다.

미판정이 공짜인 것도 실측했습니다

이 거절은 한도를 안 씁니다. 같은 회차에서 접수 16건 중 used 는 7 이었고, 7은 실제로 체결된 크립토 진입 수와 정확히 같았습니다 — rejected:market_closed 9건이 전부 환불됐습니다. 체결이 한 번도 없었으니까요.

그리고 계좌는 움직이지 않았습니다. 시작 전과 끝난 뒤에 계좌 관련 표 아홉 개를 전량 비교해 완전히 동일했습니다(account_unchanged_vs_T0: true).

우리 쪽 시험 목록 — 이 런의 건들이 추적 ID 하나로 모여 있는 화면입니다. 보실 곳은 **상태 열** — 접수는 됐는데 체결이 없는 건과 끝까지 돈 건이 같은 목록에서 구분됩니다

그래도 이 회차가 답한 것

주 판정은 미판정입니다. 그런데 2절의 질문에는 답이 나왔습니다 — 도구의 네 칸을 반사실 배치로 옮기면 접수 검증을 그대로 통과합니다. 롱은 stop 218.90 < 진입 < tp 230.00, 숏은 tp 219.01 < 진입 < sl 234.50. 둘 다 422 를 안 받았습니다.

이관에서 「주문 세트로 성립하지 않는다」고 적었던 그 숫자들이, 진입을 옮긴 것만으로 계약을 통과합니다. 이건 폐장과 무관하게 확인된 것입니다 — 접수 검증은 세션 이전 단계에서 돌기 때문입니다.

Ask 화면. 왼쪽에 질문 이력이 쌓여 있고 오른쪽 답변에 MACD DIF 1.4828 < DEA 1.5377 표와 조건부 거래 계획이 적혀 있습니다. 보실 곳은 **「제가 제안하는 조건부 거래 계획」** — 도구는 조건부 계획을 말로 냅니다. 그 조건을 기다리지 않고 지금 집행한 것이 이 글의 반사실입니다


5. 이 조합의 한계

① 표본 하나로는 아무 말도 못 합니다. 이번에는 표본이 영입니다. 폐장이라 체결이 없었습니다. 판정 한 건이 나왔더라도 그 한 건으로 관망의 옳고 그름을 말할 수 없습니다 — 분포가 필요합니다.

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

③ 우리는 그 도구가 옳다/틀리다를 말하지 않습니다. 재고 기록할 뿐입니다. 이 글이 말한 것은 "25 의 관망이 옳았다"가 아니라 "그 관망을 재려면 이렇게 내면 되고, 이번엔 폐장이라 못 쟀다" 입니다.

④ 미판정은 미판정입니다. 0 으로 채우지 마세요. 안 잰 것과 0 은 다릅니다. 이 회차의 두 건은 채점 표에서 빠져야 합니다.

⑤ 진입가를 우리가 골랐습니다. 도구는 「지금 사라」고 한 적이 없습니다. 반사실의 진입 시점은 필자가 정한 것이고, 그 선택이 결과를 만듭니다. 판정이 난 그 시각에 내야 이 선택이 사라지는데, 이번엔 사후 배치라 그러지 못했습니다.

⑥ 도구의 지평선과 창이 다릅니다. 25 의 레벨은 일 단위를 전제로 하는데 이번 창은 10분이었습니다. 도구의 지평선에 맞춘 한 벌이 따로 필요합니다.

⑦ 미국 주식 숏의 대차수수료가 0 입니다. 짧게 쓰면 티가 안 나지만 오래 들면 기록이 시장보다 유리해집니다.


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

쓰세요.

쓰지 마세요.


이 글의 증거: A축 반사실 측정 기록 · 케이스별 요청·응답 원문 · 이관 판정 · 레시피. 원 도구 회차는 25편 daily_stock_analysis에 있습니다.