見出し画像

プログラミングを使えば素人でも馬券的中できるのか 有馬記念編

こんにちは。湯沢町にUターン後に小学生向けのプログラミング講師として活動している腰越です。今回は普段仕事で活用しているGAS(Google発のプログラミング言語)で、競馬予想プログラムを作成してみました。


製作のきっかけ

時は2020年10月。Uターン転職して早1年。
私は普段プログラミング教室で子どもたちに指導する手前、自分の仕事でも「プログラミングがどう活かされるか」を体現出来るように日々勉強しています。

元々未経験だったので、最初はネット記事を参考にコードをコピペするだけでしたが、1年もやってると簡単なものならコーディング出来るようになったので、理解度チェックも兼ねて、自作プログラムを書いてみようと思い立ちました。
とはいえ、目的なく何か作るってのもやる気が出ず制作課題を考えていたらこんな記事が。

面白そうなので、数年ぶりに競馬予想を(プログラミング使って)してみることにしました。

期待値計算をさせよう!

細かく分析すればより確率は上がるんでしょうけど、ここに時間をかけすぎるとコーディングする量が増えて本業に支障が出るので、参考サイトは2つに限定し、記載されているデータのみで簡単なプログラミングを書きました。
内容としては以下の過去勝率で期待値を算出。

①脚質(先行有利等)
②枠(大外不利等)
③オッズ
④前走レースの結果・人気
(菊花賞・ジャパンC・天皇賞秋の上位入賞は連対率高め等)

※参考サイト情報です

コードはこちら。
可読性はまだまだですが、一応こちらが求める命令は組めました。

