Skip to content

分析スクリプト例一覧

KMY(雪あすか) edited this page Dec 24, 2022 · 9 revisions

以下のコードをコピーして、「分析」の「スクリプト設定」タブに新規項目作成して貼り付けます。(ソースコードにマウスを乗せると、ソースの右上にアイコンが出てきます。それを押せばコピーしたことになります)
次に、分析設定で特定の行の種別を「スクリプト」にして、「スクリプト」コンボボックスから項目を設定します。

スクリプトに指定するパラメータ、出力される値については、スクリプト冒頭にある説明を参照してください。特にパラメータの説明がない場合、パラメータの指定は不要です。

好走体重ポイント Ver.1.2

  • Ver 1.2 - 体重発表前は常に 0 を返すよう修正(12/24/2022)
  • Ver 1.1 - 変数名ミスを修正(12/21/2022)
/*
 * 好走体重ポイント Ver.1.2
 *
 * 馬の過去のレースから「人気-着順」(好成績時)の数値が最も高かった体重を割り出し、
 * 現在のレースの体重と比較した差に-1をかけて出力
 * 例えば、ベスト体重が450、現在の体重が470の場合、-20が返される
 */

let result = 0;

// 着順のあったレースのみを考慮する
const beforeRaces = horse.history.beforeRaces.filter(rh => rh.place > 0);

if (beforeRaces.length > 0 && horse.weight > 0) {

  // 過去レースの最大・最小体重を取得して、この範囲でループを回して5キロずつ調べる
  const weights = beforeRaces.map(rh => rh.weight);
  const maxWeight = Math.max(...weights);
  const minWeight = Math.min(...weights);

  let bestWeightMin = 0;
  let bestWeightMax = 0;
  let bestWeightScore = -100_0000;

  for (let weight = minWeight; weight <= maxWeight; weight += 5) {
    const weightMin = weight;
    const weightMax = weightMin + 4;

    // 体重最大・最小の範囲内のレースを取得
    const targetRaces = beforeRaces.filter(rh => rh.weight >= weightMin && rh.weight <= weightMax);

    if (targetRaces.length > 0) {

      // 「人気-着順」の合計をtotalScoreとし、その平均を求めたものをscoreとする
      const totalScore = beforeRaces.reduce((sum, rh) => sum + (rh.popular - rh.place), 0);
      const score = totalScore / targetRaces.length;

      // これまでに記録していた最高成績と比べてこの体重範囲の成績がよければ、記録を更新する
      if (score > bestWeightScore) {
        bestWeightScore = score;
        bestWeightMin = weightMin;
        bestWeightMax = weightMax;
      }
    }
  }

  // 最も記録のよかった体重を現在の体重と比較する
  const comparableWeight = horse.weight < bestWeightMin ? bestWeightMin :
    horse.weight > bestWeightMax ? bestWeightMax :
    (bestWeightMin + bestWeightMax) / 2;
  const weightDiff = Math.abs(horse.weight - comparableWeight);

  // 負の数にする
  result = weightDiff * -1;
}

result;

地方のクラス昇降

/*
 * 地方のクラス昇降
 *
 * 前回のレースからクラスが上がっていれば-1(例えばB→A)
 * 前回のレースからクラスが下がっていれば1(例えばA→B)
 * 前回または今回が中央競馬の場合、またはクラス指定のないレースの場合は0
 * ※C1、C2といった数字の比較は未対応(参考:subject.items配列内のlevelから取得可能)
 * ※中央競馬には未対応(参考:race.subjectAgeYoungestから中央のクラスを取得可能。数値はJRA-VAN Data仕様書参照)
 */

const CLASS_A = 999;
const CLASS_B = 998;
const CLASS_C = 997;
const CLASS_D = 996;
const CLASS_MONEY = 10;
const CLASS_AGE = 20;

let result = 0;

if (horse.history.beforeRaces.length > 0) {
  const beforeRaceHorse = horse.history.beforeRaces[0];
  const beforeRace = beforeRaceHorse.race;

  const isCurrentLocal = typeof(race.subject) !== 'undefined' && race.subject !== null;
  const isBeforeLocal = typeof(beforeRace.subject) !== 'undefined' && beforeRace.subject != null;

  // 前回も今回も地方
  if (isCurrentLocal && isBeforeLocal) {
    const currentClass = race.subject.maxClass;
    const beforeClass = beforeRace.subject.maxClass;

    // 前回も今回もクラス分けあり
    if (currentClass >= CLASS_D && beforeClass >= CLASS_D) {

      if (currentClass > beforeClass) {
        // クラス昇格
        result = -1;
      } else if (currentClass < beforeClass) {
        // クラス降格
        result = 1;
      }
    }
  }
}

result;