毎日競馬予想を投稿する技術

この記事は
[競馬AI / 予想Tech Advent Calendar 2023](https://qiita.com/advent-calendar/2023/keiba_ai "競馬AI / 予想Tech Advent Calendar 2023")

15日目の記事です

# 結論から先にいうと

こんな感じの構成を組んで毎日競馬予想を投稿・ツイートできるようにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/94d48498-5d0e-826d-00f2-896cf7fff394.png)

実施したこと
- 中央/地方競馬のデータ取得にWindowsが必要だったので身銭を切ってConoHa VPSを借りた(1200円/月)
- PostgreSQLが必要だったのでsupabaseを利用して無料枠内に収めた
- 予想バッチはCircleCIで実行するようにした
- GCPの無料枠を利用して、常駐しながら予想バッチをキックするインスタンスを立てた
- GithubPages経由で予想を公開できるようにした

# 自己紹介
こんにちは、まさちゃこといいます。
普段は、競馬AI開発系 VTuberユーミィちゃんの、<strong>技術支援</strong>をしています。

ユーミィちゃんは、主に競馬AIの予想をつぶやいたり、レースに関する動画を投稿したりしています。

 <strong>あくまで、趣味としての競馬観戦のサポートや、自作コンテンツの拡大を目的としているため、予想を無料公開はしているものの、買い目を売ったりはしていません。 </strong>
予想が外れたときも怖いですしね(；・∀・)

ユーミィちゃんの予想は、レースの15分ほど前にツイートされます。
ちなみに、前回の阪神ジュブナイルフィリーズは↓のような予想でした。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/bbcbe94e-23fd-3df6-efac-2096f37172f5.png">

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/f470f950-4f21-9b25-ed4b-e3a3bf915258.png)

結構良い予想ではなかったのでしょうか。
最強とは言えませんが、ぼちぼち安定感のある、ぼちぼち穴目も予想してくれるAIだと思います。

※netkeiba様の結果ページの転載は下記の範囲内で許可されています。
https://info.netkeiba.com/?pid=secondary_guide

# 今までの予想投稿と、予想投稿の大変なところ
さて、そんなユーミィちゃんの、予想を出すまでの一連のプロセスはおよそこんな感じでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/3ce178f1-a4ed-f2df-f2d8-5872a61930bc.png)


- レース前日
  - 中央・地方競馬の予想をするためのデータを取得する
  - データはPostgreSQLに格納される
  - 夜間にデータを集計して、データセットとして出力
  - 前日予想を出力してアップロード
- レース当日
  - レースの１５分前ごろにリアルタイムデータと、データセットをマージ
    -  リアルタイムデータは、馬場状態、馬体重など
  - データセットをもとに予測を出す
  - 予測結果をツイート

大変なところとしては

- 馬体重や、馬場状態等のデータはレースの１時間前ごろに公開・配信されるため、それらを利用する場合は、直前にデータのマージ、予測をしなければならない
- データはWindowsのプログラム経由で配信されるため、Windowsマシンが必要

というところです。

# 毎日予想投稿ができない。

ユーミィちゃんは中央競馬を、ほぼ毎週ツイートしているものの、地方競馬はたまにしかツイートしていませんでした。

地方競馬は毎日開催されているため、毎日予想を投稿したい。という気持ちはありました。

皆さんの目につく機会が増えれば認知度も上がりますし、たまに自身がふらっと地方競馬を帰りがてら見に行きたくなっても、予想が見られるからです。

また、ありがたいことに、平日も予想は出してないのか？というお声をかけていただくこともありました。

さくっと自宅サーバで毎日稼働させる。という手も検討しましたが、火災の心配もあったため実施しませんでした。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/5e65e32c-bd15-85a6-4b66-9854335e382b.png">


そのため、ユーミィちゃんが平日予想するために
以下の環境を、宅外に構築して用意する必要がありました。

### スケジューラ

当日の開催データを読み込んで、予想を実行させるためのスケジューラが必要です。

### 平日も稼働できるWindowsサーバ

中央競馬や地方競馬のデータの取得には、専用のWindows用プログラムを必要とします。
そのため、リアルタイムデータを取得するにはWindowsサーバが必要です。

### PostgreSQLサーバ
中央や地方競馬のデータはPostgreSQLに格納されるため、PostgreSQLが必要です。

### 予想実行・投稿サーバ
データセットとリアルタイムデータをマージして、予想を実行し。アップロードするサーバが必要です。

# 平日予想の壁

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/a39eafc1-3961-be77-423a-3a3d14f7cfe7.png">

これらを用意するにはそれぞれ壁があります。

### 金銭面の課題
スケジューラ程度なら、クラウドの無料枠でぼちぼちなんとかなりそうでしたが、WindowsサーバやPostgreSQLはわりとお金がかかりそうです。
無料予想、趣味の範囲でやっているので、できれば固定費の増加は避けたいところです。

~~競馬で安定して稼げれば良いのですが成績は後述の通りです~~

GCPでWindowsサーバを立てるにしても、vCPU x 2 / 1GB メモリの構成でも、48ドルほどかかることがわかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/e68e84bb-5aaa-f141-9cfb-519f5808de77.png)

### メモリサイズの課題
また、予想実行サーバも、大きめのデータセットを読み込む関係上、そこそこのメモリサイズが必要になります。
ざっくり見積もったところ、最低1GB、余裕をもたせるなら2GBほどのメモリが必要でした。

### 実行時間の課題

