Автор оригинала: 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
До скорого !!