⚾ KBO 사용 가이드

처음 오셨군요! 아래 순서대로 하나씩 따라 하면 돼요. 어려운 낱말은 처음 나올 때 쉽게 설명해 드릴게요.

1단계 · 선수 실력 숫자(스탯) 찾아서 넣기 — statiz.co.kr 사이트 이용

'스탯'이란 선수나 팀이 얼마나 잘하는지를 숫자로 나타낸 거예요. 아래 숫자들을 찾아서 이 사이트에 그대로 옮겨 적으면 돼요.

1
선발투수 FIP 찾기
FIP는 투수가 얼마나 공을 잘 던지는지 보여주는 숫자예요. 숫자가 낮을수록 더 잘 던지는 투수예요.
① statiz.co.kr 사이트에 들어가요
② 위쪽 메뉴에서 '개인 기록'을 눌러요
③ 오늘 경기에 나오는 선발 투수 이름을 검색해요
④ 그 투수의 FIP 시즌 평균 숫자를 확인해요
⑤ 이 사이트의 'FIP' 칸에 그 숫자를 그대로 입력해요
💡 '최근5경기 FIP' 칸은 비워도 괜찮아요 — 시즌 평균 숫자만 넣어도 계산이 돼요
2
투수 땅볼 비율(GB%) 찾기
GB%는 투수가 던진 공을 타자가 얼마나 '땅볼'로 맞추는지 보여주는 숫자예요.
① statiz.co.kr에서 '기록실' → '시즌기록실'을 눌러요
② '투구' → '타구' 칸으로 들어가요
③ 찾는 투수가 안 보이면, 먼저 팀 설정을 하고 기준 이닝을 '규정' → '전체'로 바꿔요
④ 나온 숫자를 이 사이트의 'GB%' 칸에 입력해요
3
팀 타격 실력 찾기
타자들이 얼마나 잘 치는지 알려주는 숫자 3가지예요.
· wRC+ — 100이 평균이에요. 숫자가 높을수록 그 팀 타격이 더 좋다는 뜻이에요
· AVG(타율) — 안타를 얼마나 잘 치는지 보여줘요
· SLG(장타율) — 얼마나 크고 멀리 치는지 보여줘요
① statiz.co.kr에서 '팀 기록'을 눌러요
wRC+, AVG, SLG 숫자를 확인해요 (시즌 기준. 최근10경기 숫자는 안 넣어도 돼요)
③ 확인한 숫자를 이 사이트의 알맞은 칸에 입력해요
💡 '최근' 칸은 전부 선택사항이에요. 시즌 숫자만 넣어도 모델이 잘 작동해요
⚠️ statiz.co.kr에서는 숫자를 마우스로 복사할 수 없어요. 화면에 보이는 숫자를 보고 직접 타이핑해 주세요.

2단계 · 배당(이기면 받는 배수) 넣기

'배당'이란 이 경기에 돈을 걸어서 이기면 원래 건 돈의 몇 배를 받는지 알려주는 숫자예요.

4
베트맨 배당 화면 캡처해서 AI에게 보내기
① 베트맨 사이트에서 오늘 경기의 배당 화면을 스크린샷(화면 캡처)해요
② 아래 회색 상자 오른쪽 위의 '복사' 버튼을 눌러요 (AI에게 보낼 질문 글이 복사돼요)
③ Claude나 Gemini 같은 AI 채팅 화면을 열고, 방금 찍은 스크린샷과 방금 복사한 글을 함께 붙여넣어 보내요
이 베트맨 KBO 배당 스크린샷의 수치를 아래 형식으로만 출력해줘. 없는 마켓은 생략해. 다른 설명은 필요 없어.

승패: [홈배당] [원정배당]
승1패: [홈승배당] [1점차배당] [원정승배당]
핸디: [홈핸디라인(+/-부호포함)] [홈배당] [원정배당]
언더오버: [기준점수] [언더배당] [오버배당]
전반승무패: [홈배당] [무배당] [원정배당]
전반핸디: [홈핸디라인(+/-부호포함)] [홈배당] [원정배당]
전반언더오버: [기준점수] [언더배당] [오버배당]
5
AI가 준 답을 배당 입력 칸에 붙여넣기
① AI가 답해준 글자를 전부 선택해서 복사해요
② 이 사이트의 📋 배당 입력 칸에 붙여넣어요
'현재 탭에 채우기' 버튼을 누르면 숫자들이 자동으로 채워져요

