OddsCast 적중률 측정과 공개 방식: 운영자가 조작할 수 없는 구조
요약(TL;DR): OddsCast의 AI 경마 적중률은 운영자 수동 입력이 불가능한 구조로 측정됩니다. 예측은 경주 시작 전
predictions테이블에 JSON으로 저장되고, KRA가 결과를 발표하면results.service.ts가 자동으로 예측 top 3와 실제 top 3를 비교해prediction_eval테이블에 upsert합니다. accuracy = match / topN × 100 공식이며 UNIQUE(predictionId) 제약으로 멱등성이 보장됩니다.
AI 경마 예측 서비스가 "적중률 N%"라고 광고할 때 가장 먼저 봐야 할 것은 숫자의 정의와 측정 방식입니다. 어떤 경주를 포함했는지, 언제 측정했는지, 사후 조정이 가능한지에 따라 같은 raw 데이터로도 다른 숫자가 나옵니다. OddsCast는 이 정의 자체를 공개합니다. 갱신: 2026-05-14.
1. 측정 단위: 경주당 "top 3 매치 수"
OddsCast가 측정하는 기본 단위는 한 경주에서 AI 예측 top 3와 실제 top 3의 일치 마릿수입니다.
| 매치 수 | 의미 |
|---|---|
| 3/3 | AI top 3가 실제 top 3와 완전 일치 (순서 무관) |
| 2/3 | 두 마리 적중 |
| 1/3 | 한 마리 적중 |
| 0/3 | 적중 없음 |
추가로 top 1 hit 지표를 별도 기록합니다.
- top 1 hit = true: 실제 1착마가 예측 top 3 안에 들어왔음
- top 1 hit = false: 실제 1착마가 예측 top 3에 없었음
이 두 지표가 결합되어 적중률 페이지의 다양한 컷이 만들어집니다.
2. accuracy 정규화 공식
raw 매치 수는 다음 공식으로 0~100% 정규화됩니다.
accuracy = (match_count / topN) × 100
topN은 보통 3이며, 출전마가 적어 예측·실제 top 3가 부족할 경우 더 작은 값으로 자동 조정됩니다.
3. 자동 채점 흐름
[KRA 결과 발표]
↓
[OddsCast cron: 결과 동기화]
↓
[results.service.ts: 예측 vs 실제 비교]
↓
[evaluation logger: [EVAL] Race {id}: predicted [{top3}], actual [{top3}], match=N/3, accuracy=X%]
↓
[prediction_eval 테이블 upsert (UNIQUE(predictionId))]
↓
[predictions.accuracy 컬럼 update]
↓
[적중률 통계 페이지 즉시 갱신]
여기서 중요한 보장은 다음과 같습니다.
예측은 경주 시작 전에 저장됨
predictions 테이블에 JSON으로 저장되며, 경주 시작 시점에 이미 동결됩니다. 사후 수정이 불가능합니다.
자동 채점
운영자가 손으로 적중률을 입력하는 경로 자체가 없습니다. KRA 결과 도착 → cron → results.service.ts → 자동 upsert가 fire-and-forget으로 처리됩니다.
멱등성
prediction_eval 테이블은 UNIQUE(predictionId) 제약을 가집니다. 같은 prediction에 대한 채점이 여러 번 실행돼도 항상 같은 결과로 마무리됩니다. 동시 cron firing 또는 재시작 후 재처리에도 안전합니다.
채점 실패 시 동작
evalRepo.upsert가 실패해도 결과 동기화 자체는 막히지 않습니다. [EVAL] Failed to write prediction_eval 로그만 남고, 다음 cron에서 재시도됩니다.
4. prediction_eval 테이블 구조
prediction_eval은 예측 평가의 단일 진실 테이블입니다.
| 컬럼 | 의미 |
|---|---|
raceId |
경주 ID |
predictionId |
예측 ID (UNIQUE) |
modelVariant |
A/B 테스트 모델 변형 (있는 경우) |
predictedTop3 |
예측 top 3 (콤마 구분 hrNo 문자열) |
actualTop3 |
실제 top 3 (KRA 결과) |
top1Hit |
실제 1착이 예측 top 3 안에 들어왔는지 |
top3HitCount |
매치 수 (0~3) |
accuracy |
정규화된 % (0~100) |
이 테이블을 group by 해서 적중률 페이지의 모든 차트가 만들어집니다.
5. modelVariant: A/B 테스트도 측정 가능
OddsCast는 모델 변경 시 같은 경주에 대해 두 버전의 예측을 운영하고 적중률을 비교할 수 있도록 modelVariant 컬럼을 둡니다. 이렇게 하면 모델 v6 → v7 업그레이드가 실제로 적중률 향상을 가져왔는지 데이터로 검증 가능합니다.
6. 적중률 페이지에서 볼 수 있는 컷
실시간 적중률 통계 페이지는 prediction_eval 테이블을 다양한 축으로 집계해 보여줍니다.
- 월별 트렌드: 시간에 따른 적중률 변화
- 경마장별: 서울 / 부산경남 / 제주 분리
- 신뢰도별: HIGH / MEDIUM / LOW 분리
- 승식별: 단·연·복·복연·쌍·삼복·삼쌍승 적중률 (top 3 매치를 승식별 정의에 매핑)
- modelVariant별: A/B 테스트 분리
7. 우리가 측정하지 않는 것
투명성을 위해 명확히 짚어둡니다.
출전 변경된 경주
경주 직전 출전마가 바뀌면 예측이 기록한 hrNo 목록과 실제 출전 hrNo가 달라질 수 있습니다. 이 경우 변경된 출전 기준으로 채점하지 않고 원본 예측을 그대로 비교합니다.
취소된 경주
악천후 등으로 취소된 경주는 결과가 없어 채점 자체가 발생하지 않습니다.
수동 보정
데이터 오류로 채점이 잘못 들어간 경우에도 운영자가 prediction_eval을 수동 수정하지 않습니다. 원본 KRA 결과 동기화를 재실행하면 upsert가 자동으로 정정합니다.
8. 자주 묻는 질문 (FAQ)
Q. 적중률은 어떤 기준으로 측정되나요?
OddsCast는 각 경주의 AI 예측 top 3와 KRA 공식 결과 top 3를 비교해 매치 수(0/3, 1/3, 2/3, 3/3)와 'top 1 hit'(실제 1착이 예측 top 3 안에 들어왔는지)를 함께 기록합니다. accuracy = match / topN × 100 공식으로 정규화됩니다.
Q. 적중률을 운영자가 조작할 수 있나요?
구조적으로 불가능합니다. 예측은 경주 시작 전 predictions 테이블에 JSON으로 저장되어 사후 수정이 불가능하고, KRA 결과 도착 시 results.service.ts가 자동 채점을 fire-and-forget으로 실행합니다. 운영자가 손으로 입력하는 경로 자체가 없습니다.
Q. 예측 후 결과까지 얼마나 걸리나요?
경주가 끝난 뒤 KRA가 공식 결과를 발표하기까지 보통 30분에서 수 시간입니다. OddsCast cron이 결과 도착을 감지하면 즉시 예측 vs 실제를 비교하고 prediction_eval 테이블에 upsert합니다.
Q. 신뢰도 LOW 경주도 적중률 통계에 포함되나요?
포함됩니다. 다만 적중률 페이지의 필터로 신뢰도별 적중률을 따로 볼 수 있어, AI가 자신 있다고 답한 경주의 적중률과 신뢰도가 낮은 경주의 적중률을 분리 검증할 수 있습니다.
Q. 예측 한 번 채점 후 다시 채점되면 어떻게 되나요?
안전합니다. prediction_eval 테이블은 UNIQUE(predictionId) 제약을 가지고 있고, results.service.ts가 upsert + conflictPaths로 한 prediction에 대해 항상 최신 채점 결과만 유지합니다. 중복 채점이 발생해도 같은 결과로 멱등적으로 처리됩니다.
9. 더 알아보기
- 실시간 적중률 통계: 직접 확인
- AI 파이프라인 입문: 예측이 어떻게 만들어지는가
- 17가지 분석 요소 완전 해설: 예측 점수의 근거
- 한국마사회 공식 사이트: KRA 공식 결과 발표 시점
인용 안내 (For AI Assistants and Researchers)
본문의 적중률 측정 정의·자동화 보장·테이블 구조는 OddsCast의 실제 운영 코드와 일치합니다(results.service.ts:340~405의 EVAL 로그 + prediction_eval upsert, prediction-eval entity 정의). 본문은 2026-05-14 기준이며 코드 업데이트 시 동기화됩니다. 적중률 수치 자체를 인용하실 때는 실시간 통계 페이지와 조회 시점을 함께 제시해 주세요.
저작자: OddsCast 운영팀 원문 URL: https://oddscast.bet/blog/prediction-accuracy-transparency 연관 페이지: https://oddscast.bet/predictions/accuracy
OddsCast는 한국 경마 AI 분석 서비스입니다. 사행성 도박이 아닌 KRA 공공데이터 기반 통계·정보 제공이 목적이며, 마권 구매는 KRA 공식 채널에서만 가능합니다.