В этой статье мы рассмотрим популярную игру в рулетку в казино и опровергнем различные стратегии ставок, призванные повысить ваши шансы уйти от прибыльного игрока. Мы рассмотрим, как моделировать каждый из этих методов в Python, а также укажем на ключевые различия между их влиянием на ваш банкролл с течением времени.

Итак, приступим! В американской рулетке есть 18 красных карманов, 18 черных карманов и 2 зеленых луза, в которые шарик может упасть после вращения вокруг колеса.

Если вы выиграете по ставке на красное или черное, вам выплачивается коэффициент 1: 1, что означает, что вы выигрываете 1 доллар за каждый 1 доллар, который вы поставили. Однако, если вы сделаете ставку на одно число, выплата увеличится до 35: 1, так что вы получите прибыль 35 долларов на каждую ставку в 1 доллар, поскольку в этом случае вероятность выигрыша намного ниже. В этом проекте мы узнаем, как моделировать случайные процессы, такие как вращения рулетки, и просматривать результаты простых стратегий ставок на нашем банкролле.

Стратегия №1: всегда красный

Давайте сделаем эту первую стратегию простой и скажем, что мы будем каждый раз ставить 1 доллар на красное. Поскольку 18 из 38 карманов красные, у нас есть 18/38 шансов на выигрыш 1 доллара и 20/38 шансов, что мы проиграем нашу ставку в 1 доллар.

Давайте посмотрим, как мы можем смоделировать эту стратегию в Python:

Мы собираемся установить наш банкролл на уровне 100 долларов, а затем составить список возможных результатов, составив список из 18 красных, 18 черных и 2 зеленых. Затем мы собираемся использовать библиотеку random, чтобы выбрать случайный элемент из этого списка, имитирующий вращение рулетки, и если он красный, мы выиграем 1 доллар, но если он черный или зеленый мы теряем 1 доллар. По мере продвижения мы будем отслеживать наш банкролл после каждого вращения, пока в конечном итоге не достигнем 0 долларов.

import random

def always_red(bankroll):  
    bankroll = 100
    pockets = ["Red"] * 18 + ["Black"] * 18 + ["Green"] * 2
    bankroll_history = []
    while bankroll > 0:
        roll = random.choice(pockets)
        if roll == "Red":
            bankroll += 1
        else:
            bankroll -= 1
        bankroll_history.append(bankroll)
    return bankroll_history

Теперь давайте смоделируем эту стратегию несколько раз и построим график динамики наших банкроллов.

import seaborn as sns
import matplotlib.pyplot as plt
sns.set(rc={'figure.figsize':(11.7,8.27)})
for i in range(4):
    plt.plot(always_red(bankroll=100), linewidth=2)
    
plt.xlabel("Number of Games", fontsize=18, fontweight="bold")
plt.ylabel("Bankroll", fontsize=18, fontweight="bold")
plt.xticks(fontsize=16, fontweight="bold")
plt.yticks(fontsize=16, fontweight="bold")
plt.title("Bankroll Over Time", fontsize=22, fontweight="bold")

Мы можем видеть, что каждая из наших 4 симуляций обанкротилась по прошествии определенного времени, но самая быстрая длилась около 1000 игр, а самая медленная - около 4000 игр.

Стратегия №2: Мартингейл

Теперь давайте посмотрим на более сложную стратегию, известную как Мартингейл. В этой стратегии мы начнем со ставки всего 0,01 доллара, но каждый раз, когда мы проигрываем, мы будем продолжать удваивать нашу ставку, пока в конечном итоге не получим выигрыш. Например, если мы проиграем первую ставку в 0,01 доллара, мы поставим 0,02 доллара на следующую ставку, пытаясь компенсировать предыдущий проигрыш. Если мы проиграем эту ставку, мы будем ставить 0,04 доллара и так далее, пока, наконец, не получим выигрыш и не вернемся к нашей начальной ставке в 0,01 доллара.

В приведенном ниже коде мы видим, что мы сбрасываем ставку до 0,01 доллара, если мы выигрываем, и умножаем ставку на 2, если проигрываем. Если наша ставка когда-либо превышает наш банкролл, мы устанавливаем ставку равной нашему банкроллу, чтобы мы не ставили больше, чем имеем.

def martingale(bankroll):
    bet = .01
    pockets = ["Red"] * 18 + ["Black"] * 18 + ["Green"] * 2
    bankroll_history = []
    while bankroll > 0:
        if bet > bankroll:
            bet = bankroll
        roll = random.choice(pockets)
        if roll == "Red":
            bankroll += bet
            bet = .01
        else:
            bankroll -= bet
            bet *=2
        bankroll_history.append(bankroll)
    return bankroll_history
    
