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