원칙을 한 층 내려 다시 세우다

AI의 정직한 수익률 답변이 자동매매 봇의 1번 원칙과 충돌했고, 폐기하는 대신 한 층 아래로 내려 재정의한 기록.

하려던 것

자동매매 봇 일주일째. 뼈대는 룰 엔진이 시그널을 만들고 LLM은 APPROVE/REJECT/REDUCE 심사만 하는 하이브리드다. 킥오프 때 1번 원칙으로 박은 “LLM은 주문을 생성할 수 없다”는 코드 경로 수준 강제까지 증명시켰다. 돈이 걸린 시스템이니까.

사실 이번 주에 설계를 뒤집은 게 이번이 처음도 아니다. 이틀 전엔 실행 모드가 도마에 올랐다. 원래 설계는 MOCK/DRYRUN/LIVE 3모드였는데, 개발 환경이 곧 모의투자(가짜 돈)인데 그 위에 왜 또 가짜 모드가 필요하냐고 따졌더니 Claude가 바로 승복했다 — MOCK은 “행동”이 아니라 개발 환경 그 자체라며 모드 하나를 통째로 걷어냈고, 환경(dev/prod)과 드라이런 플래그의 2축으로 단순해졌다. 반박 한 번에 축 하나가 사라지는 걸 보고 나니, 설계는 확정본이 아니라 계속 두들겨야 하는 물건이 됐다.

그리고 토요일, 문득 수익률 예측을 물었다. Claude Code의 답은 정직했다. 장기 연 4~8%.

어떻게 시켰나

이러면 적금과 큰 차이가 없을 것 같은데.

안전함이 목적을 잡아먹고 있었다. 그래서 비전을 다시 선언했다.

나는 LLM을 투자 전문가처럼 정보를 습득하는 파이프라인을 구축하고 싶은 거다.

심사관을 전략가로 올리자는 얘기 — 내 입으로 1번 원칙을 폐기하는 선언이었다.

어디서 막혔나

1번 원칙과 “LLM이 전략을 짠다”는 정면충돌한다. 그냥 버리면 원칙이 막던 사고 — 환각이 주문으로 직행하는 것 — 까지 풀려 버린다.

오답도 겹쳤다. 계좌를 알아보는데 Claude는 “모의계좌 최대 2개, 복수 소스 일치”라고 자신 있게 답했다. 실측하니 1개만 개설됐다. 대화도 산으로 갔다. 룰 트랙, 가상 장부, LLM 트랙이 뒤섞여서 알아먹게 써 달라고 한마디 했다.

어떻게 풀었나

Claude의 해법은 폐기가 아니라 한 층 내린 재정의였다. 지키려던 건 문장이 아니라 그 아래의 안전이었다는 것. 원칙은 “가드레일은 누구도 우회할 수 없다”로 바뀌었고 ADR로 남겼다. 가드레일의 실체는 주문이 나가는 길목의 검증 계층이다 — 종목당 최대 비중, 손실 한도, 주문 수량·가격 검증 같은 하드 리밋. 전략 제안이 룰에서 왔든 LLM에서 왔든 이 관문을 통과하지 못하면 주문은 없다. 원칙의 위치만 옮겼는데, LLM을 전략가로 올리는 문이 열리면서도 환각이 주문으로 직행하는 길은 여전히 막혀 있다.

구조는 두 방식을 나란히 돌려 비교하는 A/B 2트랙이 됐다. 같은 장에서 규칙 방식은 모의계좌에 실제 주문을 내고, LLM 방식은 계좌가 없으니 DB 장부 위의 가상 체결로 산다. 어느 쪽이 나은지는 성적표가 말하게 두기로 했다. 용어도 넷으로 못 박았다. 규칙 방식, Claude 방식, 모의계좌, 실전계좌. 통일하고 나서야 대화가 다시 맞물렸다.

배운 점