必勝法の判定法

競輪競馬のようなレースギャンブルにおいて、ある買い方を続けて良い成績が残せた、すなわち回収率が1.0を十分上回ったとき、その買い方は必勝法であると言って良いかという問題を考える。買い方の内容には一切立ち入らず、その買い方で残した車券成績の記録だけから統計学的仮説検定の手法を用いて判断する。

用意する車券成績の記録

n個レースの車券を買い、i番目のレースで合計b[i]円の車券を買い合計r[i]円の払い戻しを受けたとする。全てのb[i], r[i]が用意すべき記録である*1。このとき1個レース当たりの平均購入額Mbは、Mb=(Σi=1~n b[i])/nとなる。r[i]/Mbなる量の1個レース当たりの平均値は、((Σi=1~n r[i])/n) / ((Σi=1~n b[i])/n) = (Σi=1~n r[i])/(Σi=1~n b[i])となってこれはn個レース全体の回収率である。よって、r[i]/Mbの期待値を求めることで、買ったレース全体の回収率を見積もることができる。通常の1レース当たりの回収率r[i]/b[i]と区別するために、r[i]/Mbを調整回収率と呼ぶことにする。この調整回収率を統計的に扱って行く。

統計学的仮説検定

必勝法であるとは、「調整回収率のレース毎の平均が1.0を越える」ことだとする。これをいうために、帰無仮説を「調整回収率の平均が1.0である」として片側検定すれば良い。P値を求めてそれが有意水準以下なら必勝法であると判定される。

用意した記録より得られた調整回収率の平均、標準偏差をそれぞれm、sとする。レース数nが十分大きいとき母集団からn個レース取り出した標本の調整回収率の平均は、平均=1.0、分散=s^2/nの正規分布N(1.0, s^2/n)に従う。P値はこの分布でm以上の値に落ちる確率であるから、dN(μ,σ,x)をN(μ,σ)の密度関数とすると、∫[m,∞] dN(1.0, s^2/n, x)dxとなる*2。さらにこの式を変形すると相補誤差関数erfc()を用いて、erfc((m-1.0)*sqrt(n/2)/s)/2と書ける。

これでP値が求まったので適当な有意水準を設定して検定が行えば良い。

計算プログラム

実際にP値を求めるプログラムをRubyスクリプトで書いてみる。

# kentei.rb

def mean_and_p_value(data, m_0 = 1.0)
  # data = [[total_vote, return], ...]
  n = data.size
  m_v = data.inject(0.0){|t, e| t += e[0]} / n
  m = data.inject(0.0){|t, e| t += e[1]} / n / m_v
  xx = data.inject(0.0){|t, e| t += (e[1] / m_v) ** 2}
  s = Math::sqrt((xx - n * m * m) / (n - 1))
  [m, Math::erfc((m - m_0) * Math::sqrt(n / 2) / s) / 2]
end

if $0 == __FILE__
  fname = ARGV.shift
  a = File.read(fname).map{|line| line.split.map{|e| e.to_f}}
  puts mean_and_p_value(a)
end
使い方

上のスクリプトをファイル名kentei.rbとして保存する。そして、車券成績を以下のフォーマットで書いたテキストファイルを用意する。

1個レースが1行で、そのレースで買った車券の合計金額、そのレースで払い戻しを受けた金額(はずれたときは0)の2つの数値を空白で区切って書く。例えば、

1000 0
2000 0
1500 5100

そのファイル名をseiseki.txtとすると、コンソールで

ruby kentei.rb seiseki.txt

を実行すれば、全体の回収率とP値が出力される。

R

また、統計解析言語Rを使えば、Rのインタプリタ内で、

> d = read.table("seiseki.txt")
> a = d$V2 / mean(d$V1)
> t.test(a, m=1.0, alt='g')

としてもよい。

回収率が1.0を越える車券成績があったとき、それがどのくらいのレース数をこなした結果かであるかによってP値は大きく異なる。それを具体的に計算してみよう。

回収率=1.2と統一し、的中率を20%、10%、5%の3通りを見る。賭ける金額は全レース同一とし、的中したときの配当倍率はそれぞれ、6.0倍、12.0倍、24.0倍としこれも全的中レースで同一とする。

横軸にレース数、縦軸に回収率が1.0を越えることの検定のP値を取ってプロットしたものが下図である。

的中率=20%の本命買いだとレース数=400程度で有意水準5%をクリアできる。しかし的中率=5%の中穴狙いだと2000レース近くまで買い続けてやっと5%に達する。穴狙いの買い方はかなりの数のレースをこなさないと有効性が判断できないことを注意すべきだ。

*1:後で分かるが正確にはb[i]は全てでなくその合計だけで良い

*2:∫[a, b] ... dx は、aからbまでのxについての定積分を表す。