View difference between Paste ID: LvCU1gag and pyDB3wiN
SHOW: | | - or go back to the newest paste.
1
#!/usr/bin/env python
2
3
"""
4
This script was made to understand probabilities behind SatoshiDice game
5
http://satoshidice.com/
6
7-
ToDo: implement MoneyManagement
7+
ToDo: implement martingales ...
8-
see fix lot
8+
9-
see martingale
9+
10
import numpy as np
11
import pandas as pd
12
import matplotlib.pylab as plt
13
14
class SatoshiDiceGameTester:
15
    def __init__(self):
16
        print("="*5+" Satoshidice "+"="*5)
17
        toss_nb = 65536
18
        max_nb = 2**16-1 # 65535
19-
        toss_nb = 60000
19+
20
        win_odds = float(less_than) / float(max_nb) * 100.0
21
        price_multiplier = 8
22
        house_percent = 1.9
23
        expected_rate_of_return	= 100.0 - house_percent
24
        min_bet = 0.01
25
        max_bet = 500
26
        
27
        print("""Playing {toss_nb} times to Satoshidice game less than {less_than}
28
    win_odds = {win_odds} %
29
    price_multiplier = {price_multiplier}
30
    house_percent = {house_percent} %
31
    expected_rate_of_return = {expected_rate_of_return} %
32
    min_bet = {min_bet}
33
    max_bet = {max_bet}""".format(
34
        toss_nb=toss_nb,
35
        less_than=less_than,
36
        win_odds=win_odds,
37
        price_multiplier=price_multiplier,
38
        house_percent=house_percent,
39
        expected_rate_of_return=expected_rate_of_return,
40
        min_bet=min_bet,
41
        max_bet=max_bet,
42
        ))
43
        
44
        toss = np.random.randint(0,max_nb,toss_nb)
45
        self.df = pd.DataFrame(toss, columns=['Toss'])
46-
        self.df = pd.DataFrame(np.random.randint(0,max_nb,toss_nb), columns=['Toss'])
46+
47
        #self.df['TossResults'] = np.where(self.df['Toss']<less_than, 1, -1) # 1 = win -1=lose
48
        
49
        self.df['TossResultsCumsum'] = self.df['TossResults'].cumsum()
50
        
51
        # Fix size
52
        self.df['Size'] = 1
53-
        self.df['Size'] = 0.01
53+
54
        self.df['BalanceVar'] = np.where(self.df['TossResults']>0, self.df['Size']*(price_multiplier-1), -self.df['Size']+0.005 * self.df['Size'])
55-
        self.df['BalanceVar'] = np.where(self.df['TossResults']>0, self.df['Size']*price_multiplier, -self.df['Size']+0.005 * self.df['Size'])
55+
56
        
57
        #print(self.df.head())
58-
        print(self.df.head())
58+
        #print(self.df)
59-
        print(self.df)
59+
        #print(self.df.tail())
60-
        print(self.df.tail())
60+
61
        exp_win = len(self.df[self.df['TossResults']>0])
62
        exp_loss = toss_nb - exp_win
63
        exp_win_pc = float(exp_win)/float(toss_nb)*100.0
64-
        exp_win_pc = float(exp_win)/float(toss_nb)*100
64+
        exp_loss_pc = float(exp_loss)/float(toss_nb)*100.0
65-
        exp_loss_pc = float(exp_loss)/float(toss_nb)*100
65+
        relative_difference = (exp_win_pc-win_odds)/win_odds*100.0
66-
        relative_difference = (exp_win_pc-win_odds)/win_odds*100
66+
        balance_final = self.df['Balance'].irow(toss_nb-1)
67
        house_pc_exp_final = -balance_final/self.df['Size'].sum()*100.0
68
        print("""Results:
69
    toss_nb={toss_nb}
70
    win={win}
71
    loss={loss}
72
    win={win_pc} %
73
    loss={loss_pc} %
74
    relative difference = {rel_diff} %
75
    min balance = {balance_min}
76-
    initial deposit = {balance_initial}""".format(
76+
77
    initial deposit = {balance_initial}
78
    final balance = {balance_final}
79
    house_percent (final) = {house_pc} %""".format(
80
  toss_nb=toss_nb,
81
  win=exp_win,
82
  loss=exp_loss,
83
  win_pc=exp_win_pc,
84
  loss_pc=exp_loss_pc,
85-
  balance_initial = initial_balance
85+
86
  balance_min = self.df['Balance'].min(),
87
  balance_max = self.df['Balance'].max(),
88
  balance_initial = initial_balance,
89-
        self.df.to_excel('out.xls')
89+
  balance_final = balance_final,
90
  house_pc=house_pc_exp_final,
91-
        fig = plt.figure()
91+
92
  
93-
        fig.subplots_adjust(bottom=0.1)
93+
        #self.df.to_excel('out.xls') # only 65535 rows
94-
        #ax = fig.add_subplot(311)
94+
95-
        #plt.title("Toss")
95+
96-
        #self.df.plot(x=self.df.index, y='Toss', style='*')
96+
        #Only Uncomment plot for small tosses number
97
        #fig = plt.figure()
98-
        #ax = fig.add_subplot(312)
98+
        #fig.subplots_adjust(bottom=0.1)
99-
        #plt.title("Toss Results")
99+
100-
        #self.df.plot(x=self.df.index, y='TossResults', style='*')
100+
        ##ax = fig.add_subplot(311)
101
        ##plt.title("Toss")
102-
        #ax = fig.add_subplot(313)
102+
        ##self.df.plot(x=self.df.index, y='Toss', style='*')
103-
        ax = fig.add_subplot(111)
103+
104-
        #plt.title("Toss Results Cumsum")
104+
        ##ax = fig.add_subplot(312)
105-
        #self.df.plot(x=self.df.index, y='TossResultsCumsum')
105+
        ##plt.title("Toss Results")
106-
        plt.title("Balance")
106+
        ##self.df.plot(x=self.df.index, y='TossResults', style='*')
107-
        self.df.plot(x=self.df.index, y='Balance')
107+
108
        ##ax = fig.add_subplot(313)
109
        #ax = fig.add_subplot(111)
110
        ##plt.title("Toss Results Cumsum")
111
        ##self.df.plot(x=self.df.index, y='TossResultsCumsum')
112
        #plt.title("Balance")
113-
        plt.show() # pause     
113+
        #self.df.plot(x=self.df.index, y='Balance')
114
115
        #fileOut='out/fig/fig_{0}.png'.format(filename)
116
        #print("Generating {0}".format(fileOut))
117
        #plt.savefig(fileOut)
118
119
        #plt.show() # pause     
120
121
122
g = SatoshiDiceGameTester()