이 정도까지만 옮겨야겠다. 일 열심히도 했네 나..
이번 주는 A매치 주간으로, 대부분의 리그 경기가 잠시 멈춰져있는데요! 여기에 API 업체 이슈까지 겹쳐져 모델링 작업을 잠시 쉬어가게 되었어요. 선수 데이터도 들어오면 모델링에 추가해서 모델을 더욱 고도화 할 계획이었는데, 잠시 미뤄둬야겠네요!
보통 리그경기가 모두 있을 땐 하루에 50개가 넘는 경기를 예측하는데, 이렇게 모댈링이 잠시 쉬어 여유가 생겼을 때 다양한 것들을 시도해봐야겠다는 생각이 들더라구요! 그러다 나온 아이디어가 바로 조합픽에 대한 것이었어요.
이전 제 글을 봤을 때도 아시다싶이, 모델링 예측 결과로 프로토를 구매하는 분들이 종종 있는데요! 경기가 많을 땐 도대체 어떤 경기를 구매해야 하는지 어려울 때가 있다고 해요. 그래서 다양한 기준을 가지고 ‘이 경기를 구매하세요!’ 하고 알려주는 조합픽을 원하시는 분들도 있더라구요!
저희 올스탯은 원래 AI 예측과 전력분석 전문가님들의 예측 프리뷰를 데이터와 함께 제공하는 서비스로서, 소비자가 읽어보고 직접 선택하고 구매할 수 있는 기회를 드리는게 강점이지만 또 그런 조합픽을 원하시는 분들도 있을테니, 여유가 생겼을 때 좀 더 연구해보기로 했습니다!
저는 조합픽을 3가지 구분으로 만들어보기로 했어요!
1) 무조건 안정형! 모델링 예측 확률이 가장 높은 순서로
2) 무조건 배당형! 고배당 결과로 예측한 순서로
3) 나는 중도를 간다! 적당한 배당과 적당히 높은 확률의 순서로
여러분들은 어떤 형인가요 ;)
여기서 확률이란, Classification으로 돌렸을 때 나오는 Score를 기준으로 했어요. 따라서 Regression으로 돌리는 언더오버는 확률을 알 수 없기때문에, 조합에는 들어가지 않는답니다!
그럼 안정형부터 코드를 짜러 떠나볼까요!
일단 모델링 결과가 있는 테이블과 배당률이 있는 테이블들을 파이썬으로 불러와 준 뒤 시작할게요. 현재 저희는 해외 업체들의 배당률을 불러와 사용하고 있다는 점 참고해주세요!
저는 이렇게 총 4개의 테이블을 불러왔어요. 승무패, 핸디캡, 언더오버의 배당률을 각각의 테이블로 관리하고 있기때문에 테이블이 조금 많아졌네용. 하지만 조합픽을 만들며 이 네개의 테이블을 모두 합칠 예정이니, 걱정하지 않으샤도 됩니다! (복잡한 테이블은 너굴맨이 처리했으니 걱정말라구!)
팀명을 일치시킨다거나 빠져있는 카테고리를 추가한다거나 하는 자잘한 작업은 알테니 스킵! 하고 모델 테이블을 가공해봐요. 현재 같은 테이블에 매주 두 번씩 모델링 결과를 업데이트 하고있는데요, 이 테이블을 다 가져오면 과거의 경기들까지 포함해서 조합해버리기 때문에 이번 회차 경기들만 먼저 잘라내는 과정이 필요해요!
cut = []
for i in range(1,len(model)):
# if i < len(model):
if (model['category'][i-1] == 'under over') & (model['category'][i] == 'normal'):
cut.append(i)
else:
pass
# cut
model_new = model[-(len(model)-cut[-1:][0]):].reset_index().drop('index',axis=1)
model_new.insert(16, 'High_Score',0.0000)
for i in range(0,len(model_new)):
if (model_new['Score_0'][i] > model_new['Score_1'][i]) & (model_new['Score_0'][i] > model_new['Score_3'][i]):
model_new['High_Score'][i] = model_new['Score_0'][i]
elif (model_new['Score_1'][i] > model_new['Score_0'][i]) & (model_new['Score_1'][i] > model_new['Score_3'][i]):
model_new['High_Score'][i] = model_new['Score_1'][i]
elif (model_new['Score_3'][i] > model_new['Score_0'][i]) & (model_new['Score_3'][i] > model_new['Score_1'][i]):
model_new['High_Score'][i] = model_new['Score_3'][i]
모델링이 한 번 돌면 노말-핸디캡-언더오버 순서로 DB에 들어가기 때문에, 언더오버 다음 노말이 나온다면 회차가 넘어갔다는 의미라고 해석할 수 있어요. 이 특징을 이용해서 가장 최근 회차의 경기들만 잘라보았습니다!
1. 안정형
그럼 이제 안정형으로 5경기만 조합해봐요. 이번 회차 경기들을 대상으로 짠 코드라, K리그와 J리그 3경기밖에 없지만 참고만 해주세요!
pick_1 = model_new.sort_values(by='High_Score', ascending=False).reset_index(drop=True)
pick_1 = pick_1[['match_id','competition','season','date','home','away','Label','category','base_line','High_Score']
test = pd.merge(pick_1,odd_concat, how='inner',on=['date','home','away','category'])[:5]
test.insert(10,'odd',0.0000)
for i in range(0,len(test)):
if test['category'][i] == 'normal':
if test['Label'][i] == 0:
test['odd'][i] = test['away_odd'][i]
elif test['Label'][i] == 1:
test['odd'][i] = test['draw_odd'][i]
elif test['Label'][i] == 3:
test['odd'][i] = test['home_odd'][i]
elif test['category'][i] == 'handicap':
if test['Label'][i] == 0:
test['odd'][i] = test['away_odd'][i]
elif test['Label'][i] == 1:
test['odd'][i] = test['draw_odd'][i]
elif test['Label'][i] == 3:
test['odd'][i] = test['home_odd'][i]
test = test[['match_id', 'competition', 'season', 'date', 'home', 'away', 'Label',
'category', 'base_line_x', 'High_Score','odd']]
test.columns = ['match_id', 'competition', 'season', 'date', 'home', 'away', 'Label',
'category', 'base_line', 'High_Score','odd']
이렇게 확률을 기준으로 sorting 하고, 최종 배당률을 계산하기 위해 각 결과에 맞는 배당률도 붙여주었어요. 그럼 정리된 데이터 프레임을 확인해볼까요?
짠! 이렇게 5개가 조합되었네요. 만약, 이렇게 5경기를 구매한다면 약 몇배의 배당률을 받을 수 있을까요?
해외 배당률 기준이라 조금 높게 나왔네요! 약 47배!
저는 코드를 돌려 이렇게 간단한 표로 확인했지만, 일반 유저분들에게도 공개한다는 전제 하에 메신저를 통해 공개하면 어떨까 싶어서 또! 텔레그램봇을 활용해보았어요ㅎㅎ
이렇게 메신저로 받을 수 있다면 참 편하겠죠?🥺
그럼 바로 다음! 배당형으로 넘어가볼까요!
2. 배당형
앞서 가공은 다 해놨기때문에, sorting 기준만 살짝 바꿔 배당형 조합을 만들 수 있어요.
test_odd = test2.sort_values(by='odd',ascending=False).reset_index (drop = True)[:5]
test_odd
기준을 배당으로만 바꿔주었어요. 확률은 70%대로 떨어졌지만, 배당은 3.xx배로 크게 올랐네요!
최종 배당률도 80배! 이 조합도 메신저로 받아본다면 이렇겠죠?
마지막으로, 배당률과 확률을 모두 고려한 조합을 볼까요?
3. AI픽
AI픽은 두가지 조건을 모두 고려해야 해서, 단순 sorting으로는 조합하지 못하고 조건을 추가한 다음 sorting을 해줄게요!
test3_odd = test3[test3['odd'] > 2].sort_values(by='High_Score') .reset_index(drop=True)[:5]
test3_odd
배당률이 2배가 넘는 경기들 중 확률이 높은 순으로 조합했는데, 경기가 적다보니 3경기밖에 나오지 않았네요. 그래도 코드는 멀쩡한걸로!
배당률은 21배!
여러분은 어떤 조합이 가장 끌리시나요? ;)
'Dev > python' 카테고리의 다른 글
다시 돌아온 취준생활, 프로젝트 정리 (0) | 2021.10.28 |
---|---|
추가! 나의 파이썬 공부기록 (0) | 2021.10.27 |
싸늘하다...가슴에 성적표가 날아와 꽂힌다...한 경기씩 채점하며 지금까지의 적중률을 계산해봅시다! (0) | 2021.10.27 |
안녕하세요? 그 저기 데이터 좀 쓸게요(총총총..KBO 데이터 크롤링 해보기! (0) | 2021.10.27 |
느슨해진 모델링에 긴장감을 주는 APScheduler와 텔레그램봇 (0) | 2021.10.27 |