2023年01月01日

明けましておめでとう2023年

新年、明けましておめでとうございます。

年末まで仕事に時間を奪われて結局、競馬AIの開発進捗は進まず。
12月の中山・阪神・中京開催とも中央の成績は良かったが地方競馬でかなり負けているので、この元旦休みのうちにシーズン2の準備を進めておきたい。

@新規AI環境の構築
 特徴量テーブルの改修とグループ分け
 着率算出のために、出走馬2値分類予測器の作成と検証。

ATransformersとAttentionの学習
 馬券購入の判断をDeepラーニングでやってみたい。
 前からAttention機構には興味があったので、まずはTransformersとAttentionの勉強とコードいじりから始める。







posted by ギャンブルエンジニア at 09:34| Comment(0) | 開発めも | このブログの読者になる | 更新情報をチェックする

2022年11月12日

競馬AI開発にありがちな間違い

世の中、競馬AIの開発ブログ記事は沢山あるわけで、中には自称回収率100%超えたというものもあるが、ほぼすべての記事では単にバックテストで回収率100%超えたという話であって実戦では全く役に立たない。また間違った特徴量やバックテストでの回収率100%超えは容易に達成できるので、共通して散見される間違いであろう点を簡単にまとめてみた。

@特徴量のリーク
 ・最終オッズや最終人気を当該レースの特徴量としてしまっている。
  →最終オッズや最終人気は投票締切以前には分からないので当該レースの特徴量に含めてしまうことはリーク。
   最終人気オッズを当該レースの特徴量としている記事は即座に無視することをお勧めする。
 ・前走履歴データに当該レースを含めてしまっている。
  →すでに結果が分かってしまっているので的中率回収率が爆上げするのは当然だ。
 ・成績や勝率・タイム等を集計した特徴量を当該レース以降を含む最新のもので計算してしまっている。
  →常に当該レースより前のデータのみで集計する必要がある。
 ・JRA-VANの今回の脚質という項目を特徴量にいれてしまうとリークしてしまう。(単に自分の経験)
  →レース後に入ってくる項目のため、前走までの履歴にしか使えない。
  ※自分は初期の頃これで相当やらかした。
  スクレイピングの場合に脚質情報がどうなのかは不明。もしレース終了後に書き換えているのであればリークするだろう。

Aバックテスト・購入シミュレーションの問題
 ・過去結果を含む特徴量を使った最新モデルで過去レースのバックテストをおこなってしまっている。
  →既に結果が分かってるので丸暗記してるだけ。バックテストの意味ない。
  ※過去レースを予測する場合、それ以前の特徴量のみで生成したモデルを使用しないといけない。
 ・確定配当を使った予測回収率を用いて購入シミュレーションをおこなってしまっている。
  →予測回収率による購入判断がある場合は、締切前の時系列での配当で予測回収率を計算する必要がある。
  ※何気にこのハードルが高い。単勝複勝枠連馬連などは時系列データ提供があるので良いが、他の券種では存在しないので蓄積には時間が必要である。
  ※自分の場合は、AI開発とは関係なくたまたま2017年から全券種の配当データを蓄積していたので助かった。 
 ・単純に回収率の算出方法がおかしい。
  →甚だしいのになると、レース毎の購入シミュレーションすらせずに、予測結果の的中率×平均配当で回収率を算出しているものすらある。頭おかしいレベルなのでこういう記事は無視しよう。

Bオーバーフィッティングの問題
 バックテストは大なり小なりオーバーフィッティングしているものである。
 特に購入レースを絞る手法の場合は、確率の上振れを掬っているだけなので未来においてその高回収率はほぼ再現しない。
 本質的なファクターを捉えている場合もあるが、常にバックテスト回収率>実戦回収率となるのである程度のマージン確保が必要。
 またバックテストで回収率100%超えたと言ってすぐに予測を販売する輩もいるが正気の沙汰とも思えない。
 良心があるのなら少なくとも半年〜1年くらいは実際に自分のお金で運用してみてバックテスト通りに勝つことを確認してから販売するべきだろう。
 まぁ実際に勝てるのであれば、雑所得から事業所得への転換を図りたいタイミング以前での予想販売はしないだろうけど。