地方競馬は毎日、2～3競馬場ほどが、それぞれ12レース程度開催されます。
土日には、中央競馬が2～3競馬場ほど開催され、こちらもそれぞれ12レース開催されます。
そのため、月間だとざっくり

地方競馬 3会場 x 12レース x 31日 = 1116レース
中央競馬 3会場 x 12レース x 8日 = 288レース

合計月間で 1400レースほど開催される計算になります。すごいですね！
１レースの予想に１、２分かかるとして

(1400レース * 2分) = 2800分 ≒ 47時間

稼働できるマシンが必要です。

※ が、なぜか構成を考えていた当時は、中央競馬が毎日開催される計算で、5000分程度と見積もってしまっていました。

# 無料枠との組み合わせで組んでみた

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/09ac4a48-cbe3-1b1d-b775-77fac5593c3d.png">

色々な情報を集めた結果、できるだけリーズナブルにクラウド無料枠と組み合わせて組むことができました。

### スケジューラ
GCPの無料枠を使用して、常時起動できるサーバを立てました。
時間になると、予想実行バッチをキックして、ツイートを投稿します。

### Windows
色々と調べた結果、Windowsだけはどうすることもできませんでした。
こればかりは、どうにもならないので 月1200円ほどで利用できる。ConoHa for Windowsを採用しました。
vCPUが2つに、1GBのメモリが利用できます。

ConoHaは時間課金もできるので、1200円/月のスペックじゃ足りないと思えばすぐにやめられるのも良いポイントですね。

https://www.conoha.jp/windows/

### PostgreSQLサーバ

Firebase代替を謳う、supabaseというクラウドサービスが、PostgreSQL互換のデータベースを提供してくださっています。
ありがたいことに、500MBまでなら、無料枠として利用することができます。
日次のレース開催スケジュールと、リアルタイムデータのみの格納であればこの枠内で足りそうです。
また、ストレージも用意されているため、そこへ予想をアップロードすることにしました。

https://supabase.com/

### 予想バッチの実行

Circle CIが月間、6000分の無料枠を提供してくださっており、これを利用することにしました。
ほかのCIサービスも検討したのですが、Circle CIの良いところは6000分という破格の実行時間もありますが、「メモリを2GB使用して6000分」というのもかなり大きなポイントでした。
2GBあれば余裕をもって予測バッチを実行することができます。

また、CI/CDサービスのため基本的にDockerイメージを利用できます。
予想したいときだけ、予め用意した環境を立ち上げて、予想が終わったら落とす。という利用にぴったりです。

※ 構成を考えていた当時は１ヶ月、5000分ビルド時間が必要で2GBのマシンメモリが確保できる必要があると見積もっていたためCircle CIにしました。今思うと、Cloud Buildなどでも足りたかもしれないですね。

https://www.itmedia.co.jp/news/articles/2201/13/news097.html


### 結果、完成した構成

最終的にこんな感じになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/94d48498-5d0e-826d-00f2-896cf7fff394.png)


- 自宅で夜間のうちにデータセットを作成
- 予想プログラムと、データセットとモデルをDockerイメージにしてプライベートリポジトリとストレージにPUSH
- リアルタイムデータはConoHaから随時、SupabaseのDBへ更新をかける
- 時間になると、GCP上のインスタンスから、CircleCIのジョブをキック
- CircleCI は Dockerイメージ(予想プログラム)とデータセットを取得
- CircleCIはsupabaseからリアルタイムデータを読み込み、予想を出し結果をアップロード
- 予想アップロード後、Twitterで予想結果をツイート・告知
- 競馬ファンはツイートと、GitHubPagesから予想を閲覧できて、めでたしめでたし

# 結果どうだったか

11月度はほぼまるまる１ヶ月稼働しましたが、設定ミスによる不調なところはあったものの、リソース不足で継続不可になることはあませんでした。

Circle CIも2300分程度に収まってくれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/bfa51f3f-71da-7db1-d39d-d5c6ed869537.png)

Windowsマシンが比較的余裕があるようなので、スケジューラはWindowsの方に寄せても良かったかもしれません。

構築していく上でも、いざ「自分のお金・・・！」となると、当たり前ですが自分事としてコストの削減に取り組むことができたため、これが一番いい経験になったのでは無いかと思います。

どうしても、データセット出しに関しては、集計するためのDBが大きいので自宅で行う必要がありますが、プログラムの改善などでうまいこと脱DBを図れないか検討したいところです。

長々とした記載になってしまいましたが、ここまで読んでくださりましてありがとうございました！

# AI競馬予想マスターズに参加しています。
現在、netkeiba様主催の「AI競馬予想マスターズ」という競馬AIが予想合戦をする大会に出場しています。

予想から買い目までAIに決めさせて、予選1(10月度)では38レース買って回収率72.5%(24位)。
予選2(11月度)では50レース買って回収率95.6%(8位)でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/62a227ba-18b0-bb8c-2c70-c29faaf879ed.png)

ちょっと競馬が得意マンくらいですね（；＾ω＾）・・・。

現在、最終戦(12月末までの予想合戦)が開催されていて、ありがたいことに、ユーミィちゃんも最終戦まで残っています。
大会の様子は、下記のページから状況を確認できます。
https://yoso.sp.netkeiba.com/masters/ai2023/

ユーミィちゃんは、そもそも最終戦で買っている数がめちゃくちゃ少なく、ダントツのドべですが・・・。( ；∀；)


# 過去の競馬予想に関する記事

https://qiita.com/masachaco/items/5f50629e1160ec4abc2f

https://qiita.com/masachaco/items/5b3f4bcb3d133f2e6f5f