データ分析・統計・過去検証
期間をずらして予想法を検証する
競馬のウォークフォワード検証は、過去の期間で作った手順を次の期間で評価し、時間を前へ進めて繰り返す方法です。重要なのは、結果の良かった期間を選ぶことではなく、いつ何を更新し、その時点で使えた情報からどの案を出したかを残すことです。更新の予定を固定した架空の月別計画と、購入額が違う期間の集計例を使い、再学習と評価を混ぜない進め方を説明します。
読む時間の目安:約11分

期間を前へ進める目的は、更新する運用を再現すること
一度だけ古い期間と新しい期間を分ける検証と異なり、ウォークフォワードでは評価と更新を時点ごとに繰り返します。scikit-learnの時系列分割は、過去側を学習、次のまとまりを評価へ置く仕組みを説明しています。道具の名前を採るだけでなく、自分の予想手順の更新頻度へ対応させる必要があります。
例えば毎月最初に案の作成方法を更新し、その月は同じ方法を使う、という架空の運用を考えられます。月末の結果を見て、その月の最初から別の方法だったことにはしません。新しい情報で更新できるのは、その情報が使えるようになった後の対象です。
固定するのは、更新の手順とその時点の案
再学習する設計では、毎回の計算結果が同じである必要はありません。固定するのは、何をどの範囲で学び直し、何を評価へ出すかという手順です。結果を見て更新頻度や閾値を都度変える場合は、その判断も運用の一部として事前に定義するか、変更履歴へ明示します。
一般的な学習の説明として期間を分ける本稿は、特定サービスの内部学習を示すものではありません。競馬への適用例は全て架空です。モデルの再学習だけでなく、手作業で集計条件を更新する場合も、どの情報がいつ判断へ入ったかを確認するという考え方は共通します。
評価した後の更新と、評価する前の更新を取り違えないことが出発点です。完成した案を過去へ戻して当てはめた表と、各時点で実際に作れた案を順番に評価した表は、同じ検証ではありません。各回の版と利用範囲を残してください。
確認先:scikit-learn|時系列分割とgapの定義 / scikit-learn|予測時点で使えない情報と前処理の漏洩
架空例1:過去を積み重ねる方式と、入れ替える方式
説明用に一月から三月までを最初の作成期間、四月を最初の評価期間とします。次に五月を評価するとき、一月から四月を全部使う方式と、直近三か月の二月から四月だけを使う方式があります。前者は範囲を広げ、後者は期間を入れ替える設計です。どちらを選ぶかも結果前に決めます。
表は左右にスクロールできます。
| 回 | 評価月 | 範囲を広げる方式 | 直近3か月の方式 |
|---|---|---|---|
| 1回目 | 4月 | 1〜3月 | 1〜3月 |
| 2回目 | 5月 | 1〜4月 | 2〜4月 |
| 3回目 | 6月 | 1〜5月 | 3〜5月 |
説明用の月別計画です。三か月が適切、毎月更新が有利という推奨ではありません。
四月の評価が終わり、その結果を五月の作成へ使うことは、時点の順番を守っていれば設計として考えられます。ただし四月の評価成績は、四月の開始前に作った版の成績として保存します。五月の版を使って四月の成績まで書き換えると、評価した手順が変わってしまいます。
古いデータを増やす利点と、古い条件が混ざる問題を並べる
範囲を広げると対象数は増えますが、改修前のコースや古い取得仕様が残る可能性もあります。直近だけへ絞ると古い条件を減らせますが、対象件数が少なくなる場合があります。常に一方が優れると決めず、何を再現する設計か、対象数と条件の変化を記録してください。
結果が良かった月には三か月方式、悪かった月には全期間方式を後から当てると、運用を再現したことにはなりません。両方式を比較したなら、それぞれを固定して同じ評価対象で測った結果を残します。その比較から選んだ方式の最終確認には、さらに未使用の対象が必要です。
各回で、入力の固定・作成・予想・精算を順に行う
一回の手順は、利用可能な情報を締め、作成側の範囲を確定し、前処理と案を作り、その後の評価対象へ適用する流れです。評価の着順や払戻は案を固定した後に精算へ使います。全期間の結果を先に読み込んで候補を決める工程が残っていないかを、各回で点検してください。
- 今回の作成終了と、次に評価する開始・終了を確定する。
- その時点で利用できた資料の版と取得時刻を保存する。
- 作成側だけで前処理や計算値を決め、案の版を保存する。
- 評価対象へ同じ手順を適用し、選択や見送りを記録する。
- 結果確定後に精算し、次回に利用できる情報を確認する。
前処理の値も毎回の範囲へ合わせます。例えば欠損を埋める値を作成側から決める設計なら、四月の評価では一月から三月、五月では定義した更新範囲から計算します。六か月全体で中央値を作っておき、月別に行を分けるだけでは、未来の分布が混ざる可能性があります。
更新に使う結果の確定や取得が遅れる場合は、予定日までに揃わなかった対象をどう扱うかも定めます。入手したことにして補うのか、更新を待つのか、古い版を継続するのかで運用が変わります。実際の取得記録がない検証では、理想的な入手を仮定したことを明記してください。
新しい回の作成範囲へ入れた情報は、前の回の予想へ戻しません。同じ資料を後の学習に使えるようになったとしても、過去の評価が自動的にその資料を知っていたことにはなりません。時点ごとの案を残すことで、更新と書き換えを区別できます。
確認先:scikit-learn|予測時点で使えない情報と前処理の漏洩 / scikit-learn|時系列分割とgapの定義
架空例2:期間の回収率を単純平均すると、全体とずれる
三つの評価期間について、購入と払戻を架空に置きます。第一期は千円購入で千百円、第二期は二千円購入で千六百円、第三期は千円購入で千三百円とします。各回収率は百十、八十、百三十パーセントですが、購入額は同じではありません。
表は左右にスクロールできます。
| 期間 | 購入額 | 払戻額 | 回収率 |
|---|---|---|---|
| 第1期 | 1,000円 | 1,100円 | 110% |
| 第2期 | 2,000円 | 1,600円 | 80% |
| 第3期 | 1,000円 | 1,300円 | 130% |
| 合計 | 4,000円 | 4,000円 | 100% |
全て説明用の架空金額です。返還はない設定で、利益を示す実績ではありません。
三つの率を単純平均すると、百十と八十と百三十の合計を三で割り、約百六・七パーセントです。一方、全体は払戻四千円を購入四千円で割るため百パーセントです。購入額の大きい第二期の重みが違うので、一致しません。全体の回収率には金額の合計から計算した値を使います。
率の集計方法と、購入ルールの変更を分ける
第二期だけ購入額が大きくなった理由も記載します。対象件数が多かったのか、一件の配分を増やしたのかでは意味が違います。比較する手順の優劣を調べるなら、配分を固定した比較と、運用として配分を変えた結果を分けて残すと、何が数字へ影響したかを確かめやすくなります。
この架空表では全体が百パーセントでも、全期間が安定していたわけではありません。八十パーセントの期間と百三十パーセントの期間があり、対象の違いや少数の配当への依存は別に確認が必要です。全体の率だけを残して、期間ごとの損失やばらつきを消さないようにします。
重なった評価期間を、別の実績として二重に数えない
期間をずらす際、評価を四月から六月、次を五月から七月とすると、五月と六月が重なります。複数の版を同じ対象で比較する目的なら記録できますが、その二つを足して評価件数を増やすと同じ競走や購入を重複計上します。対象の識別情報と版を分けて保存してください。
全体の運用成績へ集約するには、同じ対象に複数の案がある場合にどれを使うかを、事前に決める必要があります。最も新しい版を使うのか、固定した更新日の版を使うのかを定義し、結果が良かった案を競走ごとに選んだ合計とは区別します。後から最良案だけを残すと実運用とは違う成績になります。
競走のまとまりを保ってから、期間を切る
一競走に複数の馬の行がある表は、同じ競走を作成と評価へばらさないようにします。行数だけで境界を決めると同じ日の途中や同じ競走の途中で切れる場合があります。競走日、場、競走番号などの識別情報で対象を確定し、定義した時点の順番へ並べます。
TimeSeriesSplitが示す等間隔標本の前提も、馬別の生の行へそのまま置き換えられません。開催日ごとに件数が違い、同じ行数でも同じ時間幅にならないからです。何日、何競走、何購入を評価したかを別々に数え、道具の初期設定を使ったことだけで比較条件が揃ったとはしません。
空白を設ける場合も単位を明記します。公式のgapは除く標本数で、暦の日数を直接示しません。結果の取得を待つ必要があるなら、どの情報が何時点で利用可能かをもとに時間の条件を定義します。七行を七日と読み替えるような設定は避けてください。
確認先:scikit-learn|時系列分割とgapの定義 / scikit-learn|予測時点で使えない情報と前処理の漏洩
更新頻度を結果で選び直すと、もう一段の探索になる
毎週更新、毎月更新、三か月更新を同じ過去で比べて一番良かったものを採る場合、その比較も条件選びです。ウォークフォワードという名称を使っても、全ての結果を見て最良の更新計画を選んだ事実は消えません。固定した手順の評価と、その評価を利用した手順選びの役割を分けます。
途中で悪い成績が続いたため更新予定を変えたなら、変更した時点と理由を残します。その後の成績を測ることはできますが、最初からその計画だったことにはしません。旧計画の結果と、新計画へ変更した後の結果を識別し、運用としてどんな判断をしたかを説明します。
機械学習の教材が学習・検証・最終テストを分けるのは、条件選びと最終確認を混ぜないためです。時点を進めながら繰り返す設計でも同じ注意が残ります。複数回の評価結果で方式を選んだなら、選んだ後の未使用期間を別に確保するなど、どこを最終確認とするかを示してください。
繰り返した回数が多いことだけで、将来の利益は証明できません。評価対象が重なっていないか、更新に未来を使っていないか、選択のために何度結果を見たかを確認します。期間数と独立した情報の量は、同じものではありません。
公開する検証には、各回の入力と版を追える表を添える
各回について、作成範囲、評価範囲、情報の締切、予想の版、対象数、購入額、払戻額を残します。対象がなかった回も削除せず、該当なしとして記録してください。件数がゼロの期間と、記録が欠けた期間を同じものとして埋めないことが必要です。
コース改修や取得項目の変更があれば、どの回から影響したかを記載します。全期間で同じ入力が使えたと仮定した比較なら、その仮定を示します。変更に合わせた版だけでなく、比較条件を統一した別集計を作った場合も、どちらが実際の運用を表すかを明確にします。
訂正が生じたときは元の版を残し、影響する回をまとめて再計算します。成績が良くなる回だけ更新せず、同じ手順で全てを確認します。最終的な数字の横に、更新履歴と評価範囲へ戻れる情報を置くことで、他の人もどの時点の判断を測ったかを確かめられます。
各回の開始時点で保存した案と、結果確定後の精算表を別に残すと、後から同じ名前の手順を更新しても元の評価をたどれます。説明を修正した日と、実際に手順を変更した日も分けて記録し、公開文の更新だけで過去の案まで変わったように見せないようにします。
よくある質問
競馬のウォークフォワード検証とは何ですか?
過去で作った手順を次の期間で評価し、時間を進めて更新と評価を繰り返す方法です。各時点で使えた情報を守り、作成範囲や更新条件を記録します。後から良かった期間の案だけを選んだ成績とは区別してください。
評価が終わった月の結果を、次の作成に使ってもよいですか?
次の作成時点で利用可能になっており、更新計画に沿うなら使う設計は考えられます。ただし前の月の成績は、その月の前に作った版の評価として残します。新しい版で前の評価まで書き換えることとは別です。
全期間を使う方式と直近だけの方式は、どちらがよいですか?
一律に決まりません。古いデータを増やせば件数は増えますが、仕様の違う対象が残る場合があります。直近だけでは件数が減る場合もあります。どちらをどう比較し、何を見て採用したかを記録して未使用期間で確認します。
月別回収率の平均を、全体の回収率としてよいですか?
月の購入額が違う場合、率の単純平均は全体と一致しません。全体は払戻額の合計を購入額の合計で割って計算します。期間ごとの数字も残し、特定の好成績だけが合計を支えていないかを別に確認してください。
根拠・公式の確認先
- scikit-learn|時系列分割とgapの定義
- scikit-learn|予測時点で使えない情報と前処理の漏洩
- Google|学習・検証・テストデータの分離
- JRA-VAN|回収率の計算と的中率の集計単位
- Google|過学習と未使用データへの汎化
- JRA|公式競走情報・確定結果
本文の制度・用語の定義と、考察・架空例を区別しています。制度、発売、競走条件の変更は主催者の最新発表を優先してください。確認日:2026/10/25。