3단계 · 계산하고 결과 저장하기

6
최근 폼 가중치 막대(슬라이더) 맞추기
이 막대는 '요즘 컨디션(최근 5경기 성적)'을 계산에 얼마나 반영할지 정해요. 오른쪽으로 옮길수록 최근 성적을 더 많이 반영해요. 30~40% 정도로 맞추는 걸 추천해요.
7
계산하고 마음에 드는 픽 저장하기
'KBO 계산하기' 버튼을 눌러요
② 아래에 나온 결과표를 확인해요
③ 저장하고 싶은 예측(픽) 옆의 네모 칸에 체크해요
'최종픽 저장' 버튼을 눌러요
8
구글 스프레드시트에 자동 저장하기 (선택사항)
'Apps Script Web App URL'이라는 특별한 인터넷 주소를 한 번만 입력해두면, 그 뒤로는 픽을 저장할 때마다 구글 스프레드시트에도 자동으로 기록돼요.
① 아래쪽 📒 기록 · 피드백 루프 칸에 그 주소를 붙여넣어요
② 경기가 끝나면 실제 점수를 표에 입력해요
'스프레드시트에 저장' 버튼을 누르면 최종 결과가 구글 시트에 저장되고, 이 화면의 기록은 깨끗하게 비워져요

픽 등급(티어) 뜻

EV(기댓값)는 이 픽으로 돈을 벌 가능성이 얼마나 높은지 알려주는 점수예요. 이 점수를 5단계 등급으로 나눠서 보여줘요.

가치픽 — 최고예요! 지금 바로 볼만한 픽 (EV +8% 이상)
A — 아주 좋아요 (EV +5~8%)
B — 괜찮아요 (EV +2.5~5%)
C — 보통이에요 (EV 0~2.5%)
관망 — 지금은 넘기는 게 좋아요 (EV 0% 미만)
⚠️ 이 사이트는 숫자로 확률만 계산해주는 도구예요. 결과를 100% 보장하지 않으니 참고만 하시고, 안전하고 책임감 있게 즐기세요.

⚾ MLB 사용 가이드

MLB는 컴퓨터가 선수 실력 숫자(스탯)를 자동으로 가져와 줘요! KBO보다 훨씬 쉬워요.

1단계 · 경기 자동으로 불러오기

1
날짜 고르고 경기 불러오기
① 화면 위쪽에서 보고 싶은 날짜를 골라요
'경기 불러오기' 버튼을 눌러요
③ 그 날 열리는 모든 경기 목록이 나와요
2
경기 고르기
목록에서 보고 싶은 경기를 고르면, 아래 숫자들이 저절로 채워져요. 손으로 직접 입력 안 해도 돼요!
· 선발 FIP — 투수가 얼마나 잘 던지는지 보여주는 숫자
· wRC+ — 타자들이 얼마나 잘 치는지 보여주는 숫자
· 불펜 FIP — 구원투수들 실력을 보여주는 숫자
· 구장 — 어느 야구장에서 경기하는지
⚠️ 가끔 자동으로 숫자를 못 가져올 때가 있어요(이걸 'CORS 오류'라고 불러요). 이럴 땐 KBO처럼 손으로 직접 입력하면 돼요. (Baseball Reference, FanGraphs 사이트를 참고하세요)

2단계 · 배당(이기면 받는 배수) 넣기

'배당'이란 이 경기에 돈을 걸어서 이기면 원래 건 돈의 몇 배를 받는지 알려주는 숫자예요.

3
베트맨 배당 화면 캡처해서 AI에게 보내기
① 베트맨 사이트에서 오늘 경기의 배당 화면을 스크린샷(화면 캡처)해요
② 아래 회색 상자 오른쪽 위의 '복사' 버튼을 눌러요 (AI에게 보낼 질문 글이 복사돼요)
③ Claude나 Gemini 같은 AI 채팅 화면을 열고, 방금 찍은 스크린샷과 방금 복사한 글을 함께 붙여넣어 보내요
이 베트맨 MLB 배당 스크린샷의 수치를 아래 형식으로만 출력해줘. 없는 마켓은 생략해. 다른 설명은 필요 없어.

