HANWHA EAGLES NOW

방법론 & FAQ

이 페이지에 나오는 숫자는 전부 실제 코드 동작을 그대로 옮긴 것입니다. "대략 이런 방식"이 아니라, 지금 사이트가 쓰는 파라미터·게이트 이름·검증 결과를 그대로 적었습니다.

100,000
회 몬테카를로 시뮬레이션
6
단계 검증 게이트
K=10
Elo 업데이트 폭 (홈 +25)
고정 시드
같은 데이터 → 같은 결과

데이터 · 검증

확률을 계산하기 전에, 계산에 쓸 데이터부터 6단계로 검증합니다.
경기 데이터는 어디서, 어떻게 가져오나?

KBO 공식 사이트(koreabaseball.com)의 일정·기록 페이지를 매일 자동으로 수집합니다. 픽스처(가짜 데이터)는 개발·테스트에만 쓰고, 실제 서비스 화면에는 절대 노출하지 않습니다.

발행 전에 데이터를 어떻게 검증하나? (6단계 게이트)

수집한 데이터는 아래 6단계를 순서대로 통과해야만 사이트에 반영됩니다. 하나라도 실패하면 그 날짜의 발행 자체를 건너뛰고 어제 페이지가 그대로 유지됩니다 — 틀린 확률을 보여주는 것보다 갱신을 안 하는 쪽을 택합니다.

1INPUT_VALIDATION기준일 형식 등 입력값 검증
2AUDIT시즌 경기 로그 내부 정합성(중복·누락) 검사
3COVERAGE수집 체크포인트 간 중복·누락 경기 탐지
4RECONCILIATION계산한 순위표를 KBO 공식 순위표와 1:1 대조
5LIVE_COVERAGE기준일 컷오프·중복 확정경기·스코어 무결성 검사
6PRODUCTION_GATE시뮬레이션 단계 자체 — 픽스처 데이터가 실전으로 승격되는 것을 차단

메인 페이지의 "공식 순위 대조 · 불일치 0건" 수치가 바로 3·4번 게이트 결과입니다.

경기별 승리확률

한 경기, 한 경기의 승/무/패 확률은 Elo 레이팅으로 계산합니다.
Elo 레이팅은 정확히 어떻게 계산하나?

모든 팀은 시즌 시작 시 레이팅 1500에서 출발해, 경기가 끝날 때마다 결과에 따라 점수를 주고받는 표준 Elo 공식을 씁니다.

기대승률 = 1 / (1 + 10^(-((홈팀레이팅 + 홈어드밴티지) - 원정팀레이팅) / 400))

실전 파이프라인은 K=10, 홈 어드밴티지 +25점을 씁니다. 2026시즌 실제 경기를 앞 357경기(학습)·뒤 153경기(검증)로 나눠 여러 조합을 테스트한 결과, 이 조합이 엔진 기본값(K=20, 홈 +50)보다 검증 구간 로그손실(0.8232 vs 0.8370)에서 더 나은 성능을 보여 채택했습니다. 무승부 확률은 6%로 고정합니다.

왜 맞대결(H2H) 기록은 반영하지 않나?

경기별 승리확률은 팀의 시즌 전체 Elo 레이팅으로 계산하고, 특정 상대와의 개별 맞대결 기록(승-패)은 넣지 않습니다. 시즌당 같은 상대와 맞붙는 경기 수가 적어(보통 두 자릿수 초반) 맞대결 승률만으로는 표본이 너무 작고, 이미 Elo 레이팅 자체가 그 팀이 시즌 내내 보여준 전력을 누적해서 반영하고 있기 때문입니다. 맞대결 기록은 페이지에 참고용으로만 표시합니다.

타격·불펜 스탯 같은 다른 신호는 안 쓰나?

코드에는 팀 단위 타율(OPS)·평균자책점(ERA) 기반 보정 신호가 이미 구현돼 있지만, 기본값에서는 꺼져 있습니다. 이 신호를 Elo처럼 과거 시점 데이터로 워크포워드 백테스트할 수 있는 시계열 데이터가 아직 없어서, 검증되지 않은 상태로 실전 확률에 섞고 싶지 않기 때문입니다. 검증 전에는 0(중립)으로 두는 쪽을 택했습니다.

시즌 전체 확률

가을야구 진출 확률과 순위 분포는 전부 몬테카를로 시뮬레이션에서 나옵니다.
가을야구 진출 확률은 어떻게 나오나?

남은 시즌 전체를 100,000번 통째로 시뮬레이션합니다. 매 시뮬레이션마다 한화뿐 아니라 리그의 모든 남은 경기를 각 경기의 Elo 승리확률에 따라 무작위로 한 번씩 진행시키고, 그 결과로 만들어진 최종 순위표에서 한화가 몇 위인지 기록합니다. 10만 번 중 한화가 5위 이내로 끝난 비율이 곧 "가을야구 진출 확률"입니다.

순위 동률 시 처리(타이브레이크)는 결과 샘플링과 별도의 난수열을 써서, 동률 처리 로직이 경기 결과 자체의 확률 분포를 흔들지 않도록 합니다.

같은 날 다시 봐도 확률이 똑같이 나오나?

네. 시뮬레이션에 쓰는 난수는 고정된 시드에서 생성됩니다 — 같은 입력 데이터라면 언제 다시 계산해도 같은 확률이 나옵니다. 확률이 바뀌는 건 오직 실제 경기 결과가 새로 반영됐을 때뿐입니다.

한계

모델이 반영하지 않는 것, 확실히 해두고 싶은 것.
선수 부상·트레이드·컨디션 같은 건 반영되나?

아니요. 검증되지 않은 신호(부상 여부, 그날의 선발 로테이션, 트레이드 직후 전력 변화 등)는 기본값에 포함하지 않습니다. Elo 레이팅은 팀이 실제로 치른 경기 결과가 누적되면서만 서서히 움직입니다.

"5위와 격차" 숫자는 뭘 의미하나?

상대팀 성적이 그대로 멈춰 있다고 가정한 현재 시점 스냅샷일 뿐, 남은 경기에서 필요한 승수를 의미하지 않습니다. 나머지 구단의 결과까지 함께 반영한 실제 가능성은 위쪽의 가을야구 진출 확률(10만 번 시뮬레이션 결과)을 참고하세요.

iOS에서 추가하려면: 하단 공유 버튼 → "홈 화면에 추가"