今回はケリー基準を用いた
破産しないための最適資金配分のシミュレーションです。
解説動画はこちら
・問題
--------------------------------------------------------
・回答
ケリー基準 :
割合 = (勝率 × オッズ − (1−勝率) ) / オッズ
ここに
勝率 0.55(55%)
オッズ(2倍-1倍 = 1)
を入れると
0.55 - 0.45 = 0.1
資金の0.1倍を賭けるのが
最適解ということになります。
先ほどの問題をシミュレーションするコードです。
初期資金 : 100万円
勝率 : 55%
回数 : 250回
シミュレーション結果を集計した結果を
出力する関数です。
この関数を使って
1000セット試行を行います。
こんな感じの結果になりました
勝利回数の分布をプロットしてみると
破産しないための最適資金配分のシミュレーションです。
解説動画はこちら
破産しないための最適な賭け金の割合
・問題
コインを投げて、表が出たら賭け金が2倍、裏が出たら全て失う賭けです
このコインは、55%の確率で表が出るやや有利なコインです
手元には100万円あり、このゲームを250回繰り返すとき
毎回いくら賭けるのが最適でしょうか?
--------------------------------------------------------
・回答
ケリー基準をもとに
最適な賭け金を算出することができます。
最適な賭け金を算出することができます。
ケリー基準 :
資産運用において
最適な資金配分比率を決定するための数式
最適な資金配分比率を決定するための数式
割合 = (勝率 × オッズ − (1−勝率) ) / オッズ
ここに
勝率 0.55(55%)
オッズ(2倍-1倍 = 1)
を入れると
0.55 - 0.45 = 0.1
資金の0.1倍を賭けるのが
最適解ということになります。
250回の賭けコイン試行シミュレーション
先ほどの問題をシミュレーションするコードです。
初期資金 : 100万円
勝率 : 55%
回数 : 250回
シミュレーション結果を集計した結果を
出力する関数です。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
pd.options.display.float_format = '{:.2f}'.format
# 250回のコイントスの賭けシミュレーター
def coin_250(default_assets=1000000,times=250,win_rate=0.55):
kelly_criterion_percentage = (win_rate - (1 - win_rate))
data = []
assets = default_assets
for i in range(times):
stakes = int(assets * kelly_criterion_percentage)
assets -= stakes
result = np.random.choice([1,0],p=[0.55,0.45])
if result == 1:
assets += stakes * 2
tmp =[assets,stakes, int(result)]
data.append(tmp)
# 250回の結果をデータフレームで集計
df = pd.DataFrame(data,columns=["assets","stakes","result"])
max_assets = df["assets"].max()
min_assets = df["assets"].min()
max_stakes = df["stakes"].max()
min_stakes = df["stakes"].min()
final_ps = int(df["assets"].tail(1).values[0])
profit = final_ps - default_assets
win_times = int(df["result"].sum())
lose_times = len(df) - win_times
group_id = (df["result"] != df["result"].shift()).cumsum()
run_lengths = df.groupby(group_id)["result"].sum()
run_lengths_0 = df.groupby(group_id).apply(lambda x: (len(x) - x["result"].sum()))
# 最大連敗回数
max_lose = run_lengths_0.max()
# 最大連勝回数
max_win = run_lengths.max()
result_250 = [max_assets,min_assets,max_stakes,min_stakes,final_ps,profit,win_times,lose_times,max_win,max_lose]
return result_250
この関数を使って
1000セット試行を行います。
times = 1000
results = []
for i in range(times):
data = coin_250()
results.append(data)
columns = ["最大資産","最小資産","最大掛金","最小掛金","最終資産","最終利益","勝利回数","敗北回数","最大連勝","最大連敗"]
df = pd.DataFrame(results,columns=columns)
df.describe()
| desc | 最大資産 | 最小資産 | 最大掛金 | 最小掛金 | 最終資産 | 最終利益 | 勝利回数 | 敗北回数 | 最大連勝 | 最大連敗 |
|---|---|---|---|---|---|---|---|---|---|---|
| count | 1000.00 | 1000.00 | 1000.00 | 1000.00 | 1000.00 | 1000.00 | 1000.00 | 1000.00 | 1000.00 | 1000.00 |
| mean | 16066691.73 | 576608.61 | 1588961.95 | 57127.35 | 11146821.03 | 10146821.03 | 137.19 | 112.81 | 8.49 | 6.45 |
| std | 33581089.69 | 289491.31 | 3311346.29 | 28006.38 | 27692950.89 | 27692950.89 | 7.91 | 7.91 | 2.27 | 1.56 |
| min | 900000.00 | 7130.00 | 100000.00 | 713.00 | 7687.00 | -992313.00 | 107.00 | 89.00 | 4.00 | 3.00 |
| 25% | 2515432.75 | 346220.75 | 248966.50 | 34622.00 | 1159975.00 | 159975.00 | 132.00 | 108.00 | 7.00 | 5.00 |
| 50% | 6327419.00 | 575743.50 | 632741.50 | 57574.00 | 3163743.50 | 2163743.50 | 137.00 | 113.00 | 8.00 | 6.00 |
| 75% | 15386038.00 | 801900.00 | 1515707.50 | 80274.00 | 8628829.00 | 7628829.00 | 142.00 | 118.00 | 10.00 | 7.00 |
| max | 541305769.00 | 1100000.00 | 54130576.00 | 100000.00 | 390665788.00 | 389665788.00 | 161.00 | 143.00 | 26.00 | 14.00 |
こんな感じの結果になりました
勝利回数の分布をプロットしてみると







