File size: 3,204 Bytes
23e09d4
 
 
 
 
 
 
 
e8811b3
23e09d4
 
e8811b3
23e09d4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0d7094d
23e09d4
 
 
 
0d7094d
23e09d4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import pandas as pd
import numpy as np
import math

import hvplot as hv
import panel as pn
import hvplot.pandas

pn.extension('bokeh', template='bootstrap')

def simulate(initialcapital , bet_chance , betsize , rewardrisk, riskpercent, max_rounds, max_profit , num_realization):
  hv.extension('bokeh')

  bet = lambda cash: cash * betsize

  all_profits = []
  for i in range(0, num_realization):
      profits = []
      cash = initialcapital
      for i in range(0, max_rounds):
          if cash <= 1: # went blowout
              break

          if cash >= max_profit:
              break

          bet_value = bet(cash)
          if np.random.rand() < bet_chance:
              cash += bet_value *rewardrisk * riskpercent #*.1
          else:
              cash -= bet_value *riskpercent #* .05

          profits.append(cash)

      all_profits.append(profits)
  df = pd.DataFrame(all_profits).T
  plot1 =  df.hvplot.line( logy=True, height=600, width=1200).opts(show_grid=True, ylabel='Profit', xlabel='Bet')

  bust = [ x for x in all_profits if x[-1] <= 1 ]
  rich = [ x for x in all_profits if x[-1] >= max_profit ]
  text = f"""Blowout: {round(len(bust) / len(all_profits) * 100)} %
             Avg time to go Blowout: {np.mean([ len(x) for x in bust ]):.1f}
             Reach Max profit: {round(len(rich) / len(all_profits) * 100):.1f} %
             Avg time to reach max profit:, {np.mean([ len(x) for x in rich ]):.1f}
             Challenge from {initialcapital}$ to {max_profit}$
          """
  if round(len(bust) / len(all_profits)) > .5:
    alert_type="danger"
  else:
    alert_type="success"
  return pn.Column(plot1, pn.pane.Alert(text, alert_type=alert_type, height=150, width=1200, sizing_mode="fixed"))


initialcapital = pn.widgets.IntSlider(name='Initial Capital', start=0, end=100000, step=1000, value=2000)
bet_chance = pn.widgets.FloatSlider(name='Win Rate', start=0, end=1.0, step=0.1, value=0.60)
betsize = pn.widgets.FloatSlider(name='Bet Size', start=0, end=1.0, step=0.1, value=0.50)
rewardrisk = pn.widgets.FloatSlider(name='Reward Risk', start=0, end=1.0, step=0.1, value=1.0)
riskpercent = pn.widgets.FloatSlider(name='risk percent', start=0, end=1.0, step=0.1, value=1.0)
max_rounds = pn.widgets.IntSlider(name='Max Rounds', start=1000, end=10000, step=1000, value=1000)
max_profit = pn.widgets.IntSlider(name='Max Profit', start=10000, end=10000000, step=1000, value=1000000)
num_realization = pn.widgets.IntSlider(name='Number of Realization', start=100, end=10000, step=100, value=100)
selectedmethod = pn.widgets.Select(name='Select Method', value='Mean', options=['Full Kelly Criterion' , 'Half Kelly Criterion' , 'Fractional Kelly Criterion','Constant Proportion Betting','Martingale Betting System'])


bound_plot = pn.bind(simulate, initialcapital= initialcapital, bet_chance =bet_chance , betsize=betsize , rewardrisk=rewardrisk, riskpercent=riskpercent, max_rounds=max_rounds, max_profit=max_profit , num_realization=num_realization)

pn.Row(pn.Column(initialcapital, bet_chance, betsize, rewardrisk, riskpercent, max_rounds, max_profit, num_realization,selectedmethod),bound_plot).servable(title="Bet Size Optimizer - Simulation Account Growth")