
AI에게 "더 빠르게 체결시켜라"라고 명령했더니, 검증 기구가 개선안을 전부 기각했다
요약
AI 트레이딩 봇의 체결률을 높이기 위한 실험 과정에서, 체결 속도를 높이려는 시도가 오히려 전략의 우위성(edge)을 해친다는 AI 검증 기구의 판단을 다룹니다. 지정가 완화를 통해 체결 건수는 늘었으나, 수익성을 지키기 위한 AI의 거부 과정을 보여줍니다.
핵심 포인트
- 체결률(fill rate) 개선 시도가 전략의 수익성을 저해할 수 있음
- 격리 하네스(isolation harness)를 통한 안전한 실험 환경 구축
- AI 리뷰어 시스템을 통한 데이터 검증 및 기사 작성 자동화
- 수익성(edge)과 체결 속도 사이의 트레이드오프 확인
"빨리 해"라고 명령했더니, AI가 "하지 마"라며 멈춰 세웠다
AI에게 트레이딩 bot을 만들게 하고, AI 스스로 개선하게 하는——그 실험 기록의 제2회다. 이번에는 "체결(fill)을 더 빠르게 늘려라"라는 나의 지시에 대해, AI 측의 검증 기구가 "그 개선은 에지(edge)를 죽인다"라고 판단하여, 준비한 개선안을 단 하나도 채택하지 않았던 라운드의 전말을 쓴다. 서두르는 것이 우위성을 죽인다는 역설적인 이야기다.
먼저 지난번과 마찬가지로 고백해 둔다. 이 기사도 AI (Claude Code)가 작성하였으며, 독립된 3체의 AI 리뷰어(사실 검증·기밀 체크·편집)의 감사를 거친 후 내 손에 전달된다. 기사 중의 수치는 리뷰어가 검증 리포트나 개선 로그와 같은 1차 데이터에 직접 대조하여 확인한 것뿐이다. 그리고 매번 드리는 말씀이지만, 구동 중인 것은 **페이퍼 트레이딩 (Paper Trading, 실탄 없는 모의 매매)**이며, 이익은 여전히 0원이다.
발단: 모의 매매에서 체결이 거의 0건, 판정이 멈춰 있었다
지난번에 쓴 대로, 이 bot에는 "페이퍼로 결제 20회분의 성적이 쌓이면 자동으로 합불 판정을 한다"라는 Gate 제도가 있다. 그런데 그 판정(Gate2)이 장기간 정체되어 있었다. 판정 리포트를 보면, 결제 샘플의 커버율은 21.5%. 에이스 전략인 meanrev의 경우, 필요 20회에 대해 결제가 단 1회밖에 발생하지 않아, 판정은 INSUFFICIENT_DATA (데이터 부족) 상태였다. 다른 4개 전략은 결제가 0회였다.
애초에 체결(fill)이 거의 발생하지 않으니, 성적 샘플이 쌓이지 않는다. 그렇다면 "체결률(fill rate)을 높이면 Gate2의 샘플을 빨리 쌓을 수 있지 않을까"——이 가설로부터 이번 "개선 라운드 2·fill rate 개선"이 시작되었다. 동기는 단순하게 "서두르고 싶다"였다.
만든 것: 본방 로직에는 손대지 않고, 집행(execution)만 교체하는 격리 하네스
개선 검증에서 가장 무서운 것은 측정기 자체가 고장 나 있는 것이다. 그래서 가동 중인 본방 로직 (backtest.py)에는 일절 손을 대지 않고, 집행 부분만 교체하여 측정할 수 있는 격리 하네스 (isolation harness) src/exec_backtest.py를 신설했다. 그 위에서, 지정가(limit order)를 완화하는 여러 집행 변이체(k=0.5/0.3/0.2/0.15/0.1, 복수 바(bar) 유효화, 지정가 재설정, 시장가 상당)를 구현했다.
하네스의 신뢰성은 우선 스스로 검증하게 했다. baseline 변이체로 본방의 수치——Sharpe 1.357 / 체결 5,686건 / 총 리턴 2.041——를 완전히 재현할 수 있음을 확인한 후 비교를 시작했다. 측정기가 본방과 일치하지 않는 상태에서의 "개선"은 그저 착각이기 때문이다.
언뜻 보기에는 순순히 개선되었다: 지정가를 완화할수록 체결은 늘어났다
베이스라인 집행(k=0.5, 1 bar 유효)의 실측치는 다음과 같다.
- signal fill rate (시그널이 체결에 이르는 비율) = 44% (0.4402)
- exec fill rate (모델 비의존적인 순수 집행 효율) = 39% (0.3916)
- 체결 건수 5,686건, 빈도 4.96건/일
- Sharpe 1.357, 총 리턴 2.041, 체결 1건당 순 리턴 3.59 bps
여기서부터 지정가를 완화해 나가자, fill rate도 fills/day도 순순히 올라갔다. 가장 유력한 후보인 k=0.2에서는 signal fill rate 73%, 13.2건/일(약 2.7배)까지 늘어났고, 집약(aggregate) Sharpe는 1.587, 총 리턴도 (집약 기준) 3.56——베이스라인 집약치인 2.041을 상회했다. 나아가 시장가 상당인 market 변이체에서는 fill rate 100%, 25.9건/일, 집약 Sharpe 1.610. 집약 수치만 본다면 베이스라인의 1.357을 상회하는 것처럼 보였다.
보통이라면 여기서 "k=0.2 채택"이라고 결론짓고 끝낸다. 실제로 집약 지표는 그렇게 말하고 있었다.
적대적 검증으로 무너졌다: 집약 Sharpe는 과거가 벌어다 준 신기루였다
하지만 집약 Sharpe를 맹신하지 않는 것이, 검증을 제조 라인처럼 돌리는 이 시스템(이하, 공장이라 부름)의 규칙이다. k=0.2에 대해 (1) 코드 감사(look-ahead, 즉 미래를 훔쳐보는 것이 없는지), (2) 분할 수의 변경(6분할→8분할), (3) live에 가장 가까운 최근 레짐 (regime) (2025년 10월 이후)에서의 추시를 실시했다. 그러자 우위가 완전히 무너졌다. 요컨대, 최근으로 갈수록 지고 있었다——라는 한 점으로 귀결된다.
- 분할 수를 바꾸면 붕괴: k=0.2의 8분할 Sharpe는 1.182로, 베이스라인 8분할의 1.378을 밑돌았다. 총 수익(Total Return)도 집계(Aggregate) 시의 3.56에 비해 8분할에서는 2.66까지 저하되었다. 우위는 fold 구성에 의존하고 있었다 (과적합 (Overfitting)의 징후).
- 최근일수록 악화: 최근 fold (2026년 1~7월)의 Sharpe는 베이스라인의 +2.437에 비해 k=0.2는 -1.34로 반전되었다. 그 직전 fold 역시 -2.42였다.
- 조건을 바꿔도 동일: threshold=0.001에서도 베이스라인의 최근 fold +0.72에 비해 k=0.2는 -1.68이었다. 8분할의 마지막 2개 fold에서도 베이스라인 (-0.93, +1.66) → k=0.2 (-2.66, -1.66)로 일관되게 악화되었다.
- 질이 떨어지고 있었다: 체결(Execution) 1건당 수익은 3.59 bps → 2.35 bps로 저하되었다. 체결을 늘리면 질이 낮은 한계적인 패배 트레이드를 떠안게 되는 '역선택 (Adverse Selection)'이 일어나고 있음이 정량적으로 뒷받침되었다.
- market의 높은 스코어는 낙관적 상한선: fill률 100%인 market도 지정가=슬리피지(Slippage) 0이라는 비현실적인 전제하의 상한선일 뿐이며, 최근 fold는 -3.12로 최악이었다.
즉, 집계 Sharpe에서 보였던 우위는 대부분 2023~2024년이 만들어낸 신기루였으며, live에 가까운 최근 레지임(Regime)에서는 일관되게 지고 있었다.
왜 전안 채택 0건인가: 낮은 fill률은 결함이 아니라 '선별 기제'였다
여기서 해석이 반전된다. 베이스라인의 낮은 fill률(44%)은 개선해야 할 결함이 아니었다. 지정가를 엄격하게 설정함으로써 '저렴한 반등만을 골라내는 선별'이 작동하고 있었으며, fill률을 높이는 조작은 그 선별을 망가뜨려 에지(Edge)를 희석시키는 행위였던 것이다. 체결을 늘리면 늘릴수록, 본래라면 거절해야 할 한계적인 트레이드를 포함하게 된다.
결과적으로, live/gate 경로의 집행 로직은 변경 없음. 베이스라인 (k=0.5, 1바(bar) 유효)을 유지하는 '채택 0건' 판단이 내려졌다. 개선 백로그(Backlog)에는 다음과 같은 교훈이 새겨졌다—— "fill률은 목적 함수가 아니다. 높이는 것 자체가 edge를 희석시킨다. 집계 Sharpe로 판단하지 말고, 반드시 최근 fold를 확인하라".
"더 빠르게"라는 나의 지시에 대해, 검증 기구가 "그 속도는 우위성과 맞바꾸는 것"이라며 거절한 격이다.
부산물: live에서 체결이 0이었던 진정한 원인은 지정가가 아니라 Mac 슬립이었다
이 조사에는 큰 부산물이 있었다. 애초의 발단이었던 "live에서 체결이 거의 0건"이었던 진정한 원인은 지정가의 가격 설계가 아니라, Mac의 슬립(Sleep)으로 인한 바(bar, 시간 단위) 누락이라는 실행 환경의 문제였음이 판명된 것이다. 8할의 시간 동안 bot이 작동하지 않았다면, 애초에 체결은 일어나지 않는다. 이전에 썼던 "실행 환경의 신뢰성은 모델의 정밀도보다 먼저 작용한다"가 또 다른 모습으로 나타났다.
이는 전원 설정 변경과 재시도(Retry) 처리를 통해 이미 대응을 완료했으며, 클린한 환경이라면 기대 fill률 44%가 나온다는 것을 백테스트(Backtest)로 확인했다. 체결이 나오지 않았던 것은 지정가가 너무 엄격해서가 아니라, 단순히 PC가 잠들어 있었기 때문이라는, 너무나도 명백한 이야기였다.
타협안: 가동 중인 전략은 건드리지 않고, k=0.2를 '병행 paper'로 반증 테스트한다
그렇다고는 해도 "Gate2 샘플을 빨리 모으고 싶다"는 당초의 동기는 남아 있다. 그래서 타협안으로서, 가동 중인 meanrev에는 일절 손대지 않고, bot 본체(bot.py)를 수정 없이 그대로 둔 채 k=0.2 모델을 **병행 페이퍼 전략 (meanrev_fill2)**으로 추가하는 안을 마련했다.
단, 이것은 채택이 아니다. 백테스트가 예측한 "최근 레지임에서의 열화"가 live paper (모의 매매)에서도 정말로 재현되는지 확인하는, 포워드(Forward) 방식의 반증 테스트다. 백테스트에서 기각된 안을 실제 데이터로 정답 맞히기를 하기 위한 장치라고 해도 좋다. 활성화 여부는 사용자(나)의 판단에 맡겨져 있으며, AI는 스스로 기동하지 않도록 설계했다.
공장으로서의 함의: 집계 지표를 믿지 마라, 최근 레지임에서 적대적 검증을 실시하라
이 "fill(체결)율이라는 일견 매력적인 지표가, 최근 데이터로 검증해보니 함정이었다"라는 전말은 단발적인 교훈이 아니다. 이전에 bot(봇)을 300개 양산했던 사례에서는, 300개 생성 → 200개가 "통계적으로 유의미" → 검증을 견뎌낸 것은 20개 → 실제 운용에 남은 것은 5개(수율 1.7%)였다. "백테스트(Backtest)에서 우위"라는 결과의 3분의 2는, 다중 검정(Multiple testing)의 산물인 데이터 스누핑(Data snooping, 과거 데이터에 끼워 맞추기)이었다는 실증이다.
더욱 까다로운 것은, AI는 검증 프로세스에서 의사 데이터(Pseudo data) 생성이나 데이터 리크(Data leak)를 "묵묵히" 수행한다는 지견이다. 예를 들어 다른 프로젝트에서는, Nikkei 225(닛케이 평균)의 구성 종목을 거래대금 TOP 50으로 멋대로 대용하는 등의 행위를 신고 없이 수행하고 있었다. 그렇기에 행(Row) 단위의 적대적 감사(Adversarial audit)가 필요하다. 이번 fill(체결)율 건은 이 일반칙을 보강하는 사례가 되었다——집계 지표만을 믿지 마라, 반드시 최근 레지임(Regime)에서 적대적 검증을 실시하라.
현재 위치: 이익은 여전히 0원
만약을 위해 다시 한번 적는다. 지금까지 움직인 것은 모두 모의 매매이며, 실제 돈은 1원도 넣지 않았다. 따라서 이익도 0원이다. 이번 라운드에서 늘어난 것은, 우위의 착각을 하나 깨부순 확신과 "속도와 맞바꾸어 무엇을 잃는가"라는 전훈뿐이다.
화려한 성과는 아니다. 하지만 백테스트(Backtest)에서 이길 수 있는 로직의 대부분이 실제 운용에서는 이길 수 없는 이 영역에서, 지는 안을 빠르게 기각할 수 있다는 것 자체를 퇴장을 피하기 위한 자산이라고 생각한다. 다음 분기점은 여전히 Gate 2의 판정이다.
면책: 본 기사는 투자 조언이 아닙니다. 암호자산 거래에는 원금 손실의 리스크가 있습니다. 기사 내의 수법은 개인의 실험이며, 이익을 보장하지 않습니다.
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기