AIでJRAの回収率110%を目指す検証(第23回)|ルールを守っていたのに、ルールのせいで漏れていた

ルールを守っていたのに、ルールのせいで漏れていた 実験ログ

「検証用に取っておいたデータは、絶対に覗かない」。この検証で最初に決めたことのひとつです。運用規程にも書きました。ところがその規程どおりに運用すると、毎年かならず覗いてしまう設計になっていました。ルール違反ではありません。ルールを守った結果です。

発端は、たった一言の疑問だった

ある日、こう聞かれました。

この指数は、未来の結果から計算されていませんか。

指数の中身を説明していたときの、素朴な質問でした。実際に確かめてみると、計算式そのものは問題ありませんでした。使っているのはそのレース1つ分の、締切前の情報だけです。

しかし、その計算式には調整用のパラメータが2つ入っていました。そしてそのパラメータは、「実際に3着以内に来たかどうか」に合わせて推定された値でした。

つまり、式は未来を見ていないけれど、式の形を決めるつまみのほうが、結果を見て回されていたわけです。

「取っておいた期間」の話

この検証では、データの期間を2つに分けています。

  • 探索期:いくらでも試してよい期間
  • 検証期:最後に1回だけ使う期間(それまで絶対に見ない)

後者は、有望に見えた結論が本物かどうかを、最後に一度だけ確かめるために取ってあります。一度使ったら二度と使えないので、この検証では最も慎重に扱ってきた資源です。

さて、そのパラメータは、いつのデータで推定されていたか。

自分たちの運用規程を開いたら、最初のページに書いてありました。

パラメータ 推定に使ったデータ:直近3年

そして「直近3年」を実際の日付に直すと、取っておいたはずの期間が丸ごと入っていました。

探すまでもありませんでした。自分たちで書いた文書の、いちばん目立つ場所に書いてありました。

規程には、ちゃんと歯止めも書いてあった

ここが今回いちばん興味深いところです。同じ規程には、こうも書いてありました。

★更新に使うデータ:「その時点までに確定しているレース」のみ。未来を覗かない。

歯止めは、ちゃんと書かれていたのです。 それでも漏れました。理由は読み返してすぐ分かりました。

この一文は「カレンダー上の未来」しか見ていません。
取っておいた期間は、カレンダー上は過去です。しかし検証のために取ってある未来です。
規程は、この2種類の未来を区別していませんでした。

だから、規程を守れば守るほど漏れる。毎年「直近3年で更新しなさい」に従うたびに、取っておいた期間を1年ぶんずつ食べていく設計だったわけです。

どれくらい影響したのか

「漏れていた」と分かっても、どれくらい効いていたかは別の話です。そこで、そのパラメータを調整なしの素の値に戻して、全部測り直しました。

結果は、こうです。

  • 主要な数字は生き残りました。 大きくは崩れませんでした
  • ただし効果の3分の1ほどは、調整によって作られていました
  • つまり「全部が幻」でも「無傷」でもなく、その中間でした

これは正直、ほっとしました。しかし同時に、「思ったより小さかった」で終わらせてはいけない部分でもあります。大きさの議論と、事実の記録は別です。小さかったから無かったことにする、をやると次に同じことが起きます。

差分が本当にパラメータのせいか、を確かめる

もうひとつ、自分で足した検査があります。

「調整を外したら数字が変わった」だけでは、その変化がパラメータのせいなのか、作業中に別のところを壊したのかが分かりません。

そこで、そのパラメータを一切使わない指標を11本用意して、同時に測りました。

パラメータを使わない11本 …… 小数第1位まで、1本も動かなかった
パラメータを使う6本    …… 動いた

「関係あるものだけが動いた」という形になりました。差し替えが効いていなければ全部動かないし、作業中に壊していれば関係ないものまで動きます。どちらでもない、という確認です。

面白かったのは、動いた6本のうち1本は、調整を外したら逆に良くなったことです。調整は一部の効果を隠してもいたわけで、影響は一方向ではありませんでした。

修正したのは「値」ではなく「規程」

ここが今回いちばん大事な判断でした。

最初、依頼されていたのは「古いパラメータも同じ問題を持っていたか、日付を確かめてほしい」でした。しかし記録を探しても、その日付を確定できる資料は存在しませんでした(規程は「更新のたびに監査記録を残す」と定めていましたが、一度も書かれていませんでした)。

そこで、問いのほうを変えました。

古い値が汚染されていたかどうかの問題ではありません。
規程どおりに運用すると、毎年かならず漏れます。

日付を1つ確定させても、来年また同じことが起きます。 直すべきは値ではなく規程のほうでした。

修正は3点です。

  1. 更新規則に「ただし取り置き期間を除く」を明記した
  2. 「『未来』は2種類ある」という節を新設し、カレンダー上の未来と、検証のために取ってある未来を区別した
  3. 「期間が規定より短くなっても構わない。短い推定期間より、漏れたパラメータのほうが悪い」と書いた

そして、監査記録が一度も書かれていなかった事実と、そのせいで過去の日付が確定できなくなったこと自体を、規程の中に実例として残しました。

ついでに分かった、もうひとつの漏れ

同じ調査で、閾値のほうも全期間から計算されていたことが分かりました。「上位◯%」という基準を、分析対象の全期間を見てから決めていたわけです。当然ながら、初日の時点でその値は知りようがありません。

こちらは後日、別途測り直しました。結論は「先読みは実在するが、結果はほとんど動かない」でした。理由も分かっていて、年ごとの基準値が数%しか動かないため、先読みで得られる情報がそもそも無かったのです。

漏れていた/漏れていなかった、と、影響が大きかった/小さかった、は独立です。今回は「漏れていたが、影響は小さかった」でした。これを最初から「小さいだろう」で済ませていたら、確かめる機会はありませんでした。

まとめ

  • ルールを守っていても漏れることがある。 今回はルール違反ではなく、ルールの設計不良だった
  • 「未来を見ない」は、カレンダー上の未来しか意味しないことがある。 検証のために取り置いた期間は、日付としては過去でも、扱いとしては未来
  • 歯止めが書いてあることと、歯止めが効くことは別
  • 漏れの有無と、影響の大小は別々に確かめる。 小さかったから記録しない、をやると次に同じことが起きる
  • 「値を直す」か「規程を直す」かは、意識して選ぶ。 値を直しても、規程が同じなら来年また起きる
  • やると決めた記録は、実際に書く。 「更新のたびに記録を残す」と定めていたのに一度も書かれておらず、そのせいで過去を再構成できなくなった

次回は、この検証で最も驚いた測定について書く予定です。ある2つの買い方が「当たる・当たらない」の条件が完全に一致することを実測で確認し、それでも価格が大きく違ったという話です。

決まりどおりに食べて、決まりに腹を壊すこともある。

この後の実験は、地方競馬に舞台を移しています。

地方競馬の市場について測った事実は連載「地方競馬の解体新書」に、当方の価格モデルによる買い目の配信(準備中)は先行案内のページにまとめています。