Рубрики
Без рубрики

Монте-Карло в Python

Сегодня мы смотрим на очень известный метод под названием Монте-Карло в Python, который можно использовать для решения любой проблемы, имеющей вероятностную интерпретацию.

Автор оригинала: Pankaj Kumar.

Монте-Карло в Python

Сегодня мы смотрим на очень известный метод под названием Монте-Карло В Python, который можно использовать для решения любой проблемы, имеющей вероятностную интерпретацию. Давайте начнем с некоторой веселой истории.

Оглавление

  • Немного истории Монте-Карло
  • Реализация Монте-Карло в Python
    • 1. Создание основного рулона колеса казино
    • 2. Делать дилер
    • 3. Для 100 ставок рупий. 100.
    • 4. Сделать больше игроков
    • 5. Построение средних с MATPLOTLIB
  • Заключение

Немного истории Монте-Карло

Он был использован для решения сложных численных проблем, таких как проблема «Буфет иглы» ( https://en.wikipedia.org/wiki/buffon%27s_needle_problem ):

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

И использовался с 1940-х годов для:

  • Изучая диффузию нейтронов для проектов ядерного оружия в национальной лаборатории Лос-Аламос, где был использован Eniac для выполнения симуляции M-C.
  • был также использован при разработке водородной бомбы
  • в механике жидкости, решать сложные дифференциальные уравнения (нелинейные параболические PDE)
  • Для оценки энергий передачи частиц
  • В расширенной обработке сигнала и байесовского вывода
  • На учебные машины для мутации генетического типа (раннее введение в сегодняшнее поле биоинформатики) и т. Д.

Реализация Монте-Карло в Python

Монте-Карло позволяет нам симулировать, казалось бы, случайные события и Оценить риски (Помимо других результатов, конечно). Он был использован для оценки риска данной торговой стратегии.

Для этого учебника мы сможем имитировать казино (потому что мы не можем имитировать тест ядерного оружия 😀)

В целом, тем более сложная проблема, тем больше псевдослучайных числовых переменных вам понадобится.

Откройте свой Google Colaboratory и подключитесь к выполнению.

1. Создание основного рулона колеса казино

Давайте импортируем нашу Numpy и Pandas пакеты:

import numpy as np
import pandas as pd
  • Затем мы определяем наш «Roll» как номер от 1 до 100, и давайте настроим его на 49-51 шансы на выигрыш для клиентов.
  • Это означает, что для рулонов 1-50 и ровно 100, дом (/казино) выигрывает.
  • Для Rolls 51-99 игрок выигрывает.

Это похоже на справедливый шанс выиграть, и большинство игроков, скорее всего, примут его.

Давайте моделируем это в Python:

def casino_roll():
    roll = np.random.randint(1,100)

    if roll <= 50 or roll == 100:
        print('rolled %d. you lose. House wins! Play again?!'%roll)
    elif 50 < roll < 100:
        print('you win! On a roll !')
        return True

Итак, теперь мы можем просто позвонить в Casino_roll (), и вы можете увидеть, что вы получаете. Я попробовал его 4 раза, и я потерял трижды.

2. Делать дилер

Далее давайте положем деньги в ставку. Поэтому мы создадим дилер, который принимает ставку, и:

  • Если есть победа, он награждает игрока.
  • Если есть потеря, он ограждает деньги.
def deal_bet(funds,initial_bet,bet_count):
    bet = 0
    funds_total = 0
    while bet < bet_count:
        if casino_roll():
            funds += initial_bet
        else:
            funds -= initial_bet

        bet += 1
        print('Funds : %d'%funds)
        funds_total += funds
    print('average win/loss : %f'%(10000-funds_total/bet_count))

Соблюдайте, что я нашел общие средства, а затем нашел среднюю победу/убыток. Если это позитивно, это победа. Если это негативно, это потеря.

3. Для 100 ставок рупий. 100.

Так что запуская это для ста ставок, каждый раз ставок на то же количество 100 рупий, мы получаем:

deal_bet(10000,100,100)
Средства в казино ставят Монте Карло

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

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

4. Сделать больше игроков

Мы можем сделать 100 игроков сделать эту же вышеупомянутую ставку:

x=0
while x<100:
  deal_bet(10000,100,100)
  x+=1

Ознакомьтесь с Печать (средства) Заявление в Deal_bet ().

Итак, теперь мы можем увидеть всю прибыль и убытки, понесенные каждому игроку:

Средние победы потери Монте-Карло

5. Построение средних с MATPLOTLIB

Давайте построим данные с MatPlotlib здесь:

return (10000-funds_total/bet_count)

Добавьте вышеуказанную линию до конца Deal_bet () Функция.

Тогда мы изменим:

x=0
avg_list=[]
while x<100:
  avg_list.append(deal_bet(10000,100,100))
  x+=1

И, наконец, мы можем построить это:

import matplotlib.pyplot as plt

avg_list = np.array(avg_list).astype(int)
plt.figure(figsize=(20,20))
plt.plot(avg_list)
plt.axhline(np.array(avg_list).mean(), color='k', linestyle='dashed', linewidth=1)
Сюжет средней победы и убытки Монте-Карло

Заключение

Это все для каждого дня. Я надеюсь, что этот пример помог вам совершенно хорошо понять симуляцию Монте-Карло в Python.

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

Вы найдете несколько сценариев вместе с полным кодом, если вы что-то пропустили в моем Github:

https://github.com/arkaprabha-majumdar/monte-carlo

До скорого !!