카테고리 없음

[Python] 마틴게일 배팅법 시뮬레이션

대장코린이 2024. 3. 13. 17:09

안녕하세요, 대장코린이입니다.

 

제가 평소에 주식이나 실생활에서 수입을 낼 수 있는 방법에 대해 많이 고민합니다(부자되고싶어요...).

 

그중 마틴게일이 눈에 들어왔는데요.

마틴게일 배팅법은, 50% 확률로 2배의 수익을 얻을 수 있다면, 실패시 배팅금을 2배씩 올리는 방법입니다.

한마디로 몇번을 지던 한번만 이기면 이전의 모든 손실을 엎을만큼 배팅하는 것이죠.

 

사실 이론상 시드가 무한하다면 절대 잃지 않는 방법이기도 합니다.

하지만 반대로 무한히 반복하다보면 반드시 실패하는 방법이기도 하죠.

초기 배팅금이 아무리 작더라도 10번 20번 연속 실패할 확률은 반드시 존재하며

무한히 반복되다보면 언젠간 반드시 청산하게 됩니다.

 

하지만 청산당하기 직전까지라면, 무조건 수익을 내는 것도 맞습니다.

그럼... 초기 배팅금과 비율을 잘 조절하다보면 수익을 낼 수 있지 않을까? 하는 생각이 들었습니다.

 

뭐.. 손으로 백날 계산해봐야 머리아프니 바로 코드 작성해보겠습니다.

 


1. 기본 설정

초기 자본금은 10000원, 초기 베팅금은 0.2프로로 잡아보겠습니다.

init_martin = 10000

start_bet = init_martin*0.002


class Bet:
    def __init__(self,money,start_bet):
        self.start_bet = start_bet
        self.log =[]
        self.win=0
        self.lose=0
        self.log_win =[]
        self.money = money
        self.bet = start_bet
martin = Bet(init_martin,start_bet)

 

먼저 Bet을 class로 정의해 주었습니다. 꼭 이럴 필욘 없는데... 저는 이것저것 배팅 방법을 커스터마이징 하기 위해 이렇게 작성했었어요.


2. 배팅 구현

n=0
while 1:
    n+=1    
    win = np.random.randint(2)
    
    if win == 1:
        martin.money += martin.bet
        martin.bet = martin.start_bet
        martin.win += 1
        martin.lose = 0
        martin.log_win.append(martin.win)
        
        
    else:
        martin.money -= martin.bet
        martin.bet = martin.bet*2
        martin.win =0
        martin.lose +=1
        martin.log_win.append(-martin.lose)
        

    martin.log.append(martin.money)
    #print(martin.)
    

    if n >= 5000:
        break

시뮬레이션 코드부분입니다.

랜덤하게 50% 확률을 가지고 승패를 나누고, 이겼을 시 martin.money라는 전체 소지금에 배팅금액인 martin.bet을 더하고,

martin.bet은 다시 초기 베팅금인 martin.start_bet으로 초기화시켜줍니다.

그리고 승패 로그를 남겨줍니다.

 

반대로 졌다면, martin.money에 베팅금을 차감하고, 배팅금을 두배로 올려줍니다.

 

총 5000번의 횟수를 진행을 하였습니다.


3. 결과 시각화

fig,axes = plt.subplots(nrows=2,ncols=1,figsize=(9,9))
plt.subplots_adjust(wspace=0,hspace=0.1,bottom = 0.06,left = 0.1,top = 0.93,right=0.96)


x = np.arange(n)+1
axes[0].plot([x[0],x[-1]],[10000,10000],color='gray',linestyle='--')
axes[0].plot([x[0],x[-1]],[15000,15000],color='gray',linestyle='--')
axes[0].plot([x[0],x[-1]],[20000,20000],color='gray',linestyle='--')


martin.log = np.array(martin.log)

ind = np.where(np.array(martin.log )< 0)
if ind[0].shape[0] != 0:
    martin.log[ind[0][0] : ] = 0



axes[0].plot(x,martin.log,'blue')

axes[1].bar(x,martin.log_win)


fig.text(0.11,0.89,f'win : {max(martin.log_win)}\nlose : {min(martin.log_win)}')

yrange = axes[0].get_ylim()

axes[0].set_xlim(x[0],x[-1])
axes[-1].set_xlim(x[0],x[-1])
axes[0].set_ylim(0,yrange[1])

 

이제 결과를 확인해봐야겠죠.

결과를 쉽게 확인하기 위해 시각화를 해주겠습니다.

먼저 도화지를 꺼내주고, 10000원, 15000원, 20000만원 수익 구간에 대해 점선으로 표시해주었습니다.

 

그리고 만약 5000번 이전에 청산하였다면, 그 이후 값들에 대해선 0으로 처리해주었습니다.


4. 결과

결과를 보시죠

이 케이스의 경우 아주아주 잘풀린 경우입니다.

중간에 연속으로 11번의 패배를 하며 청산당할뻔한 위기가 있었지만, 극복하여 계속해서 수익을 냈네요.

 

반대로 이런 케이스도 있었어요.

완전 억까당했다고 볼 수 있는데요, 시작한지 얼마 되지 않아 13번 연속 패배하고 청산당해버렸습니다...

 

역시 확률이란 어쩔 수 없네요 ^^....


5. 보너스

 

 

다음은 추가로 마틴게일을 조금더 변형시켜보았습니다.

만약 배팅금이 초기 자본보다 커지면, 초기 베팅금으로 초기화시켜주는 방법인데요

.... 별로 좋진 않네요 ^^... 더 목숨이 길어졌지만 뭐... 의미가 없습니다.

추가로 좋은 방법이 있다면 알려주세요.

 

오늘은 이렇게 파이썬으로 간단한 시뮬레이션을 해보았습니다.

도움이 되었으면 좋겠습니다.