ケイバハック

競馬ソフトは自分で作ろう!

オッズを計算するアプリ

有馬記念の単勝オッズを計算するコンソールアプリ

有馬記念の単勝オッズを計算するコンソールアプリ

今回は、競馬ソフトを開発してみたいプログラミング未経験者のうち、.NET Core環境での開発手順の基本が分かっている人に向けての情報です。

「.NET Core環境での開発手順って何?」という方は、まずは、次の記事から読み進め、.NET Core環境での開発手順の基本を学んでください。

.NET Core環境でのコンソールアプリを作るときの基本手順

では、本題に入ります。今回は、有馬記念の単勝オッズを計算するためのコンソールアプリを作ります。まずは、次の動画を見て、これから作るアプリが実際に動くイメージをつかんでください。

この動画から分かる通り、今回作るアプリは、有馬記念2016のレース結果から、勝馬の払戻対象額やオッズを計算し、その結果をコンソールに出力するアプリです。

JRAが公開している有馬記念の成績表から単勝の発売票数を確認する

今回のアプリでは、有馬記念2016年の単勝オッズを自分で計算することを目的としたアプリです。

レース結果を見ると、有馬記念2016は、1着は、サトノダイヤモンドで、そのオッズは2.6倍とわかっています。そのオッズを「敢えて自分で計算するプログラムを作ってみよう」というのが、今回のアプリの趣旨です。

さて、自分で単勝のレースをオッズを計算するにあたり、必要な情報が2つあります。次の通りです。

  1. 単勝の発売票数
  2. 単勝の勝馬の発売票数

で、この数字は、JRAの公式サイトから取得できます。具体的には、公式サイトの年度別成績から、2016年のページを表示し、中山競馬場の第9日の結果を見ると、良いです。

JRAの公式サイト: 年度別全成績 2016年

で、調べた結果が次の数値です。

  1. 単勝の発売票数: 27,140,062票
  2. 単勝の勝馬の発売票数: 8,055,932票

この2データを使って、このレースの単勝オッズを計算するプログラムを作ります。

オッズ計算に使う計算式

続いて、今回のオッズ計算に使う計算式についてご紹介します。今回のオッズ計算に使うものは、次の式です。

勝馬投票法ごとの払戻率より引用。

払戻対象総額を求める計算式
(W+D/P)×R 【+A/P】  ※【 】内は、WIN5の場合のみ
W : 当該勝馬に対する勝馬投票券の総券面金額
D : 出走した馬であって勝馬以外のものに対する勝馬投票券の総券面金額
P : 勝馬の数
R : JRAが投票法ごとに定めた率 ※下表をご参照ください
A : WIN5においてキャリーオーバーが発生している場合の金額

これは、2014年6月7日から適用された式で、2016年12月に開催された有馬記念のオッズは、この式で計算することになります。

ちなみに、このレースでは、WIN5のキャリーオーバーが発生していませんでした。また、そもそも単勝の話なので、今回のアプリでは、「(W+D/P)×R」の式のみを利用することになります。

ソースコード

では、今回作るアプリのソースコードを次に示します。

Program.cs

using System;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //単勝の発売票数
            int hatsubaiHyosu = 27140062;
            
            //単勝の勝馬の発売票数
            int kachiumaHyosu = 8055932;

            //W(当該勝馬に対する勝馬投票券の総券面金額)
            double W = kachiumaHyosu * 100;

            //D(出走した馬であって勝馬以外のものに対する勝馬投票券の総券面金額)
            double D = (hatsubaiHyosu - kachiumaHyosu) * 100;

            //P(勝馬の数)
            double P = 1; //単勝なので1

            //R(JRAが投票法ごとに定めた率)
            double R = 0.8; //単勝なので80%

            //払戻対象総額を求める計算式:(W+D/P)×R
            double haraiModoshi = ( W + D / P) * R;

            //1票の払戻対象額
            double haraiModoshi1 = haraiModoshi / kachiumaHyosu;

            //1票の払戻対象額(10円未満切り捨て)
            // 10で割って小数を切り捨ててから10倍している
            double haraiModoshi1Kirisute = Math.Floor(haraiModoshi1 / 10) * 10;

            //オッズ
            double odds = haraiModoshi1Kirisute / 100;

            //結果の出力
            Console.WriteLine($"単勝の発売票数: {hatsubaiHyosu}票");
            Console.WriteLine($"勝馬の発売票数: {kachiumaHyosu}票");
            Console.WriteLine($"W: {W}円");
            Console.WriteLine($"D: {D}円");
            Console.WriteLine($"P: {P}頭");
            Console.WriteLine($"R: {R*100}%");
            Console.WriteLine($"払戻対象総額(W+D/P)×R: {haraiModoshi}円");
            Console.WriteLine($"1票の払戻対象額: {haraiModoshi1}円");
            Console.WriteLine($"1票の払戻対象額: {haraiModoshi1Kirisute}円(10円未満切り捨て)");
            Console.WriteLine($"オッズ: {odds}倍");
        }
    }
}

では、このソースコードについて解説します。

まず、有馬記念2016の結果からわかる、単勝の発売票数と単勝の勝馬の発売票数を、それぞれ変数として定義しています。そして、その変数を使って、「(W+D/P)×R」の式に必要な値を計算しています。

W、D、P、Rのそれぞれの値が、どう計算されるかは、上のソースコードのコメントを読めばわかりますよね。強いて解説するならば、Dの計算の仕方でしょうか。これは、要するに負けた馬の発売票数に100円をかけた値です。

W、D、P、Rがそれぞれ求まったら、「(W+D/P)×R」の式を使って、払戻対象総額を計算します。これを勝馬の発売票数で割ると1票あたりの払戻対象額がわかります。

ただし、その結果は、そのままでは「269.516296810847円」となります。この結果から、10円未満を切り捨てた値が実際のその額になります。つまり、「260円」ですね。

その切り捨てを行うために、このソースコードでは、次のことを行なっています。

  1. 一度10で割って、1の桁を小数にする
  2. その小数以下をMath.Floor関数で切り捨る
  3. その結果に再度10をかける

Excelを利用すると、このような「指定桁以下の値を切り捨てる」という処理は、関数を使って簡単に行えます。一方、それをC#のプログラムで実現するためには、このような一手間が必要になります。

10円未満を切り捨てた1票の払戻対象額が求まったら、それを100円で割れば、オッズになります。つまり2.6となり、これは、有馬記念2016のレース結果の実際の単勝オッズと一致します。

次に読むべき記事:有馬記念の単勝オッズから票数を計算するコンソールアプリ

Return Top