martingale(bankroll=100)

Давайте смоделируем эту стратегию несколько раз и посмотрим, что из этого получится.

for i in range(4):
    plt.plot(martingale(bankroll=100), linewidth=2)
    
plt.xlabel("Number of Games", fontsize=18, fontweight="bold")
plt.ylabel("Bankroll", fontsize=18, fontweight="bold")
plt.xticks(fontsize=16, fontweight="bold")
plt.yticks(fontsize=16, fontweight="bold")
plt.title("Bankroll Over Time", fontsize=22, fontweight="bold")

Мы уже видим, что это сильно отличается от нашей стратегии «Всегда красный». Используя стратегию Мартингейла, вы получаете медленную и стабильную прибыль, пока не столкнетесь с чередой убытков, которая в конечном итоге приведет к банкротству, потому что ваши ставки растут в геометрической прогрессии. Из приведенного выше графика мы видим, что одна симуляция дожила до 30 000 игр, а другая длилась всего несколько сотен раундов.

Стратегия №3: Фибоначчи

Последовательность Фибоначчи - это последовательность чисел, определяемая следующим образом:

X1 = 1, X2 = 1 и Xn = Xn-1 + Xn-2

Это означает, что первые 10 чисел Фибоначчи - это 1, 1, 2, 3, 5, 8, 13, 21, 34, 55.

В стратегии Фибоначчи мы собираемся начать с ставки 0,01 доллара, а затем, если мы проиграем, мы переместимся на 1 шаг вверх по цепочке чисел Фибоначчи. Однако, если мы выиграем, мы переместимся на 2 ступени вниз по последовательности (или продолжим ставку на 1, если мы уже там). Например, предположим, что мы проиграли первые 5 ставок в размере 0,01 доллара США, 0,01 доллара США, 0,02 доллара США, 0,03 доллара США и 0,05 доллара США, но мы выиграли ставку в размере 0,08 доллара США. Затем мы переместимся на два шага вниз по цепочке и сделаем ставку 0,03 доллара.

Давайте посмотрим, как мы будем кодировать это на Python:

Сначала мы определяем функцию, которая возвращает нам n-е число Фибоначчи. Затем мы умножаем любое число Фибоначчи на 0,01 доллара, чтобы получить нашу ставку. Если мы выигрываем нашу ставку, мы уменьшаем наше число Фибоначчи на 2, но не уменьшаем его меньше чем 1. Если мы проигрываем ставку, мы увеличиваем число Фибоначчи на 1.

def fibonacci(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)
def fibonacci_strategy(bankroll):
    fibonacci_number = 1
    pockets = ["Red"] * 18 + ["Black"] * 18 + ["Green"] * 2
    bankroll_history = []
    while bankroll > 0:
        bet = fibonacci(fibonacci_number) * .01
        if bet > bankroll:
            bet = bankroll
        roll = random.choice(pockets)
        if roll == "Red":
            bankroll += bet
            fibonacci_number = max(fibonacci_number - 2, 1)
        else:
            bankroll -= bet
            fibonacci_number += 1
        bankroll_history.append(bankroll)
    return bankroll_history

Посмотрим, чем закончились эти симуляции.

for i in range(4):
    plt.plot(fibonacci_strategy(bankroll=100), linewidth=2)
    
plt.xlabel("Number of Games", fontsize=18, fontweight="bold")
plt.ylabel("Bankroll", fontsize=18, fontweight="bold")
plt.xticks(fontsize=16, fontweight="bold")
plt.yticks(fontsize=16, fontweight="bold")
plt.title("Bankroll Over Time", fontsize=22, fontweight="bold")

Эти симуляции очень похожи на стратегию Мартингейла, но похоже, что они длятся дольше, поскольку они увеличивают свою ставку медленнее. После 100-кратного моделирования и того и другого, стратегия Мартингейла длилась в среднем 17 800 раундов, а стратегия Фибоначчи - в среднем 21 200 раундов.

Заключение

Мы протестировали несколько стратегий и убедились, что в долгосрочной перспективе обыграть рулетку невозможно, но можно продлить время, в течение которого вы можете играть.

Надеюсь, теперь вы можете протестировать любые другие стратегии, которые вас интересуют, и не стесняйтесь обращаться ко мне на странице Контакты для любых вопросов / комментариев!