def best_match_under_conditions(site, minimum_odd, bet, sport="football", date_max=None, time_max=None, date_min=None, time_min=None, one_site=False, live=False): """ Retourne le meilleur match sur lequel miser lorsqu'on doit miser une somme donnée à une cote donnée. Cette somme peut-être sur seulement une issue (one_site=False) ou bien répartie sur plusieurs issues d'un même match (one_site=True), auquel cas, chacune des cotes du match doivent respecter le critère de cote minimale. """ odds_function = lambda best_odds, odds_site, i: ((best_odds[:i] + [odds_site[i] * 0.9 if live else odds_site[ i]] + best_odds[i + 1:]) if not one_site else (odds_site[:i] + [odds_site[i] * 0.9 if live else odds_site[i]] + odds_site[i + 1:])) profit_function = lambda odds_to_check, i: (gain(odds_to_check, bet) - bet if one_site else gain2(odds_to_check, i, bet)) criteria = lambda odds_to_check, i: ((not one_site and odds_to_check[i] >= minimum_odd) or (one_site and all(odd >= minimum_odd for odd in odds_to_check))) display_function = lambda best_overall_odds, best_rank: (mises2(best_overall_odds, bet, best_rank, True) if not one_site else mises(best_overall_odds, bet, True)) result_function = lambda best_overall_odds, best_rank: (mises2(best_overall_odds, bet, best_rank, False) if not one_site else mises(best_overall_odds, bet, False)) best_match_base(odds_function, profit_function, criteria, display_function, result_function, site, sport, date_max, time_max, date_min, time_min, one_site=one_site)
def best_match_freebet(site, freebet, sport="football", live=False, date_max=None, time_max=None, date_min=None, time_min=None): """ Retourne le match qui génère le meilleur gain pour un unique freebet placé, couvert avec de l'argent réel. """ fact_live = 1 - 0.2 * live odds_function = lambda best_odds, odds_site, i: ( best_odds[:i] + [odds_site[i] * fact_live - 1] + best_odds[i + 1:]) profit_function = lambda odds_to_check, i: gain2(odds_to_check, i) + 1 criteria = lambda odds_to_check, i: True display_function = lambda x, i: mises_freebet( x[:i] + [x[i] + 1] + x[i + 1:], freebet, i, True) result_function = lambda x, i: mises_freebet( x[:i] + [x[i] + 1] + x[i + 1:], freebet, i, False) best_match_base(odds_function, profit_function, criteria, display_function, result_function, site, sport, date_max, time_max, date_min, time_min, freebet=True)
def best_match_pari_gagnant(site, minimum_odd, bet, sport="football", date_max=None, time_max=None, date_min=None, time_min=None): """ Retourne le meilleur match sur lequel miser lorsqu'on doit gagner un pari à une cote donnée sur un site donné. """ odds_function = lambda best_odds, odds_site, i: odds_site profit_function = lambda odds_to_check, i: gain2( odds_to_check, np.argmax(odds_to_check), bet) criteria = lambda odds_to_check, i: all(odd >= minimum_odd for odd in odds_to_check) display_function = lambda best_overall_odds, best_rank: mises2( best_overall_odds, bet, np.argmax(best_overall_odds), True) result_function = lambda best_overall_odds, best_rank: mises2( best_overall_odds, bet, np.argmax(best_overall_odds), False) best_match_base(odds_function, profit_function, criteria, display_function, result_function, site, sport, date_max, time_max, date_min, time_min, one_site=True)
def best_matches_combine(site, minimum_odd, bet, sport="football", nb_matches=2, one_site=False, date_max=None, time_max=None, date_min=None, time_min=None, minimum_odd_selection=1.01): """ Retourne les meilleurs matches sur lesquels miser lorsqu'on doit miser une somme donnée à une cote donnée sur un combiné """ all_odds = filter_dict_dates(sportsbetting.ODDS[sport], date_max, time_max, date_min, time_min) sportsbetting.ALL_ODDS_COMBINE = {} for combine in combinations(all_odds.items(), nb_matches): try: if all([ odd >= minimum_odd_selection for odds in list( all_odds[match[0]]["odds"][site] for match in combine) for odd in odds ]): (sportsbetting.ALL_ODDS_COMBINE[" / ".join([ match[0] for match in combine ])]) = cotes_combine_all_sites( *[match[1] for match in combine]) except KeyError: pass odds_function = lambda best_odds, odds_site, i: ( (best_odds[:i] + [odds_site[i]] + best_odds[i + 1:]) if not one_site else odds_site) profit_function = lambda odds_to_check, i: (gain(odds_to_check, bet) - bet if one_site else gain2( odds_to_check, i, bet)) criteria = lambda odds_to_check, i: ( (not one_site and odds_to_check[i] >= minimum_odd) or (one_site and all(odd >= minimum_odd for odd in odds_to_check))) display_function = lambda best_overall_odds, best_rank: ( mises2(best_overall_odds, bet, best_rank, True) if not one_site else mises(best_overall_odds, bet, True)) result_function = lambda best_overall_odds, best_rank: ( mises2(best_overall_odds, bet, best_rank, False) if not one_site else mises(best_overall_odds, bet, False)) best_match_base(odds_function, profit_function, criteria, display_function, result_function, site, sport, date_max, time_max, date_min, time_min, True, nb_matches, one_site=one_site)
def best_matches_combine(site, minimum_odd, bet, sport="football", nb_matches=2, one_site=False, date_max=None, time_max=None, date_min=None, time_min=None, minimum_odd_selection=1.01): """ Retourne les meilleurs matches sur lesquels miser lorsqu'on doit miser une somme donnée à une cote donnée sur un combiné """ all_odds = filter_dict_dates(sportsbetting.ODDS[sport], date_max, time_max, date_min, time_min) all_odds = filter_dict_minimum_odd(all_odds, minimum_odd_selection, site) sportsbetting.ALL_ODDS_COMBINE = {} nb_combine = binomial(len(all_odds), nb_matches) sportsbetting.PROGRESS = 0 def compute_all_odds_combine(nb_combine, combine): sportsbetting.PROGRESS += 100/nb_combine try: sportsbetting.ALL_ODDS_COMBINE[" / ".join([match[0] for match in combine])] = cotes_combine_all_sites(*[match[1] for match in combine]) except KeyError: pass ThreadPool(4).map(lambda x: compute_all_odds_combine(nb_combine, x), combinations(all_odds.items(), nb_matches)) sportsbetting.PROGRESS = 0 odds_function = lambda best_odds, odds_site, i: ((best_odds[:i] + [odds_site[i]] + best_odds[i + 1:]) if not one_site else odds_site) profit_function = lambda odds_to_check, i: (gain(odds_to_check, bet) - bet if one_site else gain2(odds_to_check, i, bet)) criteria = lambda odds_to_check, i: ((not one_site and odds_to_check[i] >= minimum_odd) or (one_site and all(odd >= minimum_odd for odd in odds_to_check))) display_function = lambda best_overall_odds, best_rank: (mises2(best_overall_odds, bet, best_rank, True) if not one_site else mises(best_overall_odds, bet, True)) result_function = lambda best_overall_odds, best_rank: (mises2(best_overall_odds, bet, best_rank, False) if not one_site else mises(best_overall_odds, bet, False)) best_match_base(odds_function, profit_function, criteria, display_function, result_function, site, sport, date_max, time_max, date_min, time_min, True, nb_matches, one_site=one_site, combine_opt=True)
def best_stakes_match(match, site, bet, minimum_odd, sport="football"): """ Pour un match, un bookmaker, une somme à miser sur ce bookmaker et une cote minimale donnés, retourne la meilleure combinaison de paris à placer """ best_match, all_odds = odds_match(match, sport) if not all_odds: print("No match found") return print(best_match) pprint(all_odds) odds_site = all_odds['odds'][site] best_odds = copy.deepcopy(odds_site) best_profit = -float("inf") n = len(all_odds['odds'][site]) best_sites = [site for _ in range(n)] best_i = 0 best_overall_odds = None bets = None sites = None for odds in all_odds['odds'].items(): for i in range(n): if odds[1][i] > best_odds[i] and (odds[1][i] >= 1.1 or odds[0] == "pmu"): best_odds[i] = odds[1][i] best_sites[i] = odds[0] for i in range(n): if odds_site[i] >= minimum_odd: odds_to_check = (best_odds[:i] + [odds_site[i]] + best_odds[i + 1:]) profit = gain2(odds_to_check, i, bet) if profit > best_profit: best_profit = profit best_overall_odds = odds_to_check sites = best_sites[:i] + [site] + best_sites[i + 1:] bets = mises2(odds_to_check, bet, i) best_i = i if best_overall_odds: mises2(best_overall_odds, bet, best_i, True) afficher_mises_combine(best_match.split(" / "), [sites], [bets], all_odds["odds"], sport) else: print("No match found")
def best_combine_reduit(matches, combinaison_boostee, site_combinaison, mise, sport, cote_boostee=0): def get_odd(combinaison, matches, site_combinaison=None): sites = [ 'betclic', 'betstars', 'bwin', 'france_pari', 'joa', 'netbet', 'parionssport', 'pasinobet', 'pmu', 'unibet', 'winamax', 'zebet' ] if site_combinaison: sites = [site_combinaison] best_odd = 1 best_site = "" for site in sites: odd = 1 for i, match in zip(combinaison, matches): if i != float("inf"): if site in sportsbetting.ODDS[sport][match]["odds"].keys(): odd *= sportsbetting.ODDS[sport][match]["odds"][site][ i] else: break if odd > best_odd: best_odd = odd best_site = site # print(best_odd, best_site) return best_odd, best_site odds = {} for match in matches: odds[match] = sportsbetting.ODDS[sport][match] best_combinaison = [] best_cotes = [] best_sites = [] best_gain = -mise best_i = -1 for combinaisons in combine_reduit_rec(combinaison_boostee, sport): cotes = [] sites = [] for i, combinaison in enumerate(combinaisons): if list(combinaison) == combinaison_boostee: i_boost = i sites.append(site_combinaison) if cote_boostee: cotes.append(cote_boostee) else: cotes.append( get_odd(combinaison, matches, site_combinaison)[0]) else: res = get_odd(combinaison, matches) cotes.append(res[0]) sites.append(res[1]) new_gain = gain2(cotes, i_boost, mise) if new_gain > best_gain: best_cotes = cotes best_sites = sites best_combinaison = combinaisons best_gain = new_gain best_i = i_boost matches_name = " / ".join(matches) print(matches_name) mises = mises2(best_cotes, mise, best_i) out = {} def get_issue(match, i, sport): if i == float("inf"): return elif sport in ["basketball", "tennis"]: return match.split(" - ")[i] elif i == 1: return "Nul" else: return match.split(" - ")[i // 2] opponents = [] for match in matches: opponents_match = match.split(" - ") if sport not in ["basketball", "tennis"]: opponents_match.insert(1, "Nul") opponents.append(opponents_match) nb_chars = max(map(lambda x: len(" / ".join(x)), product(*opponents))) sites = [ 'betclic', 'betstars', 'bwin', 'france_pari', 'joa', 'netbet', 'parionssport', 'pasinobet', 'pmu', 'unibet', 'winamax', 'zebet' ] odds = { site: [get_odd(combine, matches, site)[0] for combine in best_combinaison] for site in sites } pprint( { "date": max(date for date in [ sportsbetting.ODDS[sport][match]["date"] for match in matches ]), "odds": odds }, compact=True) print("plus-value =", round(best_gain, 2)) print() print( "Répartition des mises (les totaux affichés prennent en compte les éventuels freebets):" ) for combine, mise, cote, site in zip(best_combinaison, mises, best_cotes, best_sites): names = [ opponents_match[i] if i != float("inf") else "" for match, i, opponents_match in zip(matches, combine, opponents) ] name_combine = " / ".join(x for x in names if x) diff = nb_chars - len(name_combine) sites_bet_combinaison = { site: { "mise": round(mise, 2), "cote": round(cote, 2) }, "total": round(round(mise, 2) * cote, 2) } print(name_combine + " " * diff + "\t", sites_bet_combinaison)
def best_combine_reduit(matches, combinaison_boostee, site_combinaison, mise, sport, cote_boostee=0, taux_cashback=0, cashback_freebet=True, freebet=False, output=True): def get_odd(combinaison, matches, site_combinaison=None): sites = sb.BOOKMAKERS if site_combinaison: sites = [site_combinaison] best_odd = 1 best_site = "" for site in sites: odd = 1 for i, match in zip(combinaison, matches): if i != float("inf"): if site in sb.ODDS[sport][match]["odds"].keys(): odd *= sb.ODDS[sport][match]["odds"][site][i] else: break if odd > best_odd: best_odd = odd best_site = site return best_odd, best_site odds = {} for match in matches: odds[match] = sb.ODDS[sport][match] best_combinaison = [] best_cotes = [] best_sites = [] best_gain = -float("inf") best_i = -1 for combinaisons in combine_reduit_rec(combinaison_boostee, get_nb_outcomes(sport)): cotes = [] sites = [] for i, combinaison in enumerate(combinaisons): if list(combinaison) == combinaison_boostee: i_boost = i sites.append(site_combinaison) if cote_boostee: cotes.append(cote_boostee) else: cotes.append( get_odd(combinaison, matches, site_combinaison)[0]) else: res = get_odd(combinaison, matches) cotes.append(res[0]) sites.append(res[1]) if not taux_cashback: new_gain = gain2(cotes, i_boost, mise) else: new_gain = gain_pari_rembourse_si_perdant(cotes, mise, i_boost, cashback_freebet, taux_cashback) if new_gain > best_gain: # and all(cote>cote_minimale for cote in cotes: best_cotes = cotes best_sites = sites best_combinaison = combinaisons best_gain = new_gain best_i = i_boost matches_name = " / ".join(matches) if output: print(matches_name) if not taux_cashback: stakes = mises2(best_cotes, mise, best_i) else: stakes = mises_pari_rembourse_si_perdant(best_cotes, mise, best_i, cashback_freebet, taux_cashback) opponents = [] for match in matches: opponents_match = match.split(" - ") if sport not in ["basketball", "tennis"]: opponents_match.insert(1, "Nul") opponents.append(opponents_match) nb_chars = max(map(lambda x: len(" / ".join(x)), product(*opponents))) sites = sb.BOOKMAKERS odds = { site: [get_odd(combine, matches, site)[0] for combine in best_combinaison] for site in sites } if not output: return best_gain pprint( { "date": max(date for date in [sb.ODDS[sport][match]["date"] for match in matches]), "odds": odds }, compact=True) print("plus-value =", round(best_gain + freebet * mise, 2)) if freebet: print("taux de conversion =", round((best_gain + mise) / mise * 100, 3), "%") print("taux de retour au joueur =", round(gain(best_cotes) * 100, 3), "%") print() print( "Répartition des mises (les totaux affichés prennent en compte les éventuels freebets):" ) table_teams = [] table_odds = [] table_stakes = [] table_totals = [] table_bookmakers = [] for combine, stake, cote, site in zip(best_combinaison, stakes, best_cotes, best_sites): names = [ opponents_match[i] if i != float("inf") else "" for match, i, opponents_match in zip(matches, combine, opponents) ] name_combine = " / ".join(x for x in names if x) diff = nb_chars - len(name_combine) if freebet and combine == combinaison_boostee: sites_bet_combinaison = { site: { "mise freebet": round(stake, 2), "cote": round(cote + 1, 3) }, "total": round(round(stake, 2) * cote, 2) } table_stakes.append("{} (freebet)".format(stake)) table_odds.append(round(cote + 1, 3)) else: sites_bet_combinaison = { site: { "mise": round(stake, 2), "cote": round(cote, 3) }, "total": round(round(stake, 2) * cote, 2) } table_stakes.append(round(stake, 2)) table_odds.append(round(cote, 3)) table_teams.append(name_combine) table_totals.append(round(round(stake, 2) * cote, 2)) table_bookmakers.append(site) table = { "Issue": table_teams, "Bookmaker": table_bookmakers, "Cote": table_odds, "Mise": table_stakes, "Total": table_totals } text = tabulate.tabulate(table, headers='keys', tablefmt='fancy_grid') print(text) if sys.platform.startswith("win"): copy_to_clipboard(text)
def aux(odds_to_check, i): if one_site: return gain(odds_to_check, stake) - stake return gain2(odds_to_check, i, stake)
def best_combine_reduit(matches, combinaison_boostee, cote, site_booste, mise_max): def get_odd(combinaison, matches): sites = [ 'betclic', 'betstars', 'bwin', 'france_pari', 'joa', 'netbet', 'parionssport', 'pasinobet', 'pmu', 'unibet', 'winamax', 'zebet' ] best_odd = 1 best_site = "" for site in sites: odd = 1 for i, match in zip(combinaison, matches): if i != -1: if site in sportsbetting.ODDS["football"][match][ "odds"].keys(): odd *= sportsbetting.ODDS["football"][match]["odds"][ site][i] else: break if odd > best_odd: best_odd = odd best_site = site return best_odd, best_site odds = {} for match in matches: odds[match] = sportsbetting.ODDS["football"][match] best_combinaison = [] best_cotes = [] best_sites = [] best_gain = -mise_max best_i = -1 for combinaisons in combine_reduit(len(matches), combinaison_boostee): cotes = [] sites = [] for i, combinaison in enumerate(combinaisons): if list(combinaison) == combinaison_boostee: cotes.append(cote) sites.append(site_booste) i_boost = i else: res = get_odd(combinaison, matches) cotes.append(res[0]) sites.append(res[1]) new_gain = gain2(cotes, i_boost, mise_max) if new_gain > best_gain: best_cotes = cotes best_sites = sites best_combinaison = combinaisons best_gain = new_gain best_i = i_boost print(best_gain) mises = mises2(best_cotes, mise_max, best_i) # return best_cotes, best_sites, best_combinaison out = {} def get_issue(match, i): if i == -1: return elif i == 1: return "Nul" else: return match.split(" - ")[i // 2] opponents = [] for match in matches: opponents_match = match.split(" - ") opponents_match.insert(1, "Nul") opponents.append(opponents_match) nb_chars = max(map(lambda x: len(" / ".join(x)), product(*opponents))) for combine, mise, cote, site in zip(best_combinaison, mises, best_cotes, best_sites): names = [ opponents_match[i] if i > -1 else "" for match, i, opponents_match in zip(matches, combine, opponents) ] name_combine = " / ".join(x for x in names if x) diff = nb_chars - len(name_combine) sites_bet_combinaison = { site: { "mise": mise, "cote": cote }, "total": mise * cote } print(name_combine + " " * diff + "\t", sites_bet_combinaison)