승패: [홈배당] [원정배당]
승1패: [홈승배당] [1점차배당] [원정승배당]
핸디: [홈핸디라인(+/-부호포함)] [홈배당] [원정배당]
언더오버: [기준점수] [언더배당] [오버배당]
4
AI가 준 답을 배당 입력 칸에 붙여넣기
① AI가 답해준 글자를 전부 선택해서 복사해요
② 이 사이트의 📋 배당 입력 칸에 붙여넣어요
'현재 탭에 채우기' 버튼을 누르면 MLB 배당 4가지가 자동으로 채워져요

3단계 · 계산하고 결과 저장하기

5
계산하고 마음에 드는 픽 저장하기
'MLB 계산하기' 버튼을 눌러요
② 아래에 나온 결과표를 확인해요
③ 저장하고 싶은 예측(픽) 옆의 네모 칸에 체크해요
'최종픽 저장' 버튼을 눌러요
6
구글 스프레드시트에 자동 저장하기 (선택사항)
'Apps Script Web App URL'이라는 특별한 인터넷 주소를 한 번만 입력해두면, 그 뒤로는 픽을 저장할 때마다 구글 스프레드시트에도 자동으로 기록돼요.
① 아래쪽 📒 기록 · 피드백 루프 칸에 그 주소를 붙여넣어요
② 경기가 끝나면 실제 점수를 표에 입력해요
'스프레드시트에 저장' 버튼을 누르면 최종 결과가 구글 시트에 저장되고, 이 화면의 기록은 깨끗하게 비워져요

픽 등급(티어) 뜻

EV(기댓값)는 이 픽으로 돈을 벌 가능성이 얼마나 높은지 알려주는 점수예요. 이 점수를 5단계 등급으로 나눠서 보여줘요.

가치픽 — 최고예요! 지금 바로 볼만한 픽 (EV +8% 이상)
A — 아주 좋아요 (EV +5~8%)
B — 괜찮아요 (EV +2.5~5%)
C — 보통이에요 (EV 0~2.5%)
관망 — 지금은 넘기는 게 좋아요 (EV 0% 미만)
⚠️ 이 사이트는 숫자로 확률만 계산해주는 도구예요. 결과를 100% 보장하지 않으니 참고만 하시고, 안전하고 책임감 있게 즐기세요.

🔒 접근 비밀번호

EV Bet · 스포츠 배당 가치분석

de-vig 확률 · P_model · EV · 켈리 기준 스테이크

KBO · MLB 베트맨 EV 예측모델

선발투수 FIP · 팀 wRC+ 등 통계 지표를 입력하면,
포아송·정규분포 모델이 각 마켓의 기댓값(EV)을 계산합니다.
베트맨 배당의 내재 확률과 비교해 가치픽을 추천합니다.

가치픽 EV≥8% A 5~8% B 2.5~5% C 0~2.5% 관망 <0%

리그 선택

KBO

한국프로야구
수동 스탯 입력 (스탯티즈)

풀게임 7마켓

MLB

메이저리그
StatsAPI 자동 입력

4마켓 + 자동채움
준비 중

EPL

잉글리시 프리미어리그
xG 기반 모델

출시 예정
준비 중 🏀

NBA

미국프로농구
포인트스프레드 모델

출시 예정
⚠️ 통계 기반 확률 추정 도구입니다. 결과는 참고용이며 수익을 보장하지 않습니다. 책임감 있는 배팅을 하세요.

최근 폼 가중치 35%

혼합값 = (1−w)×시즌 + w×최근5. 최근값 칸을 비우면 시즌값만 사용. 표본 작으면 보수적으로(권장 30~40%).

📋 배당 입력 (캡처를 Claude에게 보내 받은 값을 붙여넣고 '채우기')

