bets-weights / app.py
hermanda's picture
Create app.py
4aba1ab verified
import gradio as gr
import pandas as pd
import numpy as np
def calculate_surebet(odd1, odd2, granularity, min_total_bet, max_total_bet, step_total_bet):
if odd1 <= 1 or odd2 <= 1 or granularity <= 0:
return "Please enter valid odds greater than 1 and a positive granularity."
if min_total_bet <= 0 or max_total_bet <= 0 or step_total_bet <= 0:
return "Please enter positive values for minimum bet, maximum bet, and step."
if min_total_bet >= max_total_bet:
return "Minimum total bet must be less than the maximum total bet."
# Check for arbitrage opportunity
arbitrage_percentage = (1 / odd1) + (1 / odd2)
if arbitrage_percentage >= 1:
return "No arbitrage opportunity exists with these odds."
else:
# Define the range of total bets based on user inputs
total_bet_range = np.arange(min_total_bet, max_total_bet + step_total_bet, step_total_bet)
table_rows = []
# Calculate proportions for the bets
proportion1 = (1 / odd1) / ((1 / odd1) + (1 / odd2))
proportion2 = (1 / odd2) / ((1 / odd1) + (1 / odd2))
for T in total_bet_range:
# Initial weights before applying granularity
w1 = T * proportion1
w2 = T * proportion2
# Adjust weights according to granularity
w1_adj = np.round(w1 / granularity) * granularity
w2_adj = T - w1_adj # Ensure the total bet remains T
# Calculate profits for both outcomes
profit1 = w1_adj * odd1 - T
profit2 = w2_adj * odd2 - T
min_profit = min(profit1, profit2)
table_rows.append({
'Total Bet': T,
'Bet on Outcome 1': w1_adj,
'Bet on Outcome 2': w2_adj,
'Profit if Outcome 1 Wins': profit1,
'Profit if Outcome 2 Wins': profit2,
'Minimum Profit': min_profit
})
# Create DataFrame
df = pd.DataFrame(table_rows)
df = df.round({
'Total Bet': 2,
'Bet on Outcome 1': 2,
'Bet on Outcome 2': 2,
'Profit if Outcome 1 Wins': 2,
'Profit if Outcome 2 Wins': 2,
'Minimum Profit': 2
})
return df
with gr.Blocks() as demo:
with gr.Row():
with gr.Column(scale=1):
odd1_input = gr.Number(label="Odd 1", value=1.37)
odd2_input = gr.Number(label="Odd 2", value=3.87)
granularity_input = gr.Number(label="Granularity", value=0.05)
min_total_bet_input = gr.Number(label="Minimum Total Bet", value=10)
max_total_bet_input = gr.Number(label="Maximum Total Bet", value=50)
step_total_bet_input = gr.Number(label="Step Size", value=2)
calculate_button = gr.Button("Calculate")
with gr.Column(scale=3):
output_df = gr.Dataframe(label="Optimal Weights and Profits")
calculate_button.click(
fn=calculate_surebet,
inputs=[
odd1_input,
odd2_input,
granularity_input,
min_total_bet_input,
max_total_bet_input,
step_total_bet_input
],
outputs=output_df
)
demo.launch()