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