⚙️ 팀 스탯 DB — 전체 10팀 wRC+ · SLG/AVG 한번에 입력
여기에 팀별 값을 한 번 입력해두면, 아래 "경기 · 구장" 카드에서 홈/원정팀을 선택할 때마다 자동으로 채워집니다. 입력 즉시 저장됩니다(별도 저장 버튼 없음). 구글시트 연동 시 기기·링크 간 자동으로 최신값으로 맞춰집니다.
wRC+(시즌)wRC+(최근5·선택)SLGAVG

경기 · 구장

홈 구장·원정팀 선택 시 팀 스탯 DB 값이 아래 wRC+/SLG/AVG 칸에 자동으로 채워집니다(DB가 비어있으면 빈칸).

선발 (FIP) · 시즌/최근5

등급계수 자동. GB%(땅볼유도율)는 보조 가감(비우면 무시).

타선(wRC+) · 라인업 · 불펜

원정
원정

엣지

라인업 직전/날씨급변/저유동성
미체크 시 풀 승패·언더오버 EV 문턱 +10%.

배당 — 풀게임

배당 — 전반(1~5회)

전반 언더오버=상시. 전반 승무패·핸디=기대 전반마진 0.55↑일 때만.

🤖 자동입력 (MLB StatsAPI 직접호출)

날짜 선택 → '경기 불러오기' → 경기 선택 시 선발 FIP·타선·구장 자동 채움. CORS 차단 시 프록시 URL 입력 후 재시도 (사용법 📖 참고).

경기 · 구장

선발 (FIP) · 시즌/최근5

기대실점=R_lg×(FIP÷리그FIP)×PF×GB보정. 자동입력 시 FIP·GB% 계산.

타선(wRC+근사) · 불펜

wRC+근사=100×(OPS÷리그OPS). 불펜 FIP는 reliever-only 자동(기본 4.05=중립). 모델: 선발58%+불펜42% 이닝가중.

엣지

MLB는 효율시장 — 엣지 없으면 보수
미체크 시 승패·언더오버 EV 문턱 +10%.

배당 — 풀게임 (MLB 4마켓)

MLB 승1패 1점차는 무승부 없음(정확히 ±1점).

EPL

잉글리시 프리미어리그 xG 기반 모델

출시 예정
🏀

NBA

미국프로농구 포인트스프레드 모델

출시 예정
계산 근거

📒 기록 · 피드백 루프

☁️ Google Sheets 연동 미연결
기기마다 처음 1회: Apps Script Web App URL 입력 → 같은 URL을 넣은 모든 기기가 열 때마다 최신 저장값(팀 스탯·픽)으로 자동 동기화됩니다. 기존에 쓰던 시트가 있다면 아래 최신 코드로 교체 후 '배포 관리 → 새 버전'으로 재배포하세요.
(Apps Script Web App URL 생성 방법)
① 새 구글 스프레드시트를 만들어요 (sheets.new 접속, 또는 드라이브에서 '새로 만들기 → Google 스프레드시트')
② 위쪽 메뉴에서 확장 프로그램 → Apps Script를 클릭해요
③ 편집 화면에 있는 기존 코드를 전부 지우고, 아래 '복사' 버튼으로 코드를 복사해서 붙여넣어요
④ 위쪽 저장(디스켓 모양) 아이콘을 눌러요
⑤ 오른쪽 위 배포 → 새 배포를 클릭해요
⑥ '유형 선택' 옆 톱니바퀴 아이콘을 누르고 웹 앱을 선택해요
⑦ 실행 사용자는 , 액세스 권한이 있는 사용자는 반드시 전체로 선택해요 (다른 걸 고르면 사이트에서 연결이 안 돼요)
⑧ '배포' 버튼을 눌러요 → 처음 한 번은 구글이 권한을 확인해요. '액세스 승인' → 본인 계정을 선택해요
⚠️ 이때 "Google에서 이 앱을 확인하지 않았습니다"라는 빨간 경고 화면이 뜰 수 있어요. 내가 직접 만든 스크립트라 안전하니 당황하지 말고, 화면 왼쪽 아래 고급을 누른 뒤 맨 아래 '(프로젝트 이름)(으)로 이동(안전하지 않음)'을 눌러 계속 진행하세요.
→ 다음 화면에서 요청 권한을 확인하고 허용을 누르면 완료돼요
⑨ 배포가 끝나면 …/exec로 끝나는 웹 앱 URL이 나와요. 이 주소를 복사해요
⑩ 위 'Apps Script Web App URL' 칸에 붙여넣고 '연결 테스트' 버튼을 눌러 "✅ 연결 성공"이 뜨는지 확인해요
💡 나중에 코드를 수정하면 저장만으로는 반영되지 않아요. '배포 → 배포관리 → 연필 아이콘'에서 버전을 '새 버전'으로 바꾸고 다시 배포해야 해요. URL은 그대로 유지돼요.
function doGet(e){
  var action=e.parameter.action;
  if(action==='ping')return json_({ok:true,v:2});
  if(action==='getPicks')return json_({picks:readAll_()});
  if(action==='getTeamDB')return json_(readTeamDB_());
  return json_({ok:false,error:'unknown action'});
}

