본문 바로가기

실전 원칙

AI가 만든 '성공' 판정, 부호만 맞으면 통과시키는 함정 — 최소격차·표본 가드로 막는 법

문제 제기: '방향이 맞았다'와 '차이가 있다'는 다르다

데이터로 두 그룹을 비교할 때 가장 흔히 저지르는 실수가 있습니다. A의 평균이 B의 평균보다 크기만 하면 "A가 더 낫다"고 결론 내리는 것입니다. 방향(부호)만 보고 판정하는 이 방식은 언뜻 합리적으로 보이지만, 차이의 크기와 표본 수를 무시하기 때문에 노이즈를 실력으로 착각하게 만듭니다.

실제로 제가 만든 종목 등급 스크리너의 포워드 평가 함수(run_value_forward_eval)에서 이 문제가 터졌습니다. 판정 조건이 사실상 다음 한 줄이었습니다.

if A.avg > C.avg:
    judgment = "✅ A>C 변별력 있음"

이 코드는 A 등급 평균이 C 등급 평균보다 크기만 하면 무조건 성공을 표시합니다. 문제가 드러난 사례는 이랬습니다. A 등급 평균 -0.36%, C 등급 평균 -0.39%. 둘 다 마이너스인데다 격차는 0.03%p에 불과했습니다. 그런데도 판정은 당당히 "✅ 변별력 있음"이었습니다. 이렇게 작은 격차를 표본 수 확인도 없이 성공으로 표시하면, 우연이나 노이즈를 변별력으로 오인할 위험이 큽니다.


왜 위험한가: 표본이 작을수록 노이즈가 알파처럼 보인다

부호만 보는 판정이 위험한 이유는 세 가지 정보를 통째로 버리기 때문입니다.

  • 격차의 크기 — 0.03%p든 5%p든 부호만 맞으면 똑같이 성공 처리됩니다. 실무적으로 의미 없는 차이도 성공으로 둔갑합니다.
  • 표본 수 — 등급별로 종목이 2~3개뿐이어도 판정에 반영되지 않습니다. 표본이 작으면 평균은 몇 개 종목의 우연에 크게 흔들리고, 그 흔들림을 '변별력'으로 오인하기 쉽습니다.
  • 반대 신호 — 제 경우 스크리너가 걸러낸(가치함정으로 제외한) 등급의 평균이 +1.26%로 오히려 최고였습니다. 필터가 거꾸로 작동했다는 1급 경고인데, 판정 로직 밖이라 아무 표시가 없었습니다.

특히 세 번째가 아팠습니다. 필터는 '나쁜 것을 걸러내는' 도구입니다. 걸러낸 쪽 성적이 남긴 쪽보다 좋다면 필터가 거꾸로 갔다는 뜻인데, 그 상황에서도 화면에는 "변별력 있음"이 떠 있었습니다. AI나 자동화 스크립트가 내놓는 '성공' 표시를 그대로 믿으면 안 되는 이유가 여기 있습니다. 표시는 로직이 정한 규칙의 출력일 뿐, 실제로 의미 있는 차이가 있다는 보증이 아닙니다.


확인 절차: 성공 판정을 의심하는 3단계

자신의 검증 코드나 AI가 내놓은 '성공' 결과를 다음 순서로 점검하면 이런 함정을 잡을 수 있습니다.

  1. 판정 조건 문장을 직접 찾아 읽는다. "성공"을 출력하는 조건이 코드 어디에 있는지 grep으로 찾아 실제 비교식을 눈으로 확인합니다. 부등호 하나(A > C)만 있다면 즉시 의심합니다.
  2. 격차와 표본 수를 함께 출력해 본다. 판정 결과 옆에 실제 격차(예: 0.03%p)와 등급별 종목 수를 나란히 찍어 봅니다. 격차가 미미하거나 표본이 한 자릿수면 그 성공은 신뢰하기 어렵습니다.
  3. 버려진 데이터의 성적을 확인한다. 필터가 제외한 그룹의 평균을 별도로 계산해 봅니다. 제외한 쪽이 남긴 쪽보다 좋으면 필터 방향 자체를 재검토해야 합니다.

이 절차의 핵심은 '성공'이라는 글자를 믿지 않고, 그 판정을 만든 원자료(격차·표본·반대 그룹)를 직접 되짚어 보는 것입니다.


해결: 순수 판정 함수를 분리하고 AND 게이트를 건다

저는 판정 로직을 run_value_forward_eval 안에서 끄집어내 forward_eval.judge_grade_discrimination이라는 별도 순수 함수로 분리했습니다. 판정을 계산에서 떼어 놓으면 규칙을 명확히 하고 테스트하기 쉬워집니다. 새 규칙은 세 갈래입니다.

  1. 변별력 있음: A-C 격차가 1.0%p 이상이고 동시에 등급별 표본이 5건 이상일 때만.
  2. 판정 보류: 격차가 미미하거나 표본이 부족할 때. 성공도 실패도 아닌 중립 상태로 둡니다.
  3. 가치함정 역전 경고: 제외 등급 평균이 A 평균보다 크면 "⚠️ 가치함정 역전 경고"를 변별력 판정과 독립적으로 띄웁니다.

두 조건을 AND로 묶은 게 포인트입니다. 격차만 크고 표본이 2~3건이면 여전히 못 믿기 때문입니다. 역전 경고를 분리한 이유는, 변별력이 있든 없든 필터가 거꾸로 갔다는 신호는 항상 보여야 하기 때문입니다.

한 가지 분명히 해두면, 이때 장기 전략의 실제 임계값(스크리너가 종목을 고르는 기준)은 건드리지 않았습니다. 바뀐 것은 판정 문구와 게이트, 그리고 결과 JSON에 judgment 필드를 저장하도록 한 것뿐입니다. 판정 방식을 고칠 때는 '보고하는 방식'과 '실제 동작하는 기준'을 분리해서, 로그만 바꿀 것인지 동작까지 바꿀 것인지 명확히 하는 편이 안전합니다. 이 수정 후 관련 테스트 6건과 전체 스위트 57건이 통과했습니다(테스트 수치는 기록 시점 기준).

주의할 점은 1.0%p, 5건이라는 값은 이 프로젝트에서 정한 임계값이라는 것입니다. 통계적 유의성의 표준 기준이 아니므로, 다른 데이터·전략에는 그 자릿수를 그대로 옮기지 말고 자기 도메인에서 '의미 있는 최소 차이'와 '믿을 만한 최소 표본'을 다시 정해야 합니다.


전후 비교와 체크리스트

상황 수정 전 수정 후
A -0.36% vs C -0.39% (격차 0.03%p) ✅ 변별력 있음 판정 보류 (격차 < 1.0%p)
표본 2~3건에서 부호만 맞음 ✅ 변별력 있음 판정 보류 (표본 < 5건)
제외 등급 +1.26% > A 등급 경고 없음 ⚠️ 가치함정 역전 경고
판정 근거 저장 없음 결과 JSON judgment 필드

첫 두 행이 핵심입니다. 예전에는 성공으로 뜨던 상황이 이제 '판정 보류'로 바뀌면서, 확실하지 않은 것을 확실한 척하지 않게 됐습니다. 아래는 자신의 비교/검증 로직에 그대로 적용할 수 있는 체크리스트입니다.

  • 성공 판정 조건이 부등호 하나(부호 비교)로만 되어 있지 않은가?
  • '의미 있는 최소 차이(효과크기)'를 게이트로 걸었는가?
  • 표본 하한을 걸었는가? 표본이 작을 때 판정을 보류하는가?
  • 필터가 걸러낸 그룹의 성적을 따로 확인·경고하는가?
  • 판정 근거(격차·표본·판정문)를 저장해 나중에 재검토할 수 있는가?

한계와 주의사항

이 방식에도 한계가 있습니다. 첫째, 최소격차·표본 하한은 '판정 보류'를 늘려 성급한 성공 선언을 막아 주지만, 그 자체가 통계적 유의성을 보장하지는 않습니다. 표본이 5건을 넘겨도 진짜 신뢰구간까지 확인하려면 별도의 통계 검정이 필요합니다.
둘째, 여기 나온 +1.26% 같은 수치는 특정 시점·유니버스의 백테스트 결과이며, 기간이나 재현 조건이 바뀌면 달라집니다. 어떤 결과도 미래 수익을 보장하지 않으며, 이 글은 투자 판단을 권하는 글이 아닙니다.
셋째, 임계값을 너무 높게 잡으면 진짜 신호까지 '보류'로 묻힐 수 있습니다. 게이트 값은 도메인에 맞게 조정하고, 판정 보류가 늘어난 것이 데이터 부족 때문인지 로직 문제인지 주기적으로 되짚어야 합니다. 정리하면, 판정에서 중요한 건 방향이 아니라 '얼마나 큰 차이를 몇 개의 표본으로 확인했는가'이며, 이번 수정은 그 두 축을 게이트로 명시한 작업이었습니다.
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

반응형