2024年01月06日

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

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

今年は久方振りに帰省してたくさんパワーを貰いました。
改修された護衛艦かがも見て大満足。

競馬AIは昨年後半から地方競馬の自動購入調整でかなりの手ごたえを得たので今年は中央競馬も躍進させたいと思います。

呉駅前
DSC_0068.JPG
レンペーから灰ヵ峰
DSC_0085.JPG
護衛艦かがとそうりゅうorたいげい型潜水艦
※輸送艦おおすみは1/2この日から石川へ救難出動でおらず。
 LCACで能登に重機を揚陸しているのをニュースで見た。
DSC_0097.JPG
広島駅前から猿猴橋
DSC_0113.JPG
広島駅裏
DSC_0114.JPG
posted by ギャンブルエンジニア at 09:28| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

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) | 開発めも | このブログの読者になる | 更新情報をチェックする