結論:Task Scheduler×Pythonで毎朝6時に競艇予想が自動生成される仕組みになった
結論から書きます。Windows11のTask Scheduler、Python、OpenAI APIを組み合わせて、毎朝6時に当日の競艇全レースの予想がLINEに飛んでくる環境を作りました。私のケースでは、この仕組みを30日間動かして、API代は月500円程度、回収率は98%という結果でした。利益にはなっていませんが、「朝起きたら今日の買い目が決まっている」状態は、想像以上に時間効率が良いです。
仕事前にスマホで予想サイトを見回す時間が消えた、これだけでも個人的には作って良かったと感じています。以降、再現できるレベルで手順を書いていきます。
構成図と必要なもの:Windows11 + Python + OpenAI API + 公式オッズスクレイピングの最小セット
最小構成はこうです。
- OS: Windows11 Home
- Python 3.11(Anaconda不要、公式インストーラでOK)
- ライブラリ:
requests/beautifulsoup4/openai/gspread/python-dotenv - OpenAI API(私は
gpt-4o-miniを使用、安いので) - LINE Notify(廃止前提なら、LINE Messaging APIに置き換え可)
- Googleスプレッドシート(gspread経由で書き込み)
- データ取得元: 競艇公式サイト(boatrace.jp)
処理フローはシンプルです。Task Scheduler → run.bat → predict.py → 公式サイトからオッズ・選手データ取得 → OpenAI APIで買い目生成 → LINEに送信 → スプレッドシートに記録、これだけ。
ステップ1:競艇公式サイトから前日オッズ・選手データを自動取得するPythonスクリプトを書く
公式サイトはHTML構造が比較的素直なので、requests + BeautifulSoup で十分取れます。私が実際に使っている取得用関数の骨格はこんな感じです。
import requests
from bs4 import BeautifulSoup
def fetch_race_info(jcd, race_no, date):
url = f"https://www.boatrace.jp/owpc/pc/race/racelist?rno={race_no}&jcd={jcd}&hd={date}"
res = requests.get(url, timeout=10)
soup = BeautifulSoup(res.text, "html.parser")
# 選手名・級別・モーター2連率などを抽出
rows = soup.select("table.is-w495 tbody")
return [parse_row(r) for r in rows]
注意点として、リクエスト間隔は最低3秒空けています(time.sleep(3))。公式サイトに迷惑をかけないため、ここは絶対に削りません。24場×12レースを全部取りに行くと約7分かかりますが、深夜帯に走らせるので問題なしです。
ステップ2:取得データをChatGPT APIに渡して「軸・ヒモ・買い目」をJSONで返させるプロンプト設計
ここが一番工夫したところです。GPTにそのまま「予想して」と投げると曖昧な文章を返してくるので、JSON Schemaで出力形式を強制しています。
prompt = f"""
あなたは競艇予想の分析アシスタントです。
以下のレース情報をもとに、軸(1名)・ヒモ(2-3名)・推奨買い目(3連単5点以内)をJSONで返してください。
{race_data}
出力形式:
{{ "axis": 1, "himo": [3,4], "tickets": ["1-3-4","1-4-3","1-3-5"], "confidence": 0.62, "reason": "..." }}
"""
response_format={"type":"json_object"} を指定するとパース失敗がほぼゼロになります。confidence を返させているのは、後から「自信度の高いレースだけ買う」フィルタを入れるためです。私の運用ではconfidence >= 0.6 のレースだけLINE通知しています。
ステップ3:Task Schedulerで毎朝6時に.batを叩く設定(つまずきポイントと解決法を全部書く)
Task Schedulerで.batを毎朝6時に実行する設定自体は5分で終わりますが、私は3点でハマりました。
つまずき1: 環境変数(API Key)が読めない
.envの読み込みパスが相対パスだと失敗します。load_dotenv(r"D:\boat\.env") のように絶対パスで指定して解決。
つまずき2: PCがスリープ中だと動かない
タスクのプロパティ →「条件」タブで「タスクを実行するためにスリープを解除する」にチェック。
つまずき3: 文字化け(cp932エラー)
.batの中で chcp 65001 を入れて、Pythonのprintにencoding='utf-8'を明示。これでUnicodeDecodeErrorが消えました。
run.batの中身は実質3行です。
chcp 65001
cd /d D:\boat
python predict.py >> logs\run.log 2>&1
ログを残すのは絶対やった方がいいです。失敗した日に原因追跡できないと詰みます。
ステップ4:予想結果をLINE Notify+Googleスプレッドシートに自動記録して回収率を可視化する
予想を出すだけだと結果検証ができないので、スプレッドシートへの自動記録は必須です。gspreadでサービスアカウント経由で書き込みます。記録項目は以下。
- 日付 / 場 / レース番号
- 軸 / ヒモ / 買い目 / 自信度
- 結果(手動 or 翌日に確定オッズAPIで自動更新)
- 投資額 / 払戻額 / 単レース回収率
LINE通知は1日1通にまとめて、自信度0.6以上のレースだけリスト形式で送ります。これで朝の通知爆撃を回避できます。スプレッドシート側はピボットで「場別回収率」「自信度帯別回収率」を可視化していて、ここを見ると改善ポイントが見えてきます。
30日間運用してわかった的中率と月額コスト:API代500円・回収率98%のリアルな数字
30日間(2026年4月)回した実績の概算は以下です。
| 項目 | 数値(概算) |
|---|---|
| 通知レース数 | 約180レース |
| 3連単的中率 | 約11% |
| 回収率 | 98% |
| OpenAI API代 | 約500円 |
| Googleスプレッドシート | 0円 |
| LINE通知 | 0円 |
回収率98%は「収支トントンに近いがマイナス」という現実的な数字です。これを「ダメ」と見るか「ベース」と見るかは人によりますが、私はベースだと考えています。プロンプトの改善(直近の節間成績を重み付け)、フィルタ強化(自信度0.7以上だけ買う)、そもそも買い目数を3点に絞る、など改善余地が大量にあるからです。
完成品を作って終わりではなく、毎週少しずつチューニングできる「土台」が手に入ったのが一番の収穫でした。
まとめ
Task Scheduler×Python×OpenAI APIの組み合わせは、競艇に限らず「毎朝定時に何かを自動生成してLINEに送る」用途に応用が効きます。私はこの仕組みをベースに、株のスクリーニング通知、天気×服装提案にも横展開しています。Windows PCをただの作業端末から「自分専用の自動化サーバー」に変える第一歩としても、競艇予想は題材として手頃です。まずは1場・1レースだけ取得するところから始めてみてください。
関連ツールを見る
この記事で紹介したツール・サービスをまとめてチェック。
![]()