データ分析・統計・過去検証
競馬データを時系列で分割する方法
競馬データを時系列で分割するとは、過去の情報から作った予想手順を、その後の期間で確認できるように分けることです。行を日付順に並べるだけでは足りず、同じ競走の馬の行をまとめること、入力を作れる時点を守ること、条件選びと最終確認を分離することが必要です。ここでは固定した一回の期間分割に絞り、架空の年別計画と競走単位の例を使って、何をいつ決めるかを説明します。
読む時間の目安:約11分

日付を並べる前に、予想を作る時点を定義する
将来の競走へ使う予想手順を調べるなら、後に得た情報で前の期間を学習しない設計が基本になります。scikit-learnのTimeSeriesSplitも、通常の分割では未来で学習し過去を評価する問題が起こり得ると説明しています。本稿の年や件数は全て説明用で、実在する競走の検証結果ではありません。
最初に「どの日までの成績を使って、どの時点で案を固定するか」を文章にします。競走日だけでは、当日の発走後に確定する結果と、予想前に公表された情報が同じ日付になります。年や月で分ける設計でも、それぞれの対象の予想時点を守る必要があります。
分割には、順番と役割の二つがある
期間が古いか新しいかという順番と、その期間を何のために使うかという役割は別です。古い期間で条件を作り、次の期間で候補を比較し、最後の期間で固定した案を確認する、というように両方を書きます。名称だけ学習・検証・テストと付けても、結果を見て使い方を変えれば役割も変わります。
同じ年の中にも開催の順番があります。複数場の同日競走を扱う場合、日単位で固定するのか、発走順に逐次更新するのかを明示してください。朝に決める予想へ午後の結果を入れることと、午後の案を作り直すことは別の運用です。自分が再現したい手順に合わせて境界を決めます。
日付が過去でも、その値が予想時点に使えたとは限りません。現在の通算成績や後から修正された分類を過去へ付けると、期間の並びを守っても未来情報が残ります。分割表と一緒に、各入力を作った情報の締切も記録します。
確認先:scikit-learn|時系列分割とgapの定義 / scikit-learn|予測時点で使えない情報と前処理の漏洩
架空例1:作成・条件選び・最終確認を別の年に置く
説明のため、二〇二一年を作成、二〇二二年を条件選び、二〇二三年を最終確認とする固定計画を考えます。これは推奨する年数や万能な配分ではありません。期間の役割が何を意味するかを示す架空例です。実際には対象数、開催の種類、情報を利用できた時点に合わせて計画します。
表は左右にスクロールできます。
| 期間 | 役割 | ここでしてよい判断 | 後へ渡すもの |
|---|---|---|---|
| 2021年 | 作成 | 予想手順や前処理を作る | 候補となる手順 |
| 2022年 | 条件選び | 候補を比較して案を選ぶ | 固定した条件と版 |
| 2023年 | 最終確認 | 固定した案の成績を測る | 変更前の評価記録 |
年数や比率を勧める表ではありません。実際の競走成績も含みません。
二〇二二年を見て人気帯の閾値を変えたなら、その年は条件選びに使った期間です。二〇二三年を初めて開く前に、候補の決め方、配分、除外、集計指標を固定します。最終確認の結果が悪かった後だけ特定の対象を除くと、確認ではなく追加の調整になります。
最終確認で発見した課題は、新しい版の出発点にする
二〇二三年の結果から改善案を思いついたら、その内容を新しい版として残せます。ただし同じ年の数字で改善版を選ぶと、その年は改善版にとって未使用ではありません。前の版の最終確認結果と、新しい版の探索結果を同じ評価として扱わないようにします。
作成側を長く取れば必ず良いわけでもありません。古い制度や改修前のコースが混ざる場合、現在とは条件が違う可能性があります。期間を長くする判断には、件数が増える利点と、対象の仕様が変わる問題の両方を添えます。年だけを合わせて同質のデータと決めつけません。
架空例2:同じ競走の馬を、学習と評価へ分けない
一つの競走に四頭の行がある架空表を考えます。一行目と二行目を学習、三行目と四行目を評価へ無作為に分けると、同じ競走が両方へ入ります。競走全体の情報を共有しているため、未知の次の競走を評価する設計とは異なります。一行が馬なのか競走なのかを、最初に確認してください。
表は左右にスクロールできます。
| 競走 | 馬の行 | 不適切な行分割の例 | 競走単位の分割例 |
|---|---|---|---|
| 競走A:前の日 | A1〜A4 | A1・A2を学習、A3・A4を評価 | 4行まとめて作成側 |
| 競走B:後の日 | B1〜B4 | B1・B2を学習、B3・B4を評価 | 4行まとめて評価側 |
少数の架空行で境界を説明する表です。この件数で性能を検証できるという意味ではありません。
同じ競走をまとめた後も、時間の順番を確認します。競走を無作為に分けただけなら、後の日の結果で前の日の予想を作る可能性が残ります。まず競走を識別する組を固定し、そのまとまりへ予想時点や日付を付け、過去から未来へ分けるという二段階で点検します。
境界の日に同時刻や同日開催がある場合も、機械的に行数の半分で切りません。例えば一日単位の予想を想定するなら、その日全体を同じ側へ置く設計が考えられます。逐次更新する設定なら時刻と情報の公表時点を別に確認します。日単位か競走単位かという前提を記載してください。
一頭の馬が異なる時期に再び出走することは、同じ競走の重複とは別です。過去走から次走を予想する目的なら、過去走が作成側、次走が評価側となることがあります。ただし次走以降の成績で作ったプロフィールを過去走へ結合しないよう、馬の識別子と情報の時点を同時に確認します。
確認先:scikit-learn|時系列分割とgapの定義 / scikit-learn|予測時点で使えない情報と前処理の漏洩 / Google|学習・検証・テストデータの分離
欠損補完や尺度の計算も、作成側で行う
全期間の平均や中央値を先に作ってから期間を分けると、評価側の分布が変換へ入ります。scikit-learnの公式説明は、前処理の学習を学習データに限り、評価側へ同じ変換を適用するよう案内しています。行を分ける工程と、入力を整える工程の順番にも注意が必要です。
変換の作成範囲を、分割表へ一行加える
例えば二〇二一年の数値だけで補完値を決めたなら、その計算範囲と値の版を保存します。二〇二二年と二〇二三年の欠損へ適用するとき、両年を含めて補完値を更新しません。後の期間で変換を変えるなら、どの時点で何を使って更新する運用なのかを別に定義してください。
項目を採用する判断にも同じ確認が必要です。全期間の着順との関係を調べてから、成績の良い項目だけを選び、その後に年別へ分けると、評価側の結果が項目選びに使われています。入力の行を分けても、項目を選ぶために使った範囲が全期間なら、完全に未使用の評価ではありません。
前処理後の表だけでなく、元の項目と欠損の状態も残します。未取得、対象外、値がゼロ、実績なしは意味が異なり得ます。期間によって取得できる項目が増えた場合、その変化を隠して同じ入力が全期間で存在したことにしないようにしてください。
分割後の処理でも、未来を参照すれば漏洩は残ります。別の集計表から最新値を読み込む工程があれば、その作成範囲までさかのぼって確認します。完成した表の日付順だけを見るより、各列がどの資料と締切から作られたかを追える状態が必要です。
確認先:scikit-learn|予測時点で使えない情報と前処理の漏洩 / Google|学習・検証・テストデータの分離
競馬の行数と、経過日数を同じものとして扱わない
TimeSeriesSplitの公式説明は、各分割の評価時間幅を比較できる前提として、標本が等間隔であることを示しています。競馬の生の馬別行は、開催日ごとの競走数や頭数が違います。行を百個ずつ分けても、同じ日数、同じ競走数、同じ開催条件になるとは限りません。
そのため、道具の名称を採用するだけで時系列検証が完成したと考えないようにします。日付や競走のまとまりを作り、開始・終了、競走数、馬別行数を別々に確認してください。同じ一か月でも開催や対象の種類が違えば、集まる件数や条件の組合せは変わります。
表は左右にスクロールできます。
| 記録項目 | 何を数えるか | 混同しないもの |
|---|---|---|
| 経過期間 | 開始日から終了日まで | 行数の多さ |
| 競走数 | 対象の識別子の件数 | 馬の延べ行数 |
| 馬別行数 | 対象競走の馬の行 | 独立した競走数 |
| 購入件数 | 定義した購入の単位 | 競走数や点数 |
それぞれの単位を定義してから件数を集計します。
同じ公式道具のgapは、学習側の末尾から評価前に除く標本数を表すもので、日数そのものではありません。馬別行でgapを七にしても七日間の空白にはなりません。情報が確定するまでの待ち時間を表したいなら、時刻や日付を使った除外条件を別に設計し、その意味を明記します。
境界に空白を置けば全て安全というわけでもありません。後日訂正された成績や、全期間で作った集計値が入力へ残れば別の問題です。なぜ空白が必要で、どの情報の遅れや重なりを防ぐのかを先に説明し、適当に日数を増やしたことを正しさの証拠としないようにします。
競走単位へまとめた表を使う場合でも、同じ競走の更新前後を別の対象として数えないようにします。予想の版を比較するために複数行を保存することと、競走の件数を増やすことは別です。一件の対象に何個の案があり、どれを最終評価へ用いたかを識別してください。
確認先:scikit-learn|時系列分割とgapの定義 / scikit-learn|予測時点で使えない情報と前処理の漏洩
分割ごとの件数と役割を、成績の横へ残す
結果をまとめる際は、作成、条件選び、最終確認それぞれの開始と終了、競走数、対象数、除外、入力の版を示します。最終確認で対象が少なかった場合も、そのまま記録してください。件数を増やすために結果を見た過去の期間を付け足すと、未使用という条件が変わります。
的中率や回収率は期間ごとに金額と件数を確認します。期間の回収率を単純平均する方法と、全購入額に対する全払戻額で計算する方法は、購入額が違えば一致しません。どの数字を集約したかを明記し、条件選びの成績を最終確認の数字へ混ぜた合計だけで説明しないようにします。
最終確認で悪かった年を除いて、良い年だけを未使用期間として残すこともできません。対象外とする根拠が事前に決まっていたのか、結果を見て変更したのかを記録します。手順の不備を訂正する場合は影響する全対象へ適用し、訂正前の版も識別できるようにしてください。
一回の時系列分割は、一つの期間設計に対する確認です。それだけで全ての季節や将来の制度変更に対応できると断定しません。次に期間をずらす場合も、新しく使った結果と固定した判断を明示します。過去に良い数字を得ることより、次の対象へ同じ手順を適用できることが目的です。
評価に必要な過去の時点情報が保存されていなければ、完全な再現はできないと書くことも必要です。現在の資料から近似した検証と、当時の取得記録をそのまま使う検証を同じものとして扱わず、どの仮定を置いたかを読者に伝えてください。
分割の境界を変えて成績が良くなった場合も、その変更を記録します。例えば評価開始月を一か月後ろへずらせば、対象が変わります。最初の月の結果が悪かったから外したのであれば、新しい期間の選択に結果を使っています。日付を変えただけという説明で、追加の条件選びを省略しないようにします。
よくある質問
競馬データは、無作為に分けて検証してはいけませんか?
将来の予想を再現する目的では、未来の結果で過去を学習する分割を避ける必要があります。また同じ競走の馬別行を両方へ混ぜないようにします。無作為分割が何を評価する設計なのかを説明し、時系列の運用実績と同じものとして扱わないでください。
学習とテストを何割ずつに分ければよいですか?
一律に正しい比率はありません。対象数、開催のまとまり、季節性、仕様変更、条件選びの手順によって計画します。作成・条件選び・最終確認の役割を先に決め、各期間の件数と入力を利用できた時点を記録してください。
同じ馬が学習期間と評価期間に出走してもよいですか?
過去走を使って次走を予想する目的なら、異なる時期の出走が両方にある場合があります。同じ競走の重複とは分けて考えます。ただし次走以降の結果を含む最新プロフィールを過去へ付けると未来情報が混ざるため、時点の確認が必要です。
TimeSeriesSplitのgapを7にすると、一週間を空けられますか?
gapは除外する標本数で、日数を直接示しません。馬別行の七件は七日間とは異なります。経過時間を空ける目的なら日付や時刻で設計し、競走単位のまとまりと情報の確定時点も別に確認してください。
根拠・公式の確認先
本文の制度・用語の定義と、考察・架空例を区別しています。制度、発売、競走条件の変更は主催者の最新発表を優先してください。確認日:2026/10/25。



