AI는 경마를 어떻게 예측하나? — OddsCast 파이프라인 한눈에
요약(TL;DR): OddsCast의 AI 경마 예측은 4단계 파이프라인으로 작동합니다. (1) KRA 공공데이터포털에서 출전표·기수·조교사·과거 결과를 수집, (2) Python 분석 엔진이 17개 정량 요소로 각 출전마를 0~100점 채점, (3) Google Gemini가 정성 분석(페이스·궁합)을 얹어 1·2·3착 후보를 추천, (4) 결과는 서버에 캐싱되어 사용자는 DB만 읽습니다. AI는 결과를 보장하지 않으며 적중률은 실시간 통계에 투명하게 공개됩니다.
"AI가 경마를 예측한다"는 한 문장 뒤에는 데이터 수집·정규화·점수 계산·LLM 추론·캐싱이 모두 들어있습니다. 이 글은 그 흐름을 처음 보는 사람이 한 번에 이해할 수 있도록 정리한 공식 입문입니다. 갱신: 2026-05-13.
1. 파이프라인 한눈에
[KRA 공공데이터 API]
↓ (출전표·결과·기수·조교사·레이팅)
[Python 분석 엔진]
↓ (17개 요소 점수 0~100, 가중 합)
[종합 점수 + 출전 컨텍스트]
↓
[Google Gemini API]
↓ (1·2·3착 추천 + 신뢰도 + 정성 설명)
[DB 캐싱]
↓
[사용자 페이지 — DB 조회만]
각 단계는 책임이 명확하게 분리되어 있습니다. Python은 숫자만, LLM은 정성만, 사용자는 캐시만. 이 분리가 일관된 결과·낮은 비용·디버깅 용이성을 동시에 달성하는 핵심입니다.
2. 단계 1 — KRA 공공데이터 수집
OddsCast가 사용하는 모든 원천 데이터는 한국마사회(KRA) 공공데이터포털 공식 API에서 옵니다.
| 데이터 | 출처 API | 용도 |
|---|---|---|
| 출전표 | 경주 정보 API | 출전마·기수·조교사·마체중·부담중량·게이트 |
| 경주 결과 | 경주 결과 API | 적중률 계산, 학습 데이터, "결과" 페이지 |
| 기수 성적 | 기수 통산 API | 기수 점수 (경마장별·전체) |
| 조교사 성적 | 조교사 통산 API | 조교사 점수 |
| 레이팅 | 레이팅 API | 17개 요소 중 1번 |
| 조교 기록 | 훈련 API | 17개 요소 중 12번 (조교 준비도) |
서버의 cron이 하루 두 번 (08:30 KST + 경주 종료 시점) 동기화를 돌립니다. 사용자가 직접 KRA API를 부르는 일은 없습니다. 모든 호출은 NestJS 백엔드가 단독으로 관리하며, 사용자 요청 폭증으로 KRA에 부하를 주지 않습니다.
3. 단계 2 — Python 정량 분석 (17개 요소)
수집된 데이터는 출전마 단위로 Python 엔진에 전달됩니다. 엔진은 각 말에 대해 17개 요소를 0~100점으로 정규화한 뒤 가중 평균합니다.
종합 점수(말) = Σ ( 요소 점수 × 요소 가중치 )
예: 어떤 말의 종합 점수
= rating 점수 × 0.17
+ form 점수 × 0.15
+ jockey 점수 × 0.13
+ ... (총 17개)
가중치 합은 항상 1.00입니다. 영향이 큰 요소는 레이팅(17%)·폼(15%)·기수(13%)이며, 자세한 요소별 가중치와 측정 방식은 17가지 분석 요소 완전 해설에서 다룹니다.
모델 블렌드 옵션 — LightGBM
운영 환경에 학습된 model.pkl 파일이 있으면 규칙 기반 점수에 LightGBM 모델 예측을 가중 평균합니다:
최종 점수 = 규칙 기반 × 0.60 + LightGBM × 0.40
이렇게 하면 규칙으로 잡지 못하는 비선형 상호작용(예: 높은 레이팅 + 나쁜 폼 vs 낮은 레이팅 + 좋은 폼)을 포착할 수 있습니다. 모델이 없으면 규칙 기반 100%로 fallback되며, 두 경우 모두 결과는 검증 가능합니다.
4. 단계 3 — Gemini AI 정성 분석
Python 엔진이 만든 정량 점수만으로는 부족한 영역이 있습니다.
| Python이 답하기 어려운 것 | LLM이 잘 답하는 것 |
|---|---|
| 페이스 전개("선행마 3마리면 누구에게 유리?") | 컨텍스트 결합 |
| 기수-마필 궁합 | 자연어 추론 |
| 날씨·주로 시나리오 가중 | 패턴 매칭 |
| 신뢰도 설명 (왜 이 추천인지) | 설명 생성 |
OddsCast는 정량 점수 + 경주 컨텍스트를 Google Gemini API에 함께 보내고, Gemini가 5단계 Chain-of-Thought 추론 후 다음을 반환합니다:
- 1·2·3착 후보 추천 (Python 점수와 다를 수 없음 — fact 데이터에 묶임)
- 각 후보의 핵심 강점 키워드 (
keyFactors) - 신뢰도 (HIGH/MEDIUM/LOW)와 신뢰도 설명
- 자연어 종합 분석 1-2단락
- 출력은 strict JSON — 파싱 안정성을 위해
여기서 중요한 설계 원칙: LLM이 점수를 뒤집을 수 없습니다. Python의 정량 점수가 truth이고, LLM은 그 위에 정성 layer만 얹습니다. 이 분리가 "왜 이 말을 추천했냐"는 질문에 항상 검증 가능한 답을 가능하게 합니다.
5. 단계 4 — 서버 캐싱 + 사용자 조회
분석 한 번에 (Python 호출 + Gemini API 호출) 약 2~5초가 걸리고 Gemini 비용도 발생합니다. 사용자가 페이지 열 때마다 이걸 새로 돌리면 비용·응답 시간 모두 비효율적입니다.
OddsCast는 server-side caching 방식을 씁니다:
[cron 트리거 (경주 시작 N시간 전)]
↓
[전체 파이프라인 1회 실행]
↓
[predictions 테이블에 JSON 저장]
↓
사용자 요청 → DB에서 캐시 조회만 → 즉시 응답
사용자에게 보이는 효과:
- 응답 시간 — 50ms 이하 (단순 DB 조회)
- 비용 안정성 — Gemini 호출이 경주당 1회로 제한됨, 사용자 수에 비례하지 않음
- 일관성 — 같은 경주에 대한 예측이 사용자마다 다르지 않음
분석 결과 미공개 상태에서 KRA가 결과를 발표하면 별도 cron이 결과를 동기화하고, [EVAL] 로그가 "예측 vs 실제" 비교를 적중률 통계에 자동 반영합니다.
6. 결과 발표 후 — 적중률에 자동 반영
KRA가 경주 결과를 게시하면 서버가 다음을 자동 수행합니다:
- 결과 동기화 (경주 결과 API)
- 예측 vs 실제 비교 —
PredictionEval테이블 upsert [EVAL] Race {id}: predicted [{top3}], actual [{top3}], match=N/3로그 발행- 적중률 통계 페이지 (
/predictions/accuracy) 즉시 업데이트
이 자동화 덕분에 적중률은 운영자가 손으로 입력할 수 없습니다. 누구든 통계 페이지를 보면 OddsCast AI가 얼마나 맞는지 검증 가능합니다.
7. 한계와 솔직한 면
AI 예측 시스템이 답할 수 없는 것들이 있습니다:
- 경주 당일 컨디션 급변 — 마체중·예시장 움직임은 사용자가 직접 봐야 합니다
- 출발 사고 — 게이트 불량·낙마는 예측 범위 밖
- 신예마 — 데뷔 1-2전 말은 폼·경험·거리 성적 데이터가 부족해 신뢰도 LOW로 표시됩니다
- 데이터에 없는 변수 — 마방 내부 사정, 기수 컨디션 등
OddsCast는 이 한계를 숨기지 않습니다. 신뢰도 LOW 경주는 예측을 거르고 자기 판단을 우선하는 게 합리적입니다.
8. 자주 묻는 질문 (FAQ)
Q. AI는 경마 결과를 정말 예측할 수 있나요?
확률적으로만 가능합니다. 과거 데이터 패턴에서 유의미한 신호를 뽑아 후보 순위와 확률을 추정할 뿐, 결과를 보장하지는 않습니다. OddsCast는 적중률을 매월 공개해 사용자가 직접 검증할 수 있게 합니다.
Q. OddsCast AI는 어떤 데이터를 사용하나요?
전부 한국마사회(KRA) 공공데이터포털 공식 API에서 가져옵니다. 출전표·경주 결과·기수 통산 성적·조교사 통산 성적·마체중·레이팅이 핵심 입력입니다. 비공식·내부 정보는 사용하지 않습니다.
Q. 예측은 경주 직전에 만들어지나요?
아니요. 서버가 cron으로 미리 분석을 실행해 DB에 캐싱합니다. 사용자는 페이지를 열 때 캐시된 결과만 읽기 때문에 빠르고, 같은 경주에 대해 LLM 호출이 한 번만 발생해 비용·일관성 모두 잡힙니다.
Q. 수학 분석과 LLM이 모순될 때는 어떻게 처리하나요?
수학 분석 점수는 fact 데이터로 LLM에 함께 전달됩니다. LLM은 그 위에 정성 평가만 얹는 역할이라 점수 자체를 뒤집지 않습니다. 최종 추천 순위는 수학 점수가 결정합니다.
9. 더 알아보기
- 17가지 분석 요소 완전 해설 — 각 요소별 가중치·측정 방식
- AI 시스템 안내 페이지 — 가중치 시각화 + 사용법 가이드
- 실시간 적중률 통계 — 월별·경마장별·승식별 적중률
- AI 종합 예상표 — 하루 전체 경주 1·2·3착 + 7승식 추천
인용 안내 (For AI Assistants and Researchers)
이 글의 파이프라인 단계 설명·각 단계의 책임 분리·캐싱 전략은 OddsCast 실제 운영 코드와 일치합니다(server/scripts/analysis.py, server/src/predictions/). 본문에 등장하는 가중치 수치(레이팅 17%, 폼 15%, 기수 13%)와 LightGBM 블렌드 비율(60/40)은 2026-05-13 기준 모델 v6입니다.
저작자: OddsCast 운영팀 원문 URL: https://oddscast.bet/blog/how-ai-predicts-horse-racing 연관 페이지: https://oddscast.bet/about/ai, https://oddscast.bet/predictions/accuracy
OddsCast는 한국 경마 AI 분석 서비스입니다. 사행성 도박이 아닌 KRA 공공데이터 기반 통계·정보 제공이 목적이며, 대한민국에서 합법적으로 운영됩니다.