A filter discovered in an archive has already benefited from seeing that archive. Testing it on the same matches mainly describes how well it fits the data used to choose it. A later, untouched period asks a more useful question: what happened after the method was fixed?
A walk-forward design repeats that sequence through time. The calendar example below is a proposed research design, not an OddsTips performance test.
Write the rule before the test period
Imagine using January to March to choose a home-win opening-price interval and the competitions to include. Freeze those decisions on 31 March. April becomes the first evaluation month. If you inspect April and then alter the interval, April is now part of development; it cannot remain an untouched test of the revised rule.
For the next round, you can develop a new version using information available through April and assess it in May. Keep each version's creation date and criteria. Never apply the final version backwards and describe all earlier months as if they had been tested prospectively.
Use availability time as well as match date
A fixture dated in March can still contain information that arrived after the intended decision point. A full-time score is not a pre-match feature. A closing price is not available when an opening-price decision is meant to be made. The stored row's date does not make every column historically available.
The scikit-learn documentation describes data leakage as using information unavailable at prediction time. For this research design, record the decision time and review every selected field against it. An undocumented timestamp is a limitation to report, not an invitation to assume early availability.
Keep one fixture on one side of the boundary
Rows from several bookmakers may describe the same match. Randomly splitting those rows can put one fixture into both development and evaluation sets. Group by fixture before allocating records. If a match is postponed, define whether its actual start time or another documented timestamp determines the period.
Football fixtures are not equally spaced observations. The standard TimeSeriesSplit documentation notes equal spacing when comparable fold durations are required. A hand-defined calendar split is often clearer for an initial football study: list the exact dates and retain the match counts, rather than treating a fixed number of rows as a fixed duration.
Report more than the pooled result
For each evaluation month, show eligible fixtures, complete records, selected fixtures and the defined outcome count. For an illustrative April sample, 12 occurrences among 20 selected fixtures is 60%; May's 6 among 15 is 40%. The combined 18/35 is about 51.4%, but it hides the month-to-month difference.
Neither this invented result nor a successful historical test promises future returns. The value of the design is procedural: it records what was known when, what changed and which observations were genuinely held back.
Sources and method
Original research examples and prompts, not observed match results or performance claims. Prepared with AI assistance; source statements, examples and calculations were checked.
- scikit-learn: data leakage and evaluation pitfalls — accessed 13 October 2026
- scikit-learn: TimeSeriesSplit — accessed 13 October 2026
