競馬AIの前方検証では、確定後のオッズを使わず、実際に締切前に取得できた値だけを残す必要がある。そこで、JRA公式Webから出走表、単勝・複勝オッズ、確定結果を収集するVPS向けcollectorを追加した。

収集は購入処理を含まない。IPAT、ログイン情報、購入APIは呼ばず、Pi側も候補CSVと仮想台帳を作るpaper simulationだけである。

VPS、Pi、Macの役割を分ける

VPSはデータ収集を担当し、取得HTMLを変更しないrawとして保存する。正規化した出走表、単複オッズ、払戻も別ファイルにし、オッズ行にはodds_timestampdeadline_atsnapshot_minutes_before、取得元を残す。

Piにはrawや履歴データを置かない。PiはVPSの強制SSHコマンドから正規化済みイベントだけを受け取り、締切前のT-30とT-10を選んで既存モデルで紙上判定する。結果イベントが届いたときだけ仮想台帳を精算する。

長期保管先はMacである。VPSのraw保存先は既存のSHA-256検証付きhandoff対象であり、転送確認前に消さない。

5分間隔でも締切前の時点を守る

各レースは締切60分前から締切3分前まで5分間隔で候補にする。通信失敗時は60秒、120秒後にだけ再試行し、完全な単勝・複勝が揃わなければ見送る。古い値や欠損値で推論を続行しない。

Piのpaper runnerは、目標時刻より後に取得されたsnapshotを選ばない。T-30/T-10の許容範囲内にある、目標時刻以前で最も新しい完全snapshotだけを使う。取得遅延、締切接近、モデルや特徴量ストアの欠損はすべてskip理由としてCSVへ残す。

常駐プロセスをtimer方式に変更

従来の公開Web snapshot collectorは前日から残り続けていた。今回はVPS側を短時間で終了するoneshot serviceと5分timerにし、flockで重複実行を防ぐ形にした。旧collectorの残存プロセスは停止したが、すでに保存されていたファイルは削除していない。

Pi側も1分timerでfeedを確認する。VPSからPiへ任意コマンドやrawファイルを渡さず、専用鍵に強制コマンドを設定して、日付・cursor付きの正規化イベントだけを返す。

実装後の検証と未配備の理由

HTML fixtureによる開催リンク、race ID、出走表、単複オッズ、複数の複勝払戻の解析をテストした。さらに、feedのcursor順序、欠損オッズの安全な拒否、目標時刻後snapshotの不採用、Python構文、systemd unitの展開後構文を確認した。関連する単体テスト11件は成功している。

一方、このVPSからJRA公式の当日ページへ1回だけ確認したところHTTP 403が返った。アクセス制限を回避する実装は行っていないため、本番timerは有効化していない。JRA公式の利用条件とVPSからの許可されたアクセス方法を確認し、正常に1開催分を取得できることを手動dry-runで確認してから有効化する必要がある。

また、旧スクリプトに残っていた直書きの認証情報は環境変数参照へ置き換えた。既に使われた可能性のある認証情報は、サービス側で変更・失効させる。

これはデータ収集と固定額の紙上シミュレーションの実装記録です。利益・的中を保証せず、馬券購入を推奨するものではありません。