function doPost(e){
  var lock=LockService.getScriptLock();
  lock.waitLock(20000);
  try{
    var body=JSON.parse(e.postData.contents);
    if(body.action==='appendPicks'||body.action==='upsertPicks'){upsertPicks_(body.picks||[],false);return json_({ok:true,v:2});}
    if(body.action==='syncFinalPicks'){upsertPicks_(body.picks||[],true);return json_({ok:true,v:2});}
    if(body.action==='deletePicks'){deletePicks_(body.keys||[]);return json_({ok:true,v:2});}
    if(body.action==='saveTeamDB'){var t=saveTeamDB_(body.teamDB||{});return json_({ok:true,v:2,savedAt:t});}
    return json_({ok:false,error:'unknown action'});
  }finally{lock.releaseLock();}
}

var HEADERS=['savedAt','date','league','match','market','pick','P','fair','ev','odds','stake','score','tier','expTotal','expMargin','actHome','actAway','actH1Home','actH1Away','hFIP','aFIP','hWRC','aWRC','hBP','aBP','hGB','aGB','PF','weather','wWeight','edge','result','archived'];

function sheet_(){
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sh=ss.getSheetByName('Picks');
  if(!sh){ sh=ss.insertSheet('Picks'); sh.appendRow(HEADERS); }
  if(sh.getMaxColumns()<HEADERS.length)sh.insertColumnsAfter(sh.getMaxColumns(),HEADERS.length-sh.getMaxColumns());
  if(sh.getRange(1,HEADERS.length).getValue()!==HEADERS[HEADERS.length-1])sh.getRange(1,1,1,HEADERS.length).setValues([HEADERS]);
  return sh;
}

var TEAMDB_HEADERS=['team','wrc','wrcR','slg','avg','savedAt'];

function teamDbSheet_(){
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sh=ss.getSheetByName('TeamDB');
  if(!sh){ sh=ss.insertSheet('TeamDB'); sh.appendRow(TEAMDB_HEADERS); }
  return sh;
}

function saveTeamDB_(teamDB){
  var sh=teamDbSheet_();
  var savedAt=new Date().toISOString(); // 저장 시각은 서버가 찍음 — 기기 시계가 어긋나도 순서 보장
  sh.clearContents();
  sh.appendRow(TEAMDB_HEADERS);
  Object.keys(teamDB).forEach(function(team){
    var t=teamDB[team]||{};
    sh.appendRow([team, t.wrc==null?'':t.wrc, t.wrcR==null?'':t.wrcR, t.slg==null?'':t.slg, t.avg==null?'':t.avg, savedAt]);
  });
  return savedAt;
}

function readTeamDB_(){
  var sh=teamDbSheet_();
  var data=sh.getDataRange().getValues();
  var db={}, savedAt='';
  for(var i=1;i<data.length;i++){
    var row=data[i]; if(!row[0])continue;
    db[row[0]]={wrc:row[1]===''?null:row[1], wrcR:row[2]===''?null:row[2], slg:row[3]===''?null:row[3], avg:row[4]===''?null:row[4]};
    if(row[5])savedAt=row[5] instanceof Date?row[5].toISOString():String(row[5]);
  }
  return {teamDB:db, savedAt:savedAt};
}