間違いではないがどうかと思う点
・スクレイピングでデータを持ってきている。
 →よくTwitterで更新止まりましたーという競馬AIがあるが、大体原因はコレ。
  他社のサイトマップやサイトデザインに依存しているので不安定なのは当たり前。
  そもそも他社のサーバに負荷を掛けるわけだし、オッズ等頻繁に更新したいデータもあるので、そこはケチらず素直にデータを買う方が良い。

・実戦やフォワードテストがうまくいかないとすぐにころころとモデルを更新する。
 →モデルを変えてしまうと実戦やフォワードテストの統計データがすべてリセットされるわけだがどうなんだろう?
  馬券をうまく買うためには、モデル精度やバックテスト結果より実戦での統計データのほうが重要。
  バックテスト結果や過去のシミュレーション結果なんて気休めか自己満足にしかならない。
  もっと言えば
  単勝回収率100%を超えるモデルがベターなのは間違いないが、それ以下ならば
  単勝回収率80%のモデルより
  単勝回収率50%のモデルのほうがうまく馬券が買えるであろう(笑

posted by ギャンブルエンジニア at 05:01| Comment(0) | 開発めも | このブログの読者になる | 更新情報をチェックする

2022年10月31日

LamdaRankの結果値について

相当今更なんだが、LamdaRankで予測した結果値はデフォルト設定ではラベル毎に指数関数的なゲインが付いていることを知った(汗

ランキングxに対してのデフォルトゲインは2^x-1
(0,1,3,7,15,31,63...)

道理で数値そのものの相関が低いはずだ。
label_gainパラメータで設定できるので、恣意的にすることもできるし線形にすることもできる。

シーズン2ではまず線形あるいは目的変数から割り出した係数にしてみて改めて統計データを取ってみる。
着順予測だと、恣意的に調整するのも有りかもしれないが
まぁ普通に2値分類から勝率だすほうが良さそうではある。
posted by ギャンブルエンジニア at 10:50| Comment(0) | 開発めも | このブログの読者になる | 更新情報をチェックする

2022年10月08日

確率の上振れ下振れについて

ここ2週間ほど、開催別の購入数・配分の最適化に血道を上げているのであるが、ここに至ってようやくほぼ完全に理解した。

過去のシミュレーションにおいてフィルターやAIを駆使することで回収率を上げたり、何らかのルールを用いてレースを絞ることで回収率を上げたりする行為は、単に結果が分かっている事象の確率の下振れを避けて、上振れだけを掬い取っているだけという事。

未来の実戦では、下振れも上振れも常に発生しているのだが、そのどちらかだけを選り分けることはできず、結局のところ下振れも否応なく買わされるのである。
このため、ほとんどの場合、シミュレーションより実戦のほうが回収率が低くなってしまうのだろう。

もちろん、結果に影響のあるファクターであれば多少は回収率に影響を与える事はできるし、出走頭数など明確に馬券結果に影響を与える条件で戦術を変えたりすることは有効であるが、たとえフィルターをどのラインに引いたとしても、必ずその境界線外の特異点が発生してしまう。

例えば、1回100円払って1が出ると600円貰えるサイコロがあるとしよう。
1日1回だけ振って2年か3年の間、振り続けることで収束したフォワード結果を得たとする。
次に該当日の天気や気温、あるいは自分の体重などサイコロの結果と関係ないファクターを使ったロジックやAI(オーバーフィットで丸暗記してるとか)を開発したとする。
これらを駆使して、フォワード結果から1が出なかった日を排除することで、ついに過去のシミュレーション結果では回収率120%を叩き出したとする。

これって単なる偶然や過去データの偏りであって、この条件で明日からサイコロ振ったり振らなかったりしても回収率120%は無理だよね?いくら頑張っても回収率100%になるよね?
というお話。
競馬の出走頭数は、サイコロの場合の面数にあたり、明確に結果(配当)に影響を与えるので、これを分類して投資金額を変えたりするのは当然あり。

結論
@結果と関係あるか明確でないファクターを使って試行回数を少なくすることで回収率を向上させる(データを偏らせる)ことには意味がない。
 →Target民が陥りがちな迷宮への入口
A明確に結果に関係するファクターを使って分類して投資金額を上下させることは必要だが、それぞれの試行回数は最大限増やさなくてはいけない。
 →全レースで試行せよ

上記を踏まえると、
確率の下振れは避けられないという事を予め前提にして、シミュレーション結果で試行回数を減らさずとも下振れに耐えられるような高回収率を出せているところを買っていくしかない。
だいたい回収率で5%~10%くらいの下げは考慮しておくほうが良いだろう。
まだ試行回数が1年分ほどしかないので、的中率がそれなりに高くないと信頼できないので的中率についても充分考慮する必要がある。
レース前予測結果が2年〜3年分あればそれなりに信頼に足る精度になるはずだが、蓄積には時間が必要だ。

というわけで今週は上記を踏まえて最適化をおこなっているわけであるが、数値等も肌感覚でだいぶ分かってきているせいか、此のところ高い回収率の成績で安定もしている。
今週はさすがに調子が良すぎたので上振れ分がかなりあると思われるが・・・全開催の調整が済んでこの調子を保っていければ完全に離陸できる日も近いのかもしれない。


posted by ギャンブルエンジニア at 06:21| Comment(0) | 開発めも | このブログの読者になる | 更新情報をチェックする

2022年10月01日

シミュレーションと実戦との誤差について

昨シーズンでは、購入シミュレーションの結果による推定期待値を重視して実戦に励んだ結果
シミュレーション通りに行く開催もあれば、まったく達しない開催もあり(達しない方が多い)
この矛盾に終始悩まされ続けたわけである。

色々理由はあると思うが
そもそも期待値というのは

推定勝率×実オッズ

なわけで、しょせんどちらも打率でいうと3割程度しかなくむしろハズレの方が大きい。

期待値となると誤差の2階建てをしてるわけで、その誤差は相乗的に大きいものになるはずである。
このためシミュレーション条件でカリカリチューンをおこなってシミュレーション結果の期待値を上げたとしても
実際には誤差が非常に大きいので、なかなかシミュレーション通りにならないという事だと思う。
もちろん現在の予測方式が1着予測でないために推定勝率が不正確であるという事も一因ではある。

対策としては
@推定勝率の精度を上げる
A実オッズより精度の高い推定オッズを予測する。
なども考えられるが、いくら頑張ったとしても、しょせん勝率3割を大きく越えることは困難なはずなので相乗誤差が大きい事自体は変わらない。
という訳でこれらの対策方式は徒労に終わると判断しアッサリ放棄することにした。

で、この誤差問題を解決するため、1か月間仕事をサボってあれやこれや模索して見た結果
推定勝率や推定期待値、オッズなどを重視するよりも
開催別・券種別に購入点数を最適値あたりに調整するほうが、実際の結果(的中率・回収率)をコントロールし易い事に気が付いた。

もちろん初期フィルターの原点はシミュレーション結果に基づいているが、こちらはアバウトに捉えておくだけにして
あらかじめ開催別・券種別に最適購入点数の上限下限を算出しておき、なるべくこの範囲に収まるようフィルターを調整していくと
なぜか自然と実戦での回収率が上がっていく事が多いようである。(シミュレーション結果に近づいていく?)
※最適点数や算出式は非公開です。

もちろん回収率が全く達しないものでは買いすぎてしまうことや、もともと回収率の高いものでは逆に買わなすぎてしまうことも割とあるので実戦で微調整していく必要はある。ある程度、調整にも慣れてきたので、東京・阪神・新潟・福島などの開催に合わせて少しづつ調整していくことにする。
未達の開催-券種については、購入ロジック側で買わないか、投資配分を下げることで対応する。

というわけで、シーズン2の優先順位を少し変えることにした。
@シーズン1の現行システムの高回収を出せる開催-券種だけで毎月勝てるように調整して、まずは安定的に離陸させることを最優先とする。
Aグループ再編成と、特徴量追加+学習データ増加(20年-21年分追加)により、現在未達の開催や券種でも、上記調整次第で離陸することが出来るように精度を上げる
B全体でもちゃんと離陸できるようになってから、勝率予測や最終オッズ予測などのモデルを作って遊んだり検証したりする。

あ、うちの場合は1着予想の機械学習ではないので、ここで言う「精度」は、勝率ではなく期待値そのものだと思ってください。
これAI制作している人と会話するときに、目的変数が違うと精度という言葉の定義対象そのものが違ってたりするので話が噛み合わないのである。




posted by ギャンブルエンジニア at 08:28| Comment(0) | 開発めも | このブログの読者になる | 更新情報をチェックする