/**
* スプレッドシート表示の際に呼出し
*/
function onOpen({
  
  let ss = SpreadsheetApp.getActiveSpreadsheet();
 
  //スプレッドシートのメニューにカスタムメニュー「ソート > 実行」を作成
  let subMenus = [];
  subMenus.push(
    {name"実行"functionName"setLegQuality"}, //実行で呼び出す関数を指定
  );
  ss.addMenu("期待値入力", subMenus);

}

/**
* ①脚質による期待値を入力
*/
function setLegQuality({
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getActiveSheet();
  let lastRow = sheet.getLastRow();

  for (let i=3; i <= lastRow; i++){
    let range = sheet.getRange(i, 5); //脚質セル
    let legQuality = range.getDisplayValue();
    if(legQuality == "先行"){
      Logger.log(i + "行目は先行なので+10します");
      sheet.getRange(i,11).setValue(10);
    }else if(legQuality == "逃げ"){
      Logger.log(i + "行目は逃げなので+5します");
      sheet.getRange(i,11).setValue(5);
    }else if(legQuality == "差し"){
      Logger.log(i + "行目は差しなので0します");
      sheet.getRange(i,11).setValue(0);
    }else if(legQuality == "追込"){
      Logger.log(i + "行目は追込なので-5します");
      sheet.getRange(i,11).setValue(-5);
    }
  }
  setHorseFrame(ss,sheet,lastRow);
}

/**
* ②枠による期待値を入力
*/
function setHorseFrame(ss,sheet,lastRow{

  for (let i=3; i <= lastRow; i++){
    let range = sheet.getRange(i, 2); //枠番セル
    let horseFrame = range.getDisplayValue();
    if(horseFrame == "1" || horseFrame == "2" || horseFrame == "3" || horseFrame == "4"){
      Logger.log(i + "行目は内枠なので+20します");
      sheet.getRange(i,12).setValue(20);
    }else if(horseFrame == "5" || horseFrame == "6"){
      Logger.log(i + "行目は中枠なので+10します");
      sheet.getRange(i,12).setValue(10);
    }else{
      Logger.log(i + "行目は外枠なので-5します");
      sheet.getRange(i,12).setValue(-5);
    }
  }
  setOdds(ss,sheet,lastRow);
}

/**
* ③オッズによる期待値を入力
*/
function setOdds(ss,sheet,lastRow{

  for (let i=3; i <= lastRow; i++){
    let range = sheet.getRange(i, 7); //オッズセル
    let odds = range.getValue();
    if(odds < 10){
      Logger.log(i + "行目は10倍未満なので+20します");
      sheet.getRange(i,13).setValue(20);
    }else if(odds >= 10 && odds < 30){
      Logger.log(i + "行目は10倍以上30倍未満なので+10します");
      sheet.getRange(i,13).setValue(10);
    }else if(odds >= 30 && odds < 50){
      Logger.log(i + "行目は30倍以上50倍未満なので+5します");
      sheet.getRange(i,13).setValue(5);
    }else if(odds >= 50){
      Logger.log(i + "行目は50倍以上なので-5します");;
      sheet.getRange(i,13).setValue(-5);
    }
  }
  setLastRaceName(ss,sheet,lastRow);
}

/**
* ④前走レースによる期待値を入力
*/
function setLastRaceName(ss,sheet,lastRow{

  for (let i=3; i <= lastRow; i++){
    let range = sheet.getRange(i, 8); //前走レース名セル
    let lastRace = range.getValue();
    if(lastRace == "菊花賞" && sheet.getRange(i,9).getValue() <= 3){
      Logger.log(i + "行目は菊花賞3着以内入賞馬なので+40します");
      sheet.getRange(i,14).setValue(40);
    }else if(lastRace == "菊花賞"){
      Logger.log(i + "行目は菊花賞出場馬なので+20します");
      sheet.getRange(i,14).setValue(20);
    }else if(lastRace == "ジャパンC" || lastRace == "海外レース"){
      Logger.log(i + "行目は+15します");
      sheet.getRange(i,14).setValue(15);
    }else if(lastRace == "アルゼンチン" || lastRace == "金鯱賞" || lastRace == "天皇賞・秋"){
      Logger.log(i + "行目は+10します");
      sheet.getRange(i,14).setValue(10);
    }else{
            Logger.log(i + "行目は0です");
      sheet.getRange(i,14).setValue(0);
    }
  }
  setLastRaceRanking(ss,sheet,lastRow);
}


/**
* ⑤前走レース順位による期待値を入力
*/
function setLastRaceRanking(ss,sheet,lastRow{

  for (let i=3; i <= lastRow; i++){
    let range = sheet.getRange(i, 9); //前走順位セル
    let lastRaceRanking = range.getValue();
    if(lastRaceRanking == 1 || lastRaceRanking == 4){
      Logger.log(i + "行目は前走1着または4着馬なので+20します");
      sheet.getRange(i,15).setValue(20);
    }else if(lastRaceRanking == 2 || lastRaceRanking == 3){
      Logger.log(i + "行目は前走2着または3着馬なので+10します");
      sheet.getRange(i,15).setValue(10);
    }else{
      Logger.log(i + "行目は0です");
      sheet.getRange(i,15).setValue(0);
    }
  }
  setLastRacePopularity(ss,sheet,lastRow);
}

/**
* ⑥前走レース人気による期待値を入力
*/
function setLastRacePopularity(ss,sheet,lastRow{

  for (let i=3; i <= lastRow; i++){
    let range = sheet.getRange(i, 10); //前走順位セル
    let lastRacePopularity = range.getValue();
    if(lastRacePopularity == 1){
      Logger.log(i + "行目は前走1番人気なので+20します");
      sheet.getRange(i,16).setValue(20);
    }else if(lastRacePopularity == 2 || lastRacePopularity == 5){
      Logger.log(i + "行目は前走2番人気または5番人気なので+10します");
      sheet.getRange(i,16).setValue(10);
    }else{
      Logger.log(i + "行目は0です");
      sheet.getRange(i,16).setValue(0);
    }
  }
}

あとは12月の出走馬発表を待つのみ。

私の予想

時が経ち、2021年12月。有馬の出走馬がついに発表。
ネットから期待値算出に必要な情報を拾い、実際にプログラミングで分析させた結果、導かれた本命予想は…5枠9番ステラヴェローチェ!

スプレッドシートで予想シートを作成

有馬記念で外枠の勝率は相当低いので、タイトルホルダーは絶対に外したいところなのですが、今回はあくまで予想プログラムを信じて、
以下のかけ方してみることに。

結果…

残念ながらステラヴェローチェは来ませんでしたが、保険買いした枠連で何とか当たり馬券は獲得。収支はマイナスでしたが、いつもとは違う楽しみ方が出来ました。

ちなみに結果を当てはまるとこちら。

ステラヴェローチェは4着…

もうちょっと精度高めた方が良かったか…

来年の有馬では、もう少しコーディングの知識をつけて挑もうと思います。
ではではまた。

この記事が参加している募集

つくってみた

よろしければサポートお願いします。いただいたサポートはデジタルツール活用に関する記事作成の活動費用にします!