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() |