Inspiration

Eight points from five matches can look like good form. For Arsenal’s final archived five, it is above one declared expectation and below another. A five-match total needs an explicit comparison before it becomes a useful review signal. FixtureLens makes that assumption visible and lets a reviewer inspect every earlier match behind it. It is a historical research tool, not a live forecast or a causal measure of team quality.

What it does

Choose an archive date, an observed club and either League baseline or Fixed Elo. The app uses only matches strictly before that date, shows the last five actual and expected points, and displays their residuals. Fewer than five observations produces an explicit unavailable state. Clubs with old observations retain their last-match date and age rather than being presented as current league members.

Each evidence row opens the exact earlier training list. A JSON export binds the club, date, selected model, probabilities, source hashes and contributing match IDs. The 390px layout keeps the controls readable and lets the evidence table scroll horizontally.

One reproducible example is Arsenal's final five archived matches: eight actual points correspond to a +0.19 mean residual against the league baseline, but a -0.33 mean residual against Fixed Elo. The sign reversal illustrates assumption sensitivity. It is not proof that either model measures true skill.

Why this can help a sports analyst

A coach-facing analyst can use the dashboard to triage a recent-form claim before discussing it in a review meeting: select the historical cutoff, compare the two declared expectations, inspect the five contributing matches, and export the exact evidence. A sign change is a prompt to explain the assumption and review the underlying matches rather than label the team unconditionally in or out of form.

The prototype supports that review workflow; no coach deployment or measured decision improvement is claimed. These descriptive residuals do not identify tactical causes, injuries or player quality, and should not determine team selection by themselves.

How we built it

The Python engine follows a plan frozen before real-data evaluation. Both models predict an entire date batch before updating from that date's outcomes. The default baseline uses earlier home/draw/away frequencies with fixed pseudocounts. The Elo comparison uses declared fixed parameters and earlier-data draw bins. React and Vite render the real computed archive; the interface is HTML, CSS and SVG rather than a screenshot.

The two English league season files are pinned to openfootball/football.json commit e6744429ee395bc86f247348c6184bb08d4eb361 under the publisher's CC0 license. The source package includes the unchanged plan, engine, input files and an offline reproduction command. AI assisted the concept, implementation, tests and documentation. Image generation supplied the design reference; no generated image is used as the functioning interface.

What we measured

The 2023-24 season supplies earlier history. Sequential evaluation on all 380 matches in 2024-25 gives unscaled multiclass Brier loss 0.65634 for League baseline and 0.60749 for Fixed Elo, where lower is better and the metric range is 0 to 2. No parameter was selected using this evaluation, and the baseline remains the default despite the comparison result.

This is one retrospective league season. Statistical significance and future performance are not established. Source scores have not been independently reconciled against official league records. There are no injury, xG, odds or player-tracking inputs. Leave-one-out mean ranges describe sensitivity, not confidence intervals.

Challenges and verification

Preventing same-date leakage required batching predictions before state updates. Twelve Python tests cover chronology, validation and scoring; seven frontend tests compare all 23 default club windows with the frozen engine and check date boundaries and export provenance. Offline reproduction verifies all 760 predictions and 23 windows. A separate review recomputed the probabilities and Brier losses and checked 10,580 club/date/model combinations between the Python engine and browser analysis. After source publication, the complete 24-file remote readback matched the reviewed SHA-256 manifest; the downloaded source passed the same 12 Python tests, seven frontend tests and offline reproduction. Browser checks found and fixed a date-input refresh defect, then verified missing-history and empty-date states, stale observations, model switching, the full training inspector and a real exported JSON file.

What's next

The next research steps are a broader independently checked data source, more seasons and explicit uncertainty studies. Any new model or tuning would need a new prospective evaluation plan. This draft does not claim organizer eligibility approval, an award, a pilot study or completed submission.

Share this project:

Updates

Submission history