Votre HUD est rigged ! La preuve par Python

Hey, salut les gars, je bidouille pas mal en ce moment… Alors voilà, j’ai pondu un petit script Python pour vous prouver (et moi avec) que votre HUD est rigged ! Comme quoi, y a pas que les rooms qui vous entubent, bande de fishs ! Non mais…

Après la lecture de ce super #articledumois, il ne vous restera plus qu’à jeter votre tracker à la poubelle et à revenir au bon vieux poker de papa, les balls sur la table, la lecture à l’instinct, un point c’est tout !

Prérequis :

  • installer Python (version 2.8 pour ma part)
  • un éditeur quelconque, genre iPython

Voici le code magique :

[code]
from future import division # parce que la version 2.8 vous renvoie des entiers sinon après une division
%pylab inline # installe les librairies numpy et matplotlib

def Abracadabra(iterations, opportunities, freq = 0.5):

je vous explique pas le code sauf demande expresse, j’ai la flemme

for a in range(iterations) :
    y = []
    trueFreq = []
    x = 0
    compteur = range(1, opportunities)
    for i in compteur:
        x = x + np.random.choice([0, 1], replace = True, p = [(1 - freq),freq])
        y.append(i)
        trueFreq.append(x/y[i-1])
    print a+1, "Freq. finale = ", trueFreq[len(trueFreq)-1]
    plot(y, trueFreq)[/code]

Respectez bien l’indentation, please.

Comment ça marche ?

On exécute le programme en appelant la fonction, par exemple comme ceci :

a = Abracadabra(10, 126, 0.445)
# An example of unreliable stat : river Cbet
# Test 10 simulations for a reg with 33449 hands: he got only 126 opportunities to rivercbet !
# rivercbet made : 56 times => so freq displayed by HUD  = 0.445 (44,5%)
# And this low (or high?) frequency made you think you can exploit him, isn't it? 

Le premier paramètre entre parenthèses est le nombre de simulations que vous souhaitez faire, le second le nombre d’opportunités, le troisième la fréquence de la stat en question affichée par votre HUD (par exemple), faute d’avoir la vraie fréquence, puisque c’est rigged je vous dis, allez voir dans Postgres si vous ne me croyez pas !..

Après exécution (la console Python suffira), donc, on obtient pour cet exemple :

cac_2016-11-18.PNG

Autre série de 10 simulations :

cac2_2016-11-18.PNG

Je vous l’avais bien dit ! Même pour un reg de 30K hands, avec si peu d’opportunités au final on aura toujours de tels écarts de variance pour cette stat qu’il vaut mieux renoncer à l’HUDmidifier ! Alors ils sont où les coachs et bonimenteurs de badges NoteCaddy qui vous promettent monts et merveilles dès que villain a plus de 60% de fold sur telle ou telle stat en apparence convergente, mais en apparence seulement ! Stop à l’arnaque ! Non mais…

Alors, n’est-ce pas qu’il est génial cet article ? Enfin un outil utile pour le player online, soyons geek, c’est ça le poker moderne ! Testez la fiabilité de vos stats avec la fonction Abradacabra (@jan6) et n’hésitez pas à venir pleurer sur ce thread au sujet du 4 bet de vilain au moyen duquel à l’insu de votre plein gré vous vous aveugliez pour 5bet bluff vos poubelles avec zéro fold équité… Jusqu’au jour où vous avez découvert la vérité, la vraie !
A vos commentaires ! J’attends vos démentis! Tout don de PA sera le bienvenu of course…

Ha je me doutais que ça allait arriver un jour, non pas la découverte de ce scam mais ton pétage de câble. Y’avait des signes avant coureur qui ne trompent pas, le fait de vouloir programmer en python déjà^^ (ça va faire plaisir à Nico ça xD)
Franchement pas beau à voir les ravages de l’horchata et de l’agua limon…

et donc tu t es crée un bot :evil:

Naaan, j’en suis bien incapable… je cherche juste à automatiser certaines tâches, ce qui me permet par la même occasion de revoir certains fondamentaux pokéristiques et de me coletiner à de nouveaux domaines de compétences comme la programmation, le data mining, etc.

J’ai plein d’idées mais pour l’instant rien de solide à proposer sur PA mis à part ce petit progamme que Flibustier a appelé “scam” le fou ! :silly:

Aussi dans les tiroirs un petit script pour automatiser la prise de notes txt sur HM2 en filtrant les stats, mais vu que celui-ci n’intéresse personne…

