見出し画像

機械学習歴3ヶ月の素人がAIで競艇を攻略する (1)

❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎

このnoteは、プログラミング初心者から機械学習勉強中の方
競艇で不労所得を目指したい方に向けて、
「競艇で機械学習をお試しする」ハードルを下げまくるためのnoteです。

❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎

1. はじめに

こんにちは。ボットレです。
筆者は大学生なのですが、最近授業もなく暇なので機械学習の勉強をはじめました。
とはいえ、普通にやっていてもつまらなかったので、どうせなら競艇でボロ儲けを目指すことにしたわけです。

このnoteではその軌跡を紹介しながらプログラミング初心者の方に向けて機械学習の勉強の一助となるような情報を発信していく予定です。


プログラミング初心者の方や、競艇で勝ちたいために読んでくださっている方々には競艇AIづくりの道標、機械学習上級者の方には初心者の学習奮闘記として楽しんでいただきたいと思っています。


2. ボロ儲けはできたのか

結論からいうと、まだ実際に毎日予想を出力するコードは書いていないのでボロ儲けはできていません。

しかし、バックテスト (過去データで試してみること) では期待できそうな結果を出すことができたのでご紹介します。

・目標
回収率100%以上を出すこと」
・結果
まだまだモデルのアップデートの余地があるので現状の結果ですが、
約1年ほどのレースで回収率104%程度を出しています。
( 詳細 )
購 入 馬 券 ・・・三連単 (1,2,3位を順番まで当てる買い方)
 的中率 ・・・2.4% ( 舟券1枚あたり )
平均払戻額・・・4,527円 (45.27倍)
最高払戻額・・・18,280円 (182.8倍)
最低払戻額・・・970円 (9.7倍)

インコースが逃げ切って勝つガチガチのレースと予測したレースを買うと配当の低さから回収率95%程度しか出せなかったため、中穴の馬券を狙う買い方にしています。

三連単は全部で120通りなのでランダムに買うと0.8%の的中率となります。
なので、それと比べると的中率をあげられているかなという結果です。

ということで、少なくとも大損はしなさそうなモデルができたので、これから自動購入botの制作までしていきたいな、という段階です。

具体的なモデルについては以降のnoteで紹介していますのでぜひご覧ください。


3. 本noteの概要

ぶっちゃけるとこのnoteは、邪な気持ち半分で書いています

モデルは作成したので、実際に毎日稼働させるためのコードを書いたりする間に、モチベーションになるような小銭でも集められたらいいなという感じです。

まあ、つくったものをみてもらいたいだけという思いもあるので必ずしもお金が入らなくてもいいのですが...。

残りの半分は、プログラミング初心者の方の役に立ちたいという思いです。
筆者はこれまで何度かプログラミングの勉強に挑戦しましたが、全て速攻で挫折してきました。
しかし、ギャンブルの機械学習という領域は、モチベーションの保ちやすさが段違いです。初めてプログラミング学習が長く続いているこの感動を、これまで挫折してきた同志の方々に分けられたらなと思っています。


このnoteでは、
モデルのコンセプト
使用した特徴量
実際のコード
(・実際の買い目予想 )
などを順次公開していくことを考えています。

実際のコードや使用しているデータなどはダウンロード/コピペできるようにしていく予定ですので、気楽についてきていただければ嬉しいです。

プログラミング初心者で機械学習に興味がある方競艇が好きで勝てるようになりたい方は是非読んでいただけたらと思います。

・なぜ競艇の予測をすることにしたか?
まずはギャンブルが好きだったからです。
初めはもともと好きだった競馬でトライしてみたのですが、あまりうまくいかなかったため競艇に切り替えました。

・競艇の良さ
以下の理由から、個人的に競艇は機械学習に向いていると思っています。

a. 競馬に比べてレース数が多い (毎日100レース超)
b. 毎レース6艇立てのため、出頭数の変わる競馬に比べて学習させやすい
c. 馬と騎手のふたつの要素の影響を受ける競馬より、レーサーの要素が大きいため学習させやすい
d. 同じ選手が何度もレースするため学習データが蓄積されている

4. 筆者のスキルレベル

筆者のプログラミングスキルは本当に素人です。
授業程度の知識で、pythonはほとんど触ったことがなかったです。
玄人の読者の方々には稚拙なコードをお見せすることになるかもしれませんが、初心者の方を勇気づけられる内容になれば嬉しいです。

用語の使い方やコードの誤り等ありましたらどんどんご指摘ください。

ー競艇で機械学習モデルを作る前にやったことー
・Kaggle (機械学習のコンペ)のTitanicに触れてみる
 友人に教えてもらいながら、ほとんど写経で機械学習を経験
Pandasの基礎を軽く勉強する
Pandas100本ノックを参考
 ※ Pandas:データ分析用のライブラリ
・競馬を題材にモデル作成の練習をする
YouTubeチャンネル「競馬予想で始めるデータ分析・機械学習」を参考
 →スクレイピングとモデル作成の基本を学んだ
 ※ スクレイピング:Web上からデータを収集してくること

以上を二ヶ月程度で行い、一ヶ月ほどで競艇のモデル作成を行いました。

私は以上の流れで勉強しましたが、初心者の方はまずTitanicで機械学習の流れを知ったあと、実際に手を動かしながら悩んだところでググってみることを繰り返していくのがいいかと思います。

Titanicはネットにたくさんやり方が紹介されていますので見てみてください。

あとは、Kaggle用の本ではありますが以下の本も勉強になりました。
こちらは理論的なことは抜きにしてとりあえず機械学習をするにあたって役に立つワザをたくさん教えてくれる本です。
なんとなく難しそうな感じがしますが、読んでみると意外と機械学習の基本的なことから書かれているため初心者でも読みやすいです。


ただ、本noteではほとんど知識なしでもついてこれるようにしたいと思っておりますのでお気楽に読んでいただければ幸いです。


5. モデルのコンセプト

使用した言語はpythonです。
理由は特にありません。みんな使っているっぽいからです。
(調べたところ、「機械学習のフレームワークやライブラリが豊富にあること」が大きな理由みたいですね)

公式サイトから過去3~4年分ほどのレースデータを収集し、約2~3年分を学習データ、約1年分をテストデータとしてモデルを組みました。

モデルとしては、過去データの各レースにおいて選手1人1人に関するパラメータを特徴量とし、その選手が2着以内に入ったかどうかを目的変数とする二値分類モデルを作成しました。

予測器はLightGBMを使用しました。
理由はLightGBMが非Deepでトップクラスに精度が高く、かつ高速であると聞いたからです。
また、Deep Learningが勉強中であったためです。なんとなく勉強ができたらDeep Learningも使ってみたいと思っています。

予測器からは「その選手が2着以内に入る確率」​が 0~1で出力されます。
出場する6艇の選手間でこの出力値の偏差値を計算してその大小を元に購入する舟券を決定しています。

(2021.08.24追記: フォワードテストを行った結果このモデルだけでは分散が予想より大きそうだったため、今は類似したモデルと組み合わせて運用しています。)


6. まとめ

今回はここまでとさせていただきます。
初心者の方でも自信を持てる内容を目指したところ本題としては浅くなってしまいましたが、
(この記事の反応がよければ?)次回からしっかりと実際のモデルについて詳しく踏み込んでいこうと思います。

ぜひ次回も読んでくださいね。

執筆モチベーションになるのでスキ♡やサポートなどいただけると嬉しいです。

以下は次の記です。

こちらに全記事をまとめており、随時内容を更新予定ですので、別々に購入するよりもお得になっています。


この記事が気に入ったらサポートをしてみませんか?