function json_(obj){
  return ContentService.createTextOutput(JSON.stringify(obj)).setMimeType(ContentService.MimeType.JSON);
}

// 픽 식별키: 저장시각(초 단위 정규화)|마켓|픽 — 사이트 쪽 pickKey와 동일 규칙
function keyOf_(savedAt,date,market,pick){
  var s=savedAt instanceof Date?savedAt.toISOString():String(savedAt||date||'');
  var t=Date.parse(s);
  var norm=isNaN(t)?s:new Date(t).toISOString().slice(0,19);
  return norm+'|'+market+'|'+pick;
}

// 같은 키의 픽이 있으면 그 행을 갱신, 없으면 추가. finalize=true면 아카이브 표시(모든 기기 목록에서 제외)
function upsertPicks_(picks,finalize){
  var sh=sheet_();
  var data=sh.getDataRange().getValues();
  var rowByKey={};
  for(var i=1;i<data.length;i++){rowByKey[keyOf_(data[i][0],data[i][1],data[i][4],data[i][5])]=i;}
  picks.forEach(function(p){
    if(finalize)p.archived='1';
    var key=keyOf_(p.savedAt,p.date,p.market,p.pick);
    var i=rowByKey[key];
    if(i===-1)return;
    if(i!==undefined){
      var row=HEADERS.map(function(h,c){ var v=p[h]!==undefined?p[h]:data[i][c]; return v===undefined?'':v; });
      sh.getRange(i+1,1,1,HEADERS.length).setValues([row]);
      data[i]=row;
    } else {
      sh.appendRow(HEADERS.map(function(h){ return p[h]!==undefined?p[h]:''; }));
      rowByKey[key]=-1;
    }
  });
}

function deletePicks_(keys){
  var sh=sheet_();
  var data=sh.getDataRange().getValues();
  var set={}; keys.forEach(function(k){set[k]=true;});
  for(var i=data.length-1;i>=1;i--){
    if(set[keyOf_(data[i][0],data[i][1],data[i][4],data[i][5])])sh.deleteRow(i+1);
  }
}

function readAll_(){
  var sh=sheet_();
  var data=sh.getDataRange().getValues();
  var picks=[];
  for(var i=1;i<data.length;i++){
    var row=data[i]; if(!row[0]&&!row[1])continue;
    var obj={}; HEADERS.forEach(function(h,idx){ obj[h]=row[idx]!==undefined?row[idx]:''; });
    picks.push(obj);
  }
  return picks;
}
최종픽 저장 → ② 경기 종료 후 아래 표에 실제 점수 입력 (전반 마켓은 5회말 기준) → ③ 스프레드시트에 저장 클릭 시 Sheets 최종 동기화 후 사이트 기록 초기화 → ④ 구글 드라이브 스프레드시트를 Claude에게 공유/첨부하면 캘리브레이션·오차·계수 보정 피드백과 개선 로드맵을 받을 수 있습니다.
날짜리그경기P배당픽점수(/100)실제 홈실제 원정삭제
📋 Claude 피드백 요청 프롬프트
이 구글 스프레드시트는 KBO·MLB 베팅 EV 예측 모델의 픽 기록입니다. 각 열 의미:
- market: 마켓종류 | pick: 최선픽 | P_model: 모델예측확률 | devig: 배당내재확률 | ev: 기댓값
- hFIP/aFIP: 홈·원정 선발FIP | hWRC/aWRC: 홈·원정 wRC+ | PF: 구장계수
- actHome/actAway: 최종점수 | actH1Home/actH1Away: 5회말 기준 전반점수 | result: W/L/P

아래 순서로 분석해주세요:
1. 마켓별 적중률·ROI 요약표
2. P_model 캘리브레이션 — 예측확률 구간별 실제 적중률 비교
3. FIP·wRC+ 등 입력변수와 오차의 상관관계 (과대평가·과소평가 패턴)
4. 계수 보정 제안 (fipCoefKBO·wrcFactor·sigF 등 조정 방향)
5. 마켓별 전략 개선점 (전반 마켓 포함)
6. 위 분석을 바탕으로 계수·모델 개선 로드맵을 우선순위와 함께 제시