Dans la foulée pourquoi pas adapter la fonction Abracadabra au winrate (à la manière de pokerdope), mais c’est autrement plus complexe et pour l’instant je cale sur la manière de randomiser la variance par rapport au winrate observé alors que pour les stats type done/could done c’est finalement assez facile de trouver une fonction correcte même pour un débutant comme moi.

[quote=“Jan6, post:947327”]Hey, salut les gars, je bidouille pas mal en ce moment… Alors voilà, j’ai pondu un petit script Python pour vous prouver (et moi avec) que votre HUD est rigged ! Comme quoi, y a pas que les rooms qui vous entubent, bande de fishs ! Non mais…
[/quote]

Non ais c’est clair pour ça que je l’utilise plus :wink:

Up.

J’ai un peu amélioré la bête :

cac_2016-11-25.PNG

Au-delà de l’aspect provoc du thread, on peut trouver un usage utile à ce genre d’outil et pourquoi pas à notre HUD en se basant sur le percentile. Ici pour 1000 runs, on voit que son fold to 3bet oscille entre 62,5% et 72% pour un fold to 3bet observé de 67%. Donc même si la stat est pas super fiable par manque d’opportunités (et ce reg est pourtant classé 17e dans ma database de 220 joueurs de plus de 5000 hands), la tranche basse de son fold to 3bet est suffisamment élevée pour qu’on puisse conclure que ce reg fold un poil trop au 3bet, à héro donc de s’adapter en conséquence…

Je rame pas mal vu que j’ai pas un énorme bagage de programmeur c’est le moins qu’on puisse dire, mais j’ai finalement réussi à pondre un simulateur de variance pour le winrate observé à la façon de pokerdope.com, le code est assez lourd et peu élégant sans doute, et la fonction peut encore être pas mal améliorée mais voici un aperçu pour ce même reg (juste 10 runs) :

cac1_2016-11-25-2.PNG

Voici le code :

[code]def VarianceCalculator2(totalhands, winrate = 0.0, dev = 100.0):
compteur = range(0, 10)
hands = int(totalhands/100)
abscisse = np.arange(start=0, stop=totalhands + 1, step=100)
evy = np.linspace(start=0, stop=(hands * winrate),num=hands+1)
std_dev = dev/(np.sqrt(hands))
plot(abscisse, evy, « b », label = « EV », linewidth=2)
conf1 = np.linspace(start=0, stop=((winrate + std_dev)hands),num=hands+1)
conf2 = np.linspace(start=0, stop=((winrate - std_dev)hands),num=hands+1)
conf3 = np.linspace(start=0, stop=((winrate + (2
std_dev))hands),num=hands+1)
conf4 = np.linspace(start=0, stop=((winrate - (2
std_dev))hands),num=hands+1)
plot(abscisse, conf1, « g– », linewidth=2, label=« 68% »)
plot(abscisse, conf2, « g– », linewidth=2)
plot(abscisse, conf3, « g », linewidth=2, label=« 95% »)
plot(abscisse, conf4, « g », linewidth=2)
legend(bbox_to_anchor=(0.0, 1.0), loc=‹ upper left ›)
grid(True)
EV = winrate
hands
print « EV: " + str(winrate) + " bb/100 ( » + str(EV) + " bb)"
print « Standard deviation after " + str(totalhands) + " hands: " + str(std_dev) + " bb/100 ( »
+ str(std_dev * (totalhands/100)) + " bb)\n"
print « 68% confidence interval: " + str(winrate + std_dev) + " bb/100 ( » + str((winrate + std_dev)

(totalhands/100)) + " bb), " + str(winrate - std_dev) + " bb/100 (" + str((winrate - std_dev)
(totalhands/100)) + " bb)"
print "95% confidence interval: " + str(winrate + (2
std_dev)) + " bb/100 (" + str((winrate + (2std_dev))
(totalhands/100)) + " bb), " + str(winrate - (2std_dev)) + " bb/100 (" + str((winrate - (2std_dev))*
(totalhands/100)) + " bb)\n"
# print "Probability of loss after " + str(totalhands) + " hands: " +

for i in compteur:
    y = np.array([0])
    y = np.append(y, np.cumsum(np.random.normal(winrate, dev, hands)))
    plot(abscisse, y)[/code]

On voit que je coince entre autres sur le calcul de la probabilité « of loss after… » (une des données que produit le simulateur de Pokerdope), commentaire que j’ai oublié de supprimer au beau milieu du code…

La suite au prochain numéro… Y a des dev par ici ?