AlirezaX2's picture
fix kelly methods
2132206
import pandas as pd
import numpy as np
import math
import hvplot as hv
import holoviews as hvs
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, selectedmethod):
hv.extension('bokeh')
if selectedmethod=='Full Kelly Criterion':
# betsize = 2 * bet_chance-100
betsize = 100 * ((bet_chance/100) - ( (1-(bet_chance/100))/rewardrisk))
elif selectedmethod== 'Half Kelly Criterion':
# betsize = 0.5 * ( 2*bet_chance-100)
betsize = 100*( 0.5* ( (bet_chance/100) - ( (1-(bet_chance/100))/rewardrisk) ) )
elif selectedmethod=='Fractional Kelly Criterion':
# betsize = 0.25 * (2*bet_chance-100)
betsize = 100* ( 0.25* ( (bet_chance/100) - ( (1-(bet_chance/100))/rewardrisk) ) )
bet = lambda cash: cash * (betsize/100)
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/100):
cash += bet_value *rewardrisk * (riskpercent/100) #*.1
else:
cash -= bet_value *(riskpercent/100) #* .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') * hvs.HLine(max_profit)
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"""### Result of Simulation for {num_realization} Realization:
Blowout Accounts: {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}$
intial bet {betsize*initialcapital/100:.1f}$ with winrate={bet_chance}% reward to risk={rewardrisk}:1 and possible reward/loss={riskpercent/100*betsize*initialcapital/100:.1f}$ and betsize = {betsize:.1f}%
"""
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=1000, end=100000, step=1000, value=2000)
bet_chance = pn.widgets.FloatSlider(name='Win Rate %', start=0, end=100, step=0.1, value=60.0)
betsize = pn.widgets.FloatSlider(name='Bet Size %', start=0, end=100.0, step=1, value=50)
rewardrisk = pn.widgets.FloatSlider(name='Reward:Risk', start=0, end=10, step=0.1, value=1.0)
riskpercent = pn.widgets.FloatSlider(name='Risk %', start=0, end=100.0, step=1, value=10.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='Not', options=['Not' ,'Full Kelly Criterion' , 'Half Kelly Criterion' , 'Fractional Kelly Criterion','Constant Proportion Betting'])
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,selectedmethod=selectedmethod)
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")