We keep score on the weather forecast, the same way we keep score on the news
Every daily high Environment Canada publishes for our 25 tracked cities is stored with the moment it was issued, then checked against the highest temperature the station actually recorded. The forecasts are Environment Canada’s; the scoring and the measurements are ours.
How accuracy decays with lead time
Bars show the average miss on the daily high, in degrees Celsius. Each carries its own sample size, so a thinly-checked lead time is visible rather than presented with the same confidence as a well-sampled one. The dashed line is persistence — the naive forecast that the target day turns out like the day this forecast was issued, computed independently from the observation record. A forecast bar sitting below the dashed line at that lead time is beating the naive guess; one at or above it is not adding information. Same-day (TODAY) has no persistence baseline: comparing a day to itself is not a real test.
Accuracy by city
| City | Checks | Average miss | Within 3° | Direction of error | Reads |
|---|---|---|---|---|---|
| Kelowna BC | 618 | ±2.21° | 74% | +0.33° | Forecast over-calls the high |
| Windsor ON | 686 | ±1.95° | 76% | +0.33° | Forecast over-calls the high |
| Fredericton NB | 606 | ±1.95° | 76% | +0.06° | No consistent direction |
| Saint John NB | 602 | ±1.92° | 82% | -0.35° | Forecast under-calls the high |
| London ON | 675 | ±1.89° | 80% | +0.59° | Forecast over-calls the high |
| Calgary AB | 683 | ±1.88° | 80% | +0.44° | Forecast over-calls the high |
| Regina SK | 661 | ±1.82° | 82% | +0.38° | Forecast over-calls the high |
| Whitehorse YT | 625 | ±1.82° | 83% | +0.63° | Forecast over-calls the high |
| Saskatoon SK | 650 | ±1.80° | 84% | +0.65° | Forecast over-calls the high |
| Toronto ON | 655 | ±1.80° | 85% | +0.08° | No consistent direction |
| Hamilton ON | 655 | ±1.75° | 84% | +0.22° | No consistent direction |
| Winnipeg MB | 642 | ±1.71° | 83% | +0.52° | Forecast over-calls the high |
| Edmonton AB | 620 | ±1.67° | 86% | +0.10° | No consistent direction |
| Yellowknife NT | 645 | ±1.66° | 84% | -0.34° | Forecast under-calls the high |
| Halifax NS | 600 | ±1.64° | 86% | +0.03° | No consistent direction |
| Québec QC | 598 | ±1.63° | 83% | +0.05° | No consistent direction |
| Montréal QC | 600 | ±1.60° | 86% | +0.32° | Forecast over-calls the high |
| Moncton NB | 595 | ±1.60° | 86% | +0.10° | No consistent direction |
| Iqaluit NU | 637 | ±1.60° | 86% | -0.75° | Forecast under-calls the high |
| Ottawa ON | 655 | ±1.57° | 88% | +0.72° | Forecast over-calls the high |
| Charlottetown PE | 590 | ±1.50° | 89% | +0.20° | No consistent direction |
| Sydney NS | 600 | ±1.49° | 90% | +0.10° | No consistent direction |
| Victoria BC | 595 | ±1.40° | 90% | +0.26° | Forecast over-calls the high |
| Vancouver BC | 620 | ±1.37° | 91% | +0.85° | Forecast over-calls the high |
| St. John's NL | 615 | ±1.34° | 90% | +0.01° | No consistent direction |
Lead times one to five days; same-day forecasts are excluded because they are a much easier problem and including them flatters every city equally. A colour never stands alone here — every bias carries its number and the words cold or warm.
Worst call this month
Forecast 6.0°C at 0 days out. Observed 13.6°C.
One row per date and city — when a miss showed up at more than one lead time, only the shortest (most recent) call is counted here, so a single bad day is not tallied more than once.
How this is measured
Average miss is the mean absolute difference between the forecast high and the observed high — how far off, ignoring direction. Direction of error is the mean signed difference — whether the forecast leans cold or warm. Both are shown because they answer different questions: a large miss with no direction is noise, while a small miss with a steady direction is a correctable systematic error. A day we did not observe produces no comparison at all; it is never scored as a perfect forecast. The persistence baseline above comes from the same observation series as everything else on this page — it is not a claim from any forecaster, just the naive answer of "no change".
Our record begins 18 August 2026 and covers 64 days. That is enough to see a bias, not enough to call it seasonal — the window is stated here rather than left for the reader to assume, and it deepens by a day every day.
Explore the developer API →A forecast without a scorecard is a claim. Everything above is the scorecard, including the parts that do not flatter the model.