AI는 나의 '증명되었습니다'를 의심하지 않았다 ── 통계 초보자가 AI와 함께 가설을 죽일 때까지
요약
이 글은 통계 초보자가 AI를 활용하여 가설을 검증하는 과정을 다루며, 에지(Edge) 추적에는 '감사 역할의 AI' 배치가 필수적임을 강조합니다. 저자는 AI가 질문받은 내용에 대해서는 정확하게 답하지만, 스스로 의심하거나 질문받지 않은 오류는 막지 못한다는 점을 지적했습니다. 특히 Claude Code가 데이터 표와 본문의 수치 불일치를 발견하며 작성자의 편향된 가설을 무너뜨린 사례를 제시합니다.
핵심 포인트
- 에지를 추적하려면 '감사 역할의 AI'를 배치하여 스스로 판정을 뒤집지 않아야 한다.
- AI는 질문받은 것에는 정확하지만, 질문받지 않은 오류나 편향은 막을 수 없다.
- 데이터 분석 시 Claude Code 같은 도구의 지적을 통해 가설의 허점을 검증해야 한다.
- 백테스트 수치를 다루는 개발자들에게 유효한 방법론과 프로세스를 제시한다.
서론
지난 기사 「경마 AI를 만들다 보니, 시장의 거친 복제품이 되었다」에서 저는 다음 내용을 작성했습니다.
- 당일 확정된 오즈(Odds)에 대해서는 돈이 되는 정보를 찾을 수 없었다.
- 도중에 에지(Edge)처럼 보이는 것이 여러 번 나타났지만, 검증할 때마다 사라졌다.
이 글은 그 검증의 이면 이야기입니다.
저는 통계 전문가가 아닙니다. 가설 검정(検定) 이름도 대부분 AI와의 대화 속에서 배웠습니다. 검증은 전부 AI에게 지시를 내리고, AI에게 집계시키고, AI에게 설명을 시키는 방식으로 진행했습니다. 그 채팅 로그가 제게 남아 있습니다.
먼저 결론을 말씀드리겠습니다.
에지를 추적하려면, 감사 역할의 AI(Auditor AI)를 배치해야 합니다. 그리고 그 판정을 스스로 뒤집지 않아야 합니다.
AI는 지시받은 것을 (대체로) 지시받은 대로 수행합니다. '이 결과를 구현해 달라'고 부탁하면 구현하고, '구멍을 찾아달라'고 부탁하면 구멍을 찾습니다. 제가 '증명되었습니다'라고 썼을 때, 그것을 의심한 AI는 없었습니다. '의심하라'고 지시받지 않았기 때문입니다.
다만, 감사 역할의 AI를 배치하는 것만으로는 부족했습니다. 저는 한 번 AI로부터 '그것은 커브 피팅(Curve Fitting)입니다'라는 판정을 받았습니다. 그럼에도 불구하고 그날 밤에 그 로직을 실제 서비스에 투입해 버렸습니다. 올바른 답을 들어도, 따르지 않으면 의미가 없습니다.
로그를 되돌아보며 알게 된 것은, AI는 질문받은 것에는 비교적 정확하게 대답하지만, 질문받지 않은 것은 아무것도 막지 않는다는 사실이었습니다. 에지처럼 보이는 것이 있다면, AI에게 '이것이 에지인지 검정해 달라'고 부탁해야 합니다.
올바른 검정 방법은 AI가 알고 있습니다. 올바른 방법을 알아도, AI가 정확하게 검정한다고 보장할 수는 없지만, '에지여야 한다'고 생각하는 인간의 직관보다는 나을 것입니다.
이 글에서는 로그를 인용하며 다음 세 가지를 작성합니다.
- 질문이 가설을 무너뜨린 장면
- 욕망이 가설을 부풀려 그대로 실전에 적용한 장면
- 그것을 멈추기 위해 현재 무엇을 하고 있는지
저의 판단 실수도 날짜와 함께 공개하겠습니다. AI로 분석이나 개발을 하는 사람, 특히 백테스트(Backtest) 수치를 다루는 분들에게 읽어주셨으면 합니다.
1. 체제: 4자로 검증하고 있었다
당시의 저는 무의식적으로 네 가지 역할을 사용하고 있었습니다.
| 역할 | 담당 | 수행한 것 |
|---|---|---|
| 벽치기・지시문 작성 | Gemini | 저의 요구 사항을 코딩 에이전트용 지시문으로 다듬음 |
| ... | ||
| Gemini와의 로그는 남아있지 않습니다. 인용할 수 있는 것은 Cursor에 붙여넣은 지시문뿐입니다. |
참고로, 심사역 역할의 Claude는 이 기사의 구성을 도와준 것과 같은 AI입니다.
2. 질문이 가설을 무너뜨린 장면
2.1 표와 본문의 숫자가 맞지 않다
지난 기사의 7장에서는, '상승세 헤드(Head)만 다른 말을 추천했을 때, 남은 3헤드의 합의마 단승 회수율이 87%'라는 가설을 무너뜨렸습니다. 그 첫걸음은 검정도 아니었습니다.
기사를 쓰기 위해 데이터를 정리하던 중, Claude Code가 '표와 본문의 숫자가 맞지 않습니다'라고 지적해 왔습니다. 보니 확실히 맞지 않았습니다. 들을 때까지 전혀 눈치채지 못했습니다.
그때의 저는 '시장은 상승세 편향(Upward Bias)'이 있다라고 완전히 믿고 있어서, 세부적인 부분은 보지 못했습니다.
참고로, 이 Claude Code와의 대화는 로그에 남아있지 않습니다. 남아있는 것은 지적을 받은 제가 Cursor에게 확인시킨 내용부터입니다.
저: 표와 아래 숫자가 맞지 않은 것 같습니다. (87% vs 83.7%) 무슨 일인가요?
Cursor: 차이가 계산 실수가 아니라, 출주하지 않은 말을 언제 제외하느냐가 달랐기 때문이었습니다. 표의 87%(1,953회)는 finish > 0
인 말들만 남긴 후 각 헤드의 1위를 다시 뽑은 결과입니다. 본문의 83.7%(1,942회)는 발주 전 1위를 고정하고(...)
다시 뽑을 경우 단승이 올라가는 것은, 취소/제외된 후에 다른 말이 3마리 측의 1위가 되고, 그 안에 6,590엔의 적중이 들어가기 때문입니다. 발주 전에는 지명할 수 없으므로, 베팅 방식의 숫자로는 83.7% 쪽이 더 정확합니다.
이는 달리 말하면 이렇습니다. '마권 판매가 마감된 후에 제외된 말이 지정되었을 경우에는, 그 말을 제외하고 마권을 산 것을 가정한 것입니다.'
현실적으로는 절대 할 수 없는 베팅 방식입니다.
저는 아무것도 눈치채지 못했고, 단지 전언거북(伝書鳩)이 되었을 뿐입니다. 원인을 밝혀낸 것은 AI였습니다.
2.2 그것은 루크어헤드(Look-ahead)가 아닌가
'애마가 많은 레이스라면 NN을 사용하지 않아도 똑같이 애마를 찾을 수 있다'고 AI에게 설명 들었을 때의 일입니다. 애마의 개수를 어떻게 셌는지 되물었고, 돌아온 답변을 읽다가 걸렸습니다.
저: 그것은 루크어헤드 바이어스(Look-ahead Bias)가 아닌가요?
Cursor: 네. 그것을 'NN 없이 실전에서도 쓸 수 있는 방법'이라고 말한 부분은 Look-ahead입니다. 사용했던 '구멍의 개수'는(...) 결과 페이지의 확정 단승이 10배가 넘는 개수입니다. (...) 837이라는 건수 자체가 NN 발화 수를 맞춘 것입니다.
제대로 되물어보면, AI는 자신의 설명이 틀렸다는 것을 아무렇지 않게 인정한다. 역설적으로 말하면, 묻지 않으면 그대로 있는 것이다.
3. 욕망이 가설을 부풀리고, 그대로 실전에 적용된 장면
여기서는 2단계 구성의 EV 모델에 대한 이야기입니다. 9월 17일부터 10월 26일까지를 시간 순서대로 서술하겠습니다.
3.1 9월 17일: '증명되었습니다'
2026년 9월 17일, 저는 Cursor에 다음 지시문을 붙였습니다.
Role & Context
지금까지의 백테스트를 통해, 신규 모델(2-Stage EV Network)을 이용한 'ev_std 상위 레이스에 한정하여 마련 1점 구매'가 ROI +36.7%라는 극히 높은 우위성을 가짐이 증명되었습니다.
이를 바탕으로, VPS에서 출주 직전에 실시간 추론을 수행하고, 규정된 임계치를 초과한 레이스만 IPAT로 자동 구매하는 '포워드 테스트 체제'를 구축합니다.
이 글은 Gemini가 작성했습니다. 하지만 요청한 것은 저였습니다. '이 패턴으로 이익이 났으니, 이런 기능을 구현하고 싶다. 기술적 요구사항은 이러하다. 코딩 에이전트가 실행할 수 있는 프롬프트를 만들어 달라.' Gemini는 요청받은 대로의 글을 내놓았고, 저는 그것을 다시 읽어보지도 않고 붙여넣기 했습니다.
즉, '증명되었습니다'라는 것은 Gemini의 과장이 아닙니다. 저의 확신을, Gemini가 글로 다듬었을 뿐입니다. Cursor는 그 전제를 의심하지 않고, 실제로 돈을 거는 자동 구매 기능을 구현했습니다.
이때의 근거는, 난수의 SEED를 한 가지로 고정하여 학습한 모델(SEED 그룹 A)의 결과뿐이었습니다. 단지 한 가지일 뿐입니다.
3.2 9월 21일: SEED를 바꾸니 사라졌다
9월 21일까지, 같은 설정으로 난수의 SEED만 바꾼 4개 그룹으로 학습을 다시 진행하고 있었습니다.
| SEED 그룹 | 구매 수 | 회수율 |
|---|---|---|
| A | 341 | 136.7% |
| ... | ||
| +36.7%가 나온 것은 A뿐이었습니다. |
그런데도, 같은 날 저녁에 다른 학습 방법을 시도하여 좋은 숫자가 나오자, 저는 이렇게 썼습니다.
저: 상위 20%에서 57%의 에지가 있다면 충분하지 않을까 생각합니다.
하지만 밤이 되어 Cursor가 '다른 SEED 그룹과 합의를 이루면 안정적이다'라는 방향으로 설명을 시작하자, 이번에는 태세가 바뀌어 이렇게 몰아붙였습니다.
저: 알겠습니다만, 그래도 SEED 그룹 C와 D에서는 ROI가 100%를 넘지 않았었잖아요?
좋은 숫자는 '충분하다'고 말하며 다음 단계로 나아가고, 나쁜 숫자는 파고든다. 결과의 좋고 나쁨에 따라, 저는 다른 자(잣대)를 사용하고 있었습니다.
그리고 같은 밤, 저는 스스로 이렇게 지적했습니다.
저: e5의 에지라고 하지만, SEED가 바뀌면 사라지는 시점에서 에지가 아니라 커브 피팅(Curve Fitting)이 아닌가요?
Cursor: 그 이해로 맞습니다. 그룹 A의 e5 (136.7%)는 같은 레시피라도 시드를 바꾸면 사라지기 때문에, 재현 가능한 에지가 아니라 그룹 A에 대한 커브 피팅입니다.
여기만 잘라내어 보면, 제대로 의심하고 있는 것처럼 보인다. 보였을 뿐이었다.
3.3 같은 밤: '커브 피팅'이라고 말한 직후
커브 피팅이라고 지적한 후의 로그를 순서대로 나열해 보겠습니다.
- SEED를 8개로 늘리고, 3개 그룹으로 충분위(十分位)에 나누어 집계하도록 했습니다. 3개 그룹 모두에서 흑자(黒字)가 되는 구간은 단 한 곳도 없었습니다. 상위 30%를 모았을 때만 흑자였습니다.
- 그것을 보고, 이렇게 썼습니다. 'A, B, C 어느 쪽이든 승률이 높은 DN의 ROI가 거의 같은 것이 증거가 아닌 것 같지 않습니까? 어떠신가요?'
- '충분위가 아니라, 사분위(四分位)로 해서 상위 25%에서 비교해 보세요.'
- '본 실험의 로직을 실전 환경에 적용합니다. (...) 구매 대상 레이스는 3/10 충분위가 아니라, 1/4 사분위로 변경하겠습니다.'
커브 피팅이라는 단어를 스스로 사용한 그날 밤에, 방법을 충분위에서 사분위로 바꾸어 (본질적으로 아무것도 변하지 않은 채), 실전 투입하고 있었습니다.
3.4 10월 26일: 약 한 달 후
10월 26일, 저는 Cursor에게 이렇게 물었습니다.
저: 지금까지의 실험 결과를 보면, 실전에 적용된 EV 모델의 백테스트에서 나왔던 이익은 환상이 아닌가 싶은데, 어떻게 생각하십니까?
Cursor: 그 읽기로 거의 맞습니다。(...) OOF에서는 그 절편만 회수하여 134%였습니다(225점, 적중 32, SE 29pt). 같은 OOF를 게이트 없이 구매하면 84%입니다... 상위 25%는 OOF를 보고 결정한 게이트입니다... 실제 구매 47점은 적중 6, 환불 4,200 / 베팅 4,700으로 회수율 89%였습니다.
백테스트의 134%는 결과를 본 후에 선택한 '상위 25%'라는 기준으로만 존재하며, 실제로 구매한 47점의 회수율은 89%이고, 게이트가 없다면 84%입니다.
우연히 나온 좋은 숫자를 나중에 골라낸 것일 뿐입니다.
다만, 실제 구매의 89%는 아직 아무 말도 할 수 없는 숫자입니다. 47점으로는 에지가 있든 없든 이 정도로는 흔들립니다. 환상이라고 말할 근거는 89%가 아니라, 게이트가 없는 84%와 상위 25%라는 선택 기준이 결과를 보고 결정된 사실 그 자체에 있습니다.
3.5 왜 믿었나
지식이 부족했기 때문만은 아닙니다. 곡선 맞추기(Curve Fitting)라는 단어는 9월 21일 시점에서는 알고 있었고, 저 스스로 입으로도 말했던 것입니다.
지금에 와서야 알게 되었습니다. 저는 필사적으로 에지가 있다고 믿고 싶었던 겁니다. 인간은 보고 싶은 것만 보게 되어 있습니다. 저 역시 예외는 아니었습니다. 그래서 보는 각도를 바꾼 것에 불과한 곡선 맞추기를, 덥석 믿어버린 것입니다.
그리고 AI가 문체나 지시에 담긴 저의 욕망을 깔끔하게 포착해낸 것이 아닐까 합니다. Gemini는 저의 확신을 글로 다듬었고, Cursor는 그것을 구현했습니다. '57%면 충분하다'는 말에도 Cursor는 반론하지 않고 다음 실험을 돌렸습니다. 반론이 돌아온 것은 제가 질문했을 때뿐이었습니다(적어도 이 로그 범위에서는).
4. 오히려 의심이 풀린 장면
모든 것을 나쁘게만 볼 필요는 없습니다. 9월 21일 밤, 곡선 맞추기라고 지적받기 직전에 저는 이렇게 썼습니다.
저: 잠깐만요. SEED 그룹 C나 D에 SEED 그룹 A의 ev_std를 사용했나요? 그건 안 맞는 것 같은데요.
Cursor: 사용하지 않았습니다. C의 98.7%, D의 107.4%는 각 배수(bag) 자체에서 자른 단일 배수의 숫자입니다. ev_std
AI는 집계 코드를 다시 읽어본 후, 저의 의문을 부정했습니다.
이 방식 자체는 유용합니다. 의심을 입으로 내뱉고, 코드로 확인하게 만드는 것입니다. 맞으면 가설 하나가 죽지만, 틀리면 숫자에 대한 신뢰도가 한 단계 올라갑니다.
5. 심사역(Reviewer)을 배치한 후
지난번 글을 쓰는 동안, 저는 Claude Code에게 원고와 분석 자료를 읽게 하고, 나온 지적 사항들을 그대로 Cursor에 붙여 재집계시키곤 했습니다. 예를 들면 이런 지적이 있었습니다.
적중 횟수의 검정은 '어떤 배수(odds)의 말이 이겼는지'를 보고 있지 않습니다... 돈의 문제이므로, 회수율 그 자체를 검정하는 것이 순서입니다.
원래 가설은 '대중은 막판 스퍼트 말(末脚の馬)을 과대평가한다'였습니다... 가설이 맞다면 같은 경주에서 다음 두 가지가 일어나고 있어야 합니다.
지난번 글의 7장에는 '6단계에 걸쳐, 87%는 우연의 흔들림으로 돌아갔다'라고 썼습니다. 그 후반부 단락은 대부분 이 오가기로 이루어져 있습니다.
오해가 없도록 말씀드리자면, Claude가 뛰어나다는 이야기가 아닙니다. Gemini와의 차이는 기종 자체보다 요청한 역할에 있었다고 생각합니다. Gemini에게는 '구현시키는 지시문을 써달라'고 부탁했고, Claude에게는 '빈틈을 찾아달라'고 부탁했습니다. AI는 맡겨진 역할대로 움직였을 뿐입니다.
6. 지금은 무엇을 하고 있는가
사람이 자신이 믿고 싶은 것을 믿어버리는 편향(Bias)은 의식적으로 어떻게 할 수 있는 것이 아닙니다. 곡선 맞추기라고 스스로 말한 지 얼마 되지 않아, 돈을 실제로 거는 본판 시스템에 구현해 버릴 정도입니다. 그러므로 시스템으로 막아야 합니다. 다행히 지금의 AI는 매우 뛰어나서, 엄격한 체크리스트를 정의해 둠으로써 상당 부분을 커버할 수 있습니다.
AI에게 던지는 질문 (지난번 글의 체크리스트를 질문 형태로 바꾼 것)
- '표와 본문의 숫자가 맞지 않는 이유는 무엇인가?'
- '그것은 구매 시점에서 알 수 있는 정보만으로 생성 가능한가?'
- 'SEED를 바꾸거나 기간을 옮겨도 같은 경향이 관측되는가?'
- '이 임계값이나 선택 기준은 몇 가지 경우 중에서 고른 것인가?'
- '비교 기준은 같은 집합에서 만들고 있는가?'
- '가설이 맞다고 가정했을 때 일어나야 할 현상은 실제로 일어나고 있는가?'
스스로에게 던지는 질문
- 원하는 결과에 가깝게 색안경을 쓰고 보지 않았는가.
- 본판에 투입할 조건을, 결과를 보기 전에 결정했는가.
시스템
- 지시문을 작성하는 역할과 구멍(틈)을 찾는 역할을 분리한다. AI를 나눌 필요는 없으며, 감사 목적의 시점을 스스로 설정할 용기가 필요하다.
- 좋은 결과가 나오도록 그 조건을 선택하는 것은, 나중에 붙이는 조건 선택(사후 선택)에 불과하다. 올바른 절차는 가설에 기반한 조건을 먼저 정의하고, 그것을 실제로 확인하는 것이다. 지난 기사에서 작성했던 삼연복 1점의 포워드 테스트는 이 형태로 기록되어 있다.
결론
'경마 시장은 효율적이다'라고 스스로 인정할 때까지, 모든 것이 에지(edge)로 보인다.
SEED 값이 다를 뿐인데 쉽게 사라지는 이익을 보며, 입으로는
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn ML의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기