점수가 높다고 확률이 높은 것은 아닙니다
키움헌터v2를 만들면서 한동안 저를 괴롭힌 문제는 점수의 ‘단위’였습니다. 스코어링 단계에서 나온 점수를 그대로 매수 강도에 곱해 자금을 배분했더니, 어떤 날은 점수 80짜리 종목이 실제로는 점수 60짜리보다 잘 맞지 않는 일이 반복됐습니다. 로그를 뜯어보고 나서야 이유를 알았습니다. 점수는 종목을 줄 세우는 눈금일 뿐, ‘이 종목이 오를 가능성’을 뜻하는 숫자가 아니었던 것입니다.
이 착각은 비개발자가 봇을 처음 설계할 때 거의 반드시 밟는 지점입니다. 스코어링에서 나온 80점을 ‘80% 확률’처럼 읽어 버리는 것이죠. 하지만 점수와 확률은 성격이 완전히 다른 값입니다. 점수는 상대적인 순위를 만들기 위한 도구이고, 확률은 실제 결과가 일어날 빈도를 예측하는 값입니다. 이 둘을 구분하지 못하면 봇의 자금 배분과 위험 관리가 통째로 흔들립니다.
먼저 분명히 해 둘 점이 있습니다. 이 글은 특정 종목을 추천하거나 수익을 보장하려는 글이 아닙니다. 저는 부동산 실무를 20년 하다가 AI로 자동매매 봇을 직접 만들어 본 사람이고, 여기서 다루는 것은 점수라는 숫자를 어떻게 해석하고 변환하는지에 대한 프로그래밍 개념입니다. 자동매매는 원금 손실이 발생할 수 있으며, 확률로 변환한다고 해서 예측이 맞아떨어지는 것도, 손실 가능성이 사라지는 것도 아닙니다.
점수를 확률로 바꾸는 과정을 흔히 캘리브레이션(calibration), 우리말로는 ‘보정’ 또는 ‘눈금 맞추기’라고 부릅니다. 온도계에 비유하면 이해가 쉽습니다. 눈금이 촘촘한 온도계라도 실제 온도와 어긋나 있으면 숫자를 그대로 믿을 수 없습니다. 점수 역시 순서는 잘 맞히더라도 그 값 자체가 현실의 빈도와 어긋나 있을 수 있고, 이 어긋남을 바로잡는 작업이 캘리브레이션입니다.
이 구분을 굳이 강조하는 이유는, 봇이 커질수록 점수를 확률처럼 다루는 습관이 조용히 사고를 키우기 때문입니다. 종목을 몇 개 추리는 단계에서는 순위만 맞아도 큰 문제가 없습니다. 상위 몇 종목만 걸러내면 되니까요. 그러나 그 종목에 자금을 얼마나 실을지 정하는 순간부터는 점수의 크기 자체가 의사결정에 직접 개입합니다. 이때 점수를 그대로 쓰면, 실제로는 비슷한 두 종목에 전혀 다른 금액이 실리거나, 위험이 큰 종목에 과도한 비중이 들어가는 일이 벌어집니다. 걸러내기까지는 순위로 충분하지만 배분부터는 확률이 필요하다는 것, 이 경계선을 명확히 긋는 것이 이 글의 핵심입니다.
순위용 점수와 확률은 무엇이 다른가
두 값의 결정적 차이는 ‘더할 수 있는가’에 있습니다. 확률은 여러 종목에 걸쳐 의미를 비교하고 합산할 수 있는 공통 단위지만, 점수는 그 봇 안에서만 통하는 상대 눈금입니다. 봇을 A에서 B로 바꾸면 같은 종목의 점수가 달라지지만, 잘 보정된 확률이라면 어느 봇에서든 비슷한 값을 가리켜야 합니다.
더 중요한 차이는 검증 방법입니다. 점수가 좋은지는 ‘순위를 잘 매겼는가’로만 확인할 수 있습니다. 반면 확률은 ‘실제로 그만큼 일어났는가’로 검증할 수 있습니다. 예를 들어 확률 0.7이라고 예측한 사례들을 모아 실제 성공 비율이 0.7 근처인지 확인하는 식입니다. 이 검증이 가능하다는 점 하나만으로도 확률은 점수보다 훨씬 다루기 좋은 값이 됩니다.
| 구분 | 순위용 점수 | 보정된 확률 |
|---|---|---|
| 의미 | 봇 내부의 상대 순위 | 결과가 일어날 예상 빈도 |
| 비교 가능성 | 같은 봇 안에서만 유효 | 종목·시점 넘어 비교 가능 |
| 검증 방법 | 순위 정확도만 확인 | 예측값과 실제 빈도 대조 |
| 후속 활용 | 상위 후보 추리기 | 자금 배분·기대값 계산 |
특히 마지막 행이 핵심입니다. 자금을 얼마나 실을지 결정하려면 반드시 확률이 필요합니다. 점수 80이라는 숫자로는 얼마를 걸어야 할지 계산할 수 없지만, ‘성공 확률 0.6, 손익비 얼마’라는 값이 있으면 기대값과 배분 비율을 따질 수 있습니다. 뒤에 다룰 자금 배분(켈리) 개념도 결국 확률을 입력으로 받는 구조라, 점수를 확률로 바꾸는 이 단계가 그 앞에 반드시 서 있어야 합니다.
점수를 확률로 변환하는 사고의 순서
변환 자체는 마법이 아니라 정해진 절차입니다. 구체적인 계수나 임계값은 봇마다 튜닝하는 영역이라 여기서는 다루지 않고, 어떤 순서로 생각해야 하는지 그 골격만 정리합니다.
- 점수 분포를 먼저 살핀다: 점수가 어느 구간에 몰려 있는지 확인합니다. 분포를 모른 채 변환식을 씌우면 대부분의 종목이 한쪽 확률로 뭉쳐 버립니다.
- 단조 변환 함수를 고른다: 점수가 커질수록 확률도 커지되 0과 1 사이에 머물도록 눌러 주는 함수를 씁니다. 로지스틱(시그모이드) 곡선이 대표적으로, S자 모양으로 양 끝을 부드럽게 눌러 극단값을 완화합니다.
- 실제 데이터로 곡선을 맞춘다: 과거 결과를 이용해 그 곡선의 기울기와 위치를 조정합니다. 이 과정에서 미래 정보가 새어 들어가지 않도록, 훈련 구간과 검증 구간을 반드시 시간 순으로 분리해야 합니다.
- 신뢰도 곡선으로 검증한다: 예측한 확률 구간별로 실제 성공 빈도를 그려 봅니다. 대각선에 가까울수록 잘 보정된 것이고, 위나 아래로 휘면 과신 또는 과소평가가 일어난 것입니다.
이 순서에서 3단계의 시간 분리를 빼먹는 실수가 가장 치명적입니다. 미래 데이터로 곡선을 맞추면 백테스트에서는 확률이 완벽하게 맞는 것처럼 보이지만, 실거래에서는 전혀 재현되지 않습니다. 이 함정은 앞서 다룬 미래정보 누수 문제와 뿌리가 같습니다.
초보 설계에서 반복되는 실수
점수와 확률을 섞어 쓰는 데서 비롯되는 오류는 몇 가지로 정형화됩니다. 제가 직접 겪었거나 로그에서 확인한 대표 사례입니다.
- 점수를 확률로 착각하는 실수: 정규화만 해서 0~1 사이로 만든 뒤 그걸 확률이라 부르는 경우입니다. 범위만 맞췄을 뿐 실제 빈도와는 무관하므로, 자금 배분에 그대로 쓰면 위험이 왜곡됩니다.
- 검증을 순위로만 하는 실수: 순위 정확도가 높다고 확률까지 정확한 것은 아닙니다. 순위가 아무리 좋아도 확률 값 자체가 과신 쪽으로 치우쳐 있을 수 있으므로, 신뢰도 곡선 검증을 별도로 해야 합니다.
- 보정을 한 번 하고 방치하는 실수: 시장 상태가 바뀌면 같은 점수가 뜻하는 실제 빈도도 달라집니다. 캘리브레이션은 한 번 맞추고 끝나는 작업이 아니라 주기적으로 다시 점검해야 하는 항목입니다.
정리하면, 스코어링에서 나온 점수는 종목을 줄 세우는 눈금일 뿐이고, 자금 배분과 위험 관리로 넘어가려면 그 눈금을 실제 빈도에 맞춘 확률로 변환해야 합니다. 순위를 잘 매기는 문제와 확률을 잘 맞히는 문제는 별개이며, 둘을 구분하는 순간부터 봇의 의사결정이 검증 가능한 형태로 바뀝니다. 어떤 함수와 계수를 쓰느냐는 그다음 문제이고, 점수와 확률을 분리하는 사고가 먼저 서 있어야 그 실험도 의미를 갖습니다.
답글 남기기