実力に関する考察


執筆者:mosa
  • 自分の実力はどのように測れるか。
  • バンクロール管理における自らの勝率をどのように求めるか。
  • 結果がブレるとしたら、どれだけブレうるのか。


結論部分

勝率の測定法


各ハンド数にて、下表のバイイン以上を獲得できていれば、勝率の下限が定まる。(片側有意水準2.28%)
勝率>0.48>0.50>0.52>0.54
1万hand時22.5734.4146.5658.50
2万hand時24.8048.8672.8896.79
5万hand時17.2077.07137.25197.16
10万hand時-10.82109.36229.27348.97

逆に、下表のバイイン以下を獲得した場合、勝率の上限が定まる。
勝率<0.48<0.50<0.52<0.54<0.56
1万hand時-46.44-34.61-22.46-10.521.52
2万hand時-72.86-48.80-24.78-0.8723.11
5万hand時-137.30-77.43-17.2542.66102.73
10万hand時-229.25-109.0610.84130.55250.65

補足
  1. 1万handにつき300回オールイン を仮定。人によっては適宜補正の必要あり。例えば150回オールインなら2万handで表内1万hand相当。
  2. ショートスタック前提。オールインに勝利してもダブルアップできないディープスタックの場合、おそらく3万hand程度で表内1万hand相当。
  3. トーナメントの場合、300回参加につき1万handと読み替えて欲しい。
参考:勝率に関して
バンクロール管理より
  • 勝率55%は非常に強く(非現実的?)、あまりBR考察の必要がない
    • 2万handでさえ、BR2.5%以上バイインなら90%BRダブルアップする
  • 勝率48%は非常に弱い
    • BRダブルアップはBR5.0%バイインでさえ10%程度 ほぼ不可能
    • 2万hand:BR2.0%以上バイインでは70%以上レートダウン
    • 10万hand:100%レートダウン
  • 勝率45%は論外

以上から、勝率50%以上、できれば52%以上を確定させることが目標となる。

獲得BBのブレ

  • 20BBバイインだとすると、以下のように獲得BBはブれる。(両側有意水準4.56%)
  • 一見、分散はhand数N倍で√N倍に増えているように見える。
    • しかし分散/hand(=ブレ密度)は単調減少。
    • hand数がN倍になると、√N倍でBB/100handは収束している。
BBブレBB/100hand ブレ
1万hand時±690.11BB±6.9BB
2万hand時±976.63BB±4.88BB
5万hand時±1545.03BB±3.09BB
10万hand時±2184.29BB±2.18BB

考察部分

前提

  • 獲得バイインに関してシミュレーションする。
  • バンクロール管理同様、ランダムウォークで考える。
  • バンクロール管理とは異なり、ダブルアップor半分になったら終了ルールなどは設けない。

設定値

  • 試行回数:10万回
    • 100万回にしても標準偏差が小さくならなかったため、正規分布に十分収束したと考えられる。計算時間的にこれで。
  • 歩数:300,600,1500,3000
  • 歩行距離 勝利時:1 敗北時:-1

シミュレーション結果


表内は獲得バイイン数。
勝率0.440.460.480.50.520.540.56標準偏差σ(平均)
1万hand-35.96-24.08-11.93-0.112.0523.9936.03±17.25
2万hand-72.01-48.09-24.030.0324.0547.9671.94±24.42
5万hand-180-119.86-60.05-0.1860.00119.91179.98±38.63
10万hand-359.8-240.05-120.040.15120.06239.76359.86±54.61

参考:標準偏差の利用方法

  • 期待値から見て、σのn個分におさまる確率は以下の通り。
    • 1σ内:68.26%
    • 2σ内:95.44%
    • 3σ内:99.74%(千3つしか外れない)
  • 今回は3σでは有用な結論を得られそうにないので、(片側2.3%のリスクは覚悟で)2σに外れているかどうかを見て考える

補足

  • オールインに依らず、CBやsteal,resteal,3Bの結果、ちまちま稼いでダブルアップor0倍 になる場合もありうるため、歩数を少なく見積もっている
    • →hand数はやや少なくて良い?
  • オールインを持ちかけてフォールドされた場合、歩数は増えているのにダブルアップにはならない。歩数を多く見積もっている
    • PTには「Face allin and call」はあるが、「Raise allin」しかない。「Raise allin and called」を本来は使うべき。
    • →hand数はやや多くて良い?
この2つが相殺して、実際どれくらいズレるか。少なくともオーダーはズレないので、提示した結論は目安になる。
  • ディープスタックの場合、オールインが少なくなる。
    • むしろショートに付き合ってオールインしやすくなる?
    • また、勝利しても相手がショートだとダブルアップできないため、歩行距離は±0.33-0.5程度が適切か。

ソース





import java.util.Arrays;
import java.text.*;


public class PokerTest {
	public static void main(String args[]){
		//System.out.println("Hello world!");
		
		//int[] startLife={20,25,33,40,50,100};
		int[] startLife={0};
		double[] winPercent={0.44,0.46,0.48,0.50,0.52,0.54,0.56};
		int[] timeEnd={300,600,1500,3000};
		//RandomWalk[] rw=new RandomWalk[100];
		RandomWalkHP0[] rw=new RandomWalkHP0[100];
		int count=0;
		for(int i=0;i<startLife.length;i++){

			for(int k=0;k<timeEnd.length;k++){
				for(int j=0;j<winPercent.length;j++){

					
					//rw[count]=new RandomWalk(startLife[i],winPercent[j],timeEnd[k]);
					rw[count]=new RandomWalkHP0(startLife[i],winPercent[j],timeEnd[k]);
					rw[count].info();
					count++;
					
				}
			}
		}
		
	}
}


public class RandomWalkHP0 {
	
	int timeEnd=3000;//タイムスパン
	//int memberMax=10000;//試す人数
	int N=1000000;//試行回数
	
	
	double startLife=0; //開始HP
	//double deadLife=startLife/2.0; //死亡HP
	//int nextRateLife=startLife*2;//終了HP 
	double[] life=new double[N]; //残りHP
	
	double winPercent=0.52; //勝率
	
	double winlife=1.0; //勝利の際、得るHP
	double loselife=1.0; //敗北の際、失うHP
	
	double lifeExpect=0;//終了HP期待値
	double lifeVariance=0;//終了HP分散
	double lifeDeviation=0;//終了HP標準偏差
	
	
	
	/*
	int[] surviveCount= new int[N];//生存数

	
	int[] nextRateCount= new int[N];//ダブルアップ数
	double nextRateExpect=0;//ダブルアップ確率期待値
	double nextRateVariance=0;//ダブルアップ確率分散
	double nextRateDeviation=0;//ダブルアップ確率標準偏差
	*/
	
	RandomWalkHP0(){//コンストラクタ。通常は↑↑の変数が適用される
		startWalk();
		statistics();
	}	
	
	RandomWalkHP0(int st,double wp,int ts){//コンストラクタ 変数指定バージョン
		startLife=st;		
		
		winPercent=wp;
		timeEnd=ts;
		
		startWalk();
		statistics();
	}		
	
	void info(){
		NumberFormat format = NumberFormat.getInstance();
		format.setMaximumFractionDigits(2);//小数点以下桁数は2
		
		
		System.out.println("試行回数:"+N+"回 タイムスパン:"+timeEnd);
		System.out.println("開始HP"+startLife+" 勝率:"+winPercent*100+"%");
		System.out.println("平均HP:"+format.format(lifeExpect)+"±"+format.format(lifeDeviation));
	}
	
	void statistics(){
		expect();
		variance();
	}
	
	
	void expect(){//生存確率期待値を出す。
		for(int i=0;i<N;i++){
			lifeExpect+=life[i];
		}
		lifeExpect=lifeExpect/(double)N;
	}
	
	void variance(){//分散を出す。expect前提
		for(int i=0;i<N;i++){
			lifeVariance+=Math.pow((life[i]-lifeExpect),2.0);		
		}
		lifeVariance=lifeVariance/(double)N;
		lifeDeviation=Math.pow(lifeVariance, 0.5);//標準偏差
	}
	
	
	
	void startWalk(){//実際にランダムウォークを実行する
		
		
		//Arrays.fill(surviveCount,memberMax);//生存数初期化(最大値から、どんどん死んでく)
		//Arrays.fill(nextRateCount,0);//ダブルアップ数初期化	
		Arrays.fill(life,startLife);//HP初期化
		for (int i=0;i<N;i++){//N回試すよ
			for(int time=0;time<timeEnd;time++){
				if(winPercent>Math.random()){
					life[i]+=winlife;
				}else{
					life[i]-=loselife;
				}
				/*
				if(life<=deadLife){
					surviveCount[i]--;//死ぬ
					break;	
				}else if(life>=nextRateLife){
					nextRateCount[i]++;//ダブルアップ
					break;
				}*/
			}
			
			

		}//N回end
	}//func end
}

このページへのコメント

iKDqpt I appreciate you sharing this blog article. Awesome.

0
Posted by check this out 2013年12月20日(金) 16:52:19 返信

QkivNT <a href="http://xeomzutoescz.com/">xeomzutoescz</a>, [url=http://thxsxofqgxde.com/]thxsxofqgxde[/url], [link=http://zhlzwyuofojh.com/]zhlzwyuofojh[/link], http://mxgtlpzeqydo.com/

0
Posted by oauxsaafc 2013年11月15日(金) 02:23:52 返信

近似的に同じになります。

0
Posted by 通りすがり 2012年01月28日(土) 17:00:19 返信

すいません。質問の意図がわからないです。グラフの描き方とはなんでしょうか。

0
Posted by hunbaba 2011年02月11日(金) 00:36:36 返信

勝率51%のランダムウォークはポーカーの収支のグラフの描き方とはだいぶ異なる動き方な気がしますが、近似的に同じになるんですかね?

0
Posted by 通りすがり 2011年02月06日(日) 17:59:52 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

メンバーのみ編集できます