データ分析・統計・過去検証
他者が追試できる競馬検証の残し方
競馬の予想精度の再現性を確かめるには、結果の数字だけでなく、元データの版、対象を選ぶ規則、予想を固定した時点、採点手順、計算環境を一組で記録します。他の人が同じ資料と規則から同じ値を得られる状態が、追試の出発点です。ただし同じ値を再現できても、未来の情報を使った誤った検証なら有効性は保証されません。計算を再現することと予想の力を確かめることを分け、記録の作り方を説明します。
読む時間の目安:約11分

同じ計算と新しい期間の追試を区別する
再現には複数の段階があります。同じ保存資料を同じ手順で処理して同じ数字へ到達することは、計算の再現です。別の人が同じ定義で資料を取り直して結果を確認する場合は、資料の訂正や取得範囲の差も調べる必要があります。さらに、固定した規則を後の競走へ適用する確認は、過去の数字の再現とは別に予想の有効性を評価する作業です。
この区別がないと、プログラムを二回実行して同じ回収率だったことを「予想の再現性が高い」と強く表現してしまいます。計算が決定的であることは重要ですが、独立した将来の成績まで保証しません。一方、数字が一致しないから直ちに予想が無意味ともいえません。取得版や定義の違いを調べてから、何が一致しなかったかを判断します。
追試する人へは、どの段階を確認してほしいかも伝えます。「この集計表の再計算」「公開予想と公式払戻の照合」「同じ規則の次期間評価」では必要な資料が変わります。目的を決めると、何を公開し、何を内部で保管するかを整理できます。個人の認証情報や非公開の利用者記録を添付する必要はありません。
一つの検証を五つの資料へ分けて残す
元データを加工後の表だけで置き換えない
第一に取得した原資料、第二に集計用へ変換した表、第三に採用した予想と購入規則、第四に確定払戻を対応させた精算表、第五に記事へ掲載した集計結果を保存します。段階を分けると、表示の丸め方の違いなのか、対象馬が変わったのか、元の資料が変わったのかを調べられます。最終表だけでは、数字ができた過程が失われます。
表は左右にスクロールできます。
| 保存するもの | 照合できること |
|---|---|
| 原資料と取得日時 | 資料の訂正・欠落・取得範囲 |
| 変換規則と加工後の表 | 着順表記や単位の解釈 |
| 採用予想と条件の版 | 結果前に決めた対象と金額 |
| 精算表 | 購入と確定払戻の対応 |
| 集計設定と結果 | 分母・式・表示の丸め |
原資料を保管できる範囲で、ファイル名、取得元URL、取得日時、資料が示す基準時刻を一覧にします。同じファイル名を上書きするだけでは、後から別の内容になったことに気付きにくくなります。内容を識別するハッシュ値を残す方法もありますが、それは同じ内容かを確認する補助であり、資料の正しさや発走前に存在したことを単独で証明するものではありません。
配布できない資料が含まれる場合は、取得元と必要な項目、取得した版、加工手順を示し、共有できる小さな架空データを補助として用意できます。ただし、架空データで処理が動くことと実資料の検証が済んだことは別です。第三者が追える範囲と、権限等によって追えない範囲を区別して説明します。
キー・単位・状態をデータ定義として固定する
レースを日付と競馬場名だけで識別すると、同日の別レースが衝突します。開催の識別とレース番号など、対象内で一意になるキーを決め、馬券では券種と組合せも追加します。馬名表記だけに頼らず、提供資料の識別子があるなら対応を保存します。キーの作り方が変わった場合は、旧版と新版の関係を残します。
金額は円なのか100円単位なのか、オッズは倍率なのか払戻金なのかを列ごとに示します。走破時計も文字列のまま保存した原値と、秒へ直した数値を分けると変換を確認できます。空欄、0、取消、競走中止は同じ意味ではありません。数値にできなかった項目をすべて0へ置換すると、集計値を再現できても元の意味は保てません。
同じ名前の列には同じ定義を使うことが重要です。「的中」がレース単位か明細単位か、「投資」が返還前か返還後かを、データ定義に書きます。日本時間とUTCの時刻も、文字列の見た目だけで混ぜません。日付や締切との前後関係を判断する処理では、時刻の基準の違いが対象選定へ直接影響します。
架空例1:同じデータでも規則の版で結論が変わる
以下は追試のための架空データです。予想時点の単勝オッズが、レースAで4.9、Bで5.0、Cで5.1、Dで未取得だったとします。Aは不的中、Bは的中で説明用の確定払戻500円、Cは不的中です。各100円を買う規則を比較します。Dの結果はここでは採点へ使わず、オッズ未取得の扱いを確認するために置いています。
規則v1が「5.0以上、未取得は見送り」ならB・Cを買い、投資200円、払戻500円、回収率250%です。規則v2が「5.0より大きい、未取得は見送り」ならCだけで、投資100円、払戻0円、回収率0%です。「5倍を超える馬」のような曖昧な文章だけでは、境界のBをどちらへ入れるかが人によって違います。
この差はソフトの不具合とは限らず、不等号の定義が一致していないことが原因です。追試用資料には、しきい値、境界を含むか、欠損の扱い、購入額、適用開始日を保存します。v2を採用したなら、v1の結果を消して同じ検証名のまま置き換えず、規則の変更として残します。結果がよいからv1へ戻す行為と、仕様の誤記を直す行為も区別します。
さらに、見た目が5.0でも元の値が4.96だった場合、表示へ丸めてから条件を判定したか、元値で判定したかで対象が変わります。どちらを使うかは入手できる情報と設計次第ですが、精度の違う資料を同一条件として扱わないようにします。入力値の桁数と判定の順番まで説明すると、小さな差を追えるようになります。
架空例2:払戻表の重複で回収率が二倍になる
一致しない時は集計前の行数を比較する
別の架空例として、3レースで単勝を各100円買い、Aの確定払戻180円、Bは不的中、Cの確定払戻420円だったとします。購入総額300円、払戻総額600円、回収率200%です。ところが資料を二回取り込んだため、的中払戻表のAとCが各二行になった状態で購入表と結合すると、払戻合計1200円と誤って計算する場合があります。
その誤りを購入総額300円のまま採用すれば回収率400%になります。別の処理では結合後の購入行も重複し、投資を500円としてしまうかもしれません。割合だけを眺めても原因は分かりません。結合前の購入行が3件であること、払戻キーが一意であること、結合後に購入明細が何件へ増えたかを順に確認します。
公式払戻表で同じレース・券種・組合せの重複を検査することと、自分が同じ馬券を買い足した明細を削除することは違います。買い足しは投資として実在するため、明細の識別子で区別して残します。どちらの表で一意であるべきかを定義すると、安易な重複削除で正しい購入まで失うことを避けられます。
期待される600円は、180+0+420という手計算の表で確認します。全体プログラムが出した数字を、同じ結合処理で作った別表だけと比べても、誤りを共有しているかもしれません。小さな架空例を使い、期待する行数・購入額・払戻額を独立に示すことが、追試の手順を理解する助けになります。
学習と評価の分割そのものを保存する
機械学習や条件探索を含む検証では、どのレースを学習、調整、最終評価へ使ったかを一覧で残します。単に「8対2で分割」だけでは、誰が再実行しても同じ対象になるとは限りません。時系列の競馬データでは、未来を学習して過去を評価する形になっていないかを確認し、同一レースの馬が学習側と評価側へ分かれる問題も調べます。
scikit-learnのTimeSeriesSplitは時間順データの分割を扱いますが、各行を分割するだけで競馬のレース単位や公表時点の制約まで自動的に解決するわけではありません。公式のgapも評価前に除く標本数を表し、競馬の何日という期間を直接指定するものではありません。使うなら、レースのまとまりと日付の対応を分析者が確認します。
再計算用には分割設定だけでなく、実際の各区分のレースキーを保存すると確認しやすくなります。資料の行順が変わった場合も、同じレースを評価できるからです。前処理を学習する範囲や、過去走が参照できる基準日時も一緒に残し、対象の結果を特徴量へ混ぜていないことを検査します。時間順に並べただけで情報漏洩がなくなるとは考えません。
乱数と環境は固定した条件と試した条件を分ける
乱数を使う処理では、どの工程で乱数を使ったかを記録します。標本の抽出、学習、再標本化などは別の工程です。scikit-learnの公式文書はrandom_stateの指定による違いを説明しており、再実行の結果をそろえるには設定が重要です。ただし、ある一つの乱数設定でよい値が出たことを、設定によらず安定している証拠と考えてはいけません。
乱数の種だけでなく実行条件も残すようにします。言語やライブラリの版、主要な計算設定、データの並び順、実行した処理の識別番号が対象です。環境が変わっても完全に同一の値になると無条件には保証しません。比較可能な桁で一致を求めるのか、購入対象と円単位の精算は完全一致を求めるのか、確認する水準も決めます。
複数の乱数設定で頑健さを調べる場合は、試した設定と結果をまとめて保存します。最良の設定だけを「再現用」として配れば、同じよい数字は出せても、設定探しの影響が隠れます。一回の計算を再現する目的と、設定を変えても結果が大きく崩れないかを調べる目的は異なるので、表を分けると伝わりやすくなります。
結果が違うときは前の段階から差を探す
二つの計算が一致しない場合は、最後の回収率から逆算するより、対象一覧の差から調べます。元の対象件数、除外後件数、採用予想数、買い目数、購入総額、返還額、的中払戻、最終指標の順で比較します。最初に差が出た段階を特定できれば、後の計算をすべて疑う必要がなくなります。
- レースキーの差:片方だけにある競走を抽出する。
- 入力の差:同じキーの元値・取得版・時点を並べる。
- 判定の差:境界、同点、欠損、取消の規則を確認する。
- 金額の差:購入明細と払戻表の一意性、単位を確認する。
- 表示の差:内部値と丸めた掲載値を別に比べる。
資料の修正版で順位だけが変わる場合は、馬券の確定払戻まで同じ変更として再計算しないようにします。JRAは後の成績変更で払戻を変えないと定めています。成績評価の版と精算記録の版を区別しておけば、どちらの数値を更新したのか説明できます。変更履歴には、影響した件数と金額、結論が変わったかを記録します。
確認先:JRA|発売・払戻・返還のルール
追試可能な範囲と次の評価を明記する
公開する際には、元資料への案内、データ項目の定義、規則の版、処理手順、検算用の小例、公開結果との対応をまとめます。必ずしも全読者がプログラムを実行する必要はありませんが、文章から一意の手順へ落とせることが重要です。コードを載せても「対象は適宜除外」のような判断が残っていれば、同じ対象には到達できません。
サービスの独自ロジックなど、外部からすべてを再現できない部分がある場合は、その境界を明示します。確認できる出力の時点と版を保存し、その出力に基づく買い条件と精算を追えるようにする方法があります。内部の非公開算式を推測して、同じモデルを再現したと主張する必要はありません。
最後に、保存資料での計算が一致したら、固定した規則で新しい期間を評価します。過去を再計算できたことは記録の整備の成果ですが、将来の予想能力については別の観察が必要です。規則変更は新しい版として扱い、前の結果を引き継いだ実績のように見せません。追試を継続できる記録は、良い結果と悪い結果の両方を同じ手順で扱えるようにします。
よくある質問
コードだけ公開すれば再現性は確保できますか?
コード以外にも、同じ版の元データ、入力の定義、対象選定、設定、実行環境が必要です。手作業の除外や取得日時が分からなければ、同じコードでも対象は一致しません。共有可能な範囲を明示し、小さな検算例と記事の集計結果との対応を残してください。
乱数の種を固定すれば毎回同じ結果になりますか?
同じ処理と環境で結果をそろえる助けになりますが、種だけであらゆる環境差を解決するわけではありません。ライブラリ版、データの並び、計算設定も記録します。一つの種で同じ値が出ることと、複数設定で予想が安定していることも区別してください。
データが訂正されたら古い資料は消してよいですか?
追試を可能にするには、旧版と修正版の違いが追える形で残すのが有用です。どの行が変わり、件数や指標へ何が影響したかを記録します。順位の変更と馬券払戻の変更は同一とは限らないため、両方をまとめて上書きしないようにします。
同じ回収率を再現できれば予想の強さの証明になりますか?
計算が同じ資料と規則から再現できることは確認できますが、規則の有効性や将来の利益を保証するものではありません。未来の情報を使う誤りも同じように再現できてしまいます。情報時点を確認し、固定した規則を別の後の期間で評価することが必要です。
根拠・公式の確認先
本文の制度・用語の定義と、考察・架空例を区別しています。制度、発売、競走条件の変更は主催者の最新発表を優先してください。確認日:2026/10/25。


