# A free weather model does not beat temperature contract prices

> Trading daily-high temperature contracts against a bias-corrected 2-day-old forecast lost 3.26 c per contract net (95% interval -5.21 to -1.40 c); the price was the better forecast (0.1125 vs 0.1466, lower wins).

E550 · Verdict: KILL · Cause: No signal · Market: Prediction markets · Mechanism: Behavioural · Horizon: 1d · Tested: October 2026

Source: https://alphanotfound.eu/experiments/E550-weather-forecast-vs-event-contract-prices

Daily-high temperature contracts pay out on whether a city's high lands in a given degree range. The belief: recreational bettors anchor on rounded phone-app forecasts, so a station-corrected public weather model should price the ranges better. We built that forecast without look-ahead for seven US cities and bought whichever side it favoured by at least 5 c after fees. Across 1,654 trades the average result was -3.26 c per contract, and none of the seven cities was positive. On all 2,617 quoted contracts the market price had the lower Brier score (a standard accuracy score for probabilities, lower is better): 0.1125 against 0.1466 for the model.

## Key numbers

- **Net per contract:** -3.26 c (n 1,654 trades; 95% interval -5.21 to -1.40 c)
- **Cities with a positive mean:** 0 of 7 (rejection line: fewer than 4)
- **Brier score, market mid:** 0.1125 (lower is better; model 0.1466)
- **Median trade:** -4.3 c (worst single trade -92.5 c)

## The idea being tested

**Belief:** Temperature contracts are priced by amateurs who read a rounded phone-app forecast; a station-specific, bias-corrected model forecast knows better and can be traded against the price.

**Why people believe it:** People argue that casual bettors take the headline forecast from an app, rounded to the whole degree and not corrected for how the official weather station tends to read against the model. A forecast corrected for that station bias should assign different probabilities to the one-degree and two-degree contract ranges than the crowd does.

**Why it would persist:** The forecast is free and public, but turning it into probabilities for each range needs station-level calibration that casual bettors do not do. Weather bots that could do it exist, but the argument is that they may not cover every city-day or range.

## How it was tested

For each of seven US cities we took a public weather-model forecast issued about two days before the day in question, so it was available before the trading decision. We corrected it with that city's recent forecast errors against the official station, turned it into a probability for every temperature range, and looked at the contract prices at 16:00 UTC on the day before. If the model's probability beat the price by at least 5 c after the fee, we bought that side and held to settlement. We also scored the model and the market price against the actual outcomes on every quoted contract.

**Pre-registered:** yes

**Data:** Daily-high temperature contracts for 7 US cities (New York, Chicago, Miami, Austin, Denver, Los Angeles, Philadelphia): 1-hour bid/ask candles and settlement values (a US event-contract exchange, public API; 1-hour candle ending 16:00 UTC on the day before the contract day; 2026-08..2026-10 (quotes); settlement values from earlier history used only for calibration); Hourly 2-metre temperature forecast issued about 48 hours before each hour, at each station's coordinates (a public weather-model archive of past forecast runs; hourly; covers the calibration history and the quote period)

**Universe:** Seven daily-high series (stations in New York Central Park, Chicago Midway, Miami, Austin, Denver, Los Angeles, Philadelphia); 2,617 two-sided quoted contracts on 465 city-days. A few legacy contracts with a different ticker format were dropped.

**Signal:** Forecast F = maximum of the hourly 2-day-ahead forecast over local hours 0-23 of the contract day. Per city, residuals (observed high minus F) from days up to two days before the contract day, last 120 days, at least 20: mu = F + mean residual, sigma = residual standard deviation (floor 1.0 F), from about 1,800 settled days per city (residual sd about 4 F). The model probability for an integer-degree range is Phi((k_hi + 0.5 - mu)/sigma) - Phi((k_lo - 0.5 - mu)/sigma); for open-ended contracts the tail beyond the strike.

**Execution:** Decision at 16:00 UTC on the day before. Buy YES at the ask if q - ask - fee >= 0.05, or buy NO at (1 - bid) if (1 - q) - (1 - bid) - fee >= 0.05, where q is the model probability. One contract per qualifying market, held to settlement; both sides taken at the quote, so the spread is paid.

**Costs:** Fee 0.07 x p x (1 - p) per contract at the traded price, plus crossing the spread (median quoted spread 1 c).

**Controls:** The market mid price as the benchmark forecast: Brier score of the mid versus the model on all quoted contracts, whether or not traded. Bootstrap by city-day cluster (4,000 resamples); first versus second half of the trades by date; sign of the mean in each city.

**Sample split:** Calibration always uses only days before the contract day (a rolling window); there is no separate holdout, and the whole quote period is the test.

**Pass criterion:** Not stated in advance as a separate pass line; the rejection rule below was pre-registered.

**Kill criterion:** Market-mid Brier score at or below the model's; or net mean at or below 0; or 95% interval includes 0; or fewer than 4 of 7 cities with a positive mean.

**Power:** Not computed in advance. With 1,654 trades on 458 city-days the 95% interval is about 3.8 c wide.

## Result

**Why it was rejected:** The result met three of the four pre-registered rejection criteria: the market's Brier score was lower than the model's, the net mean was below zero, and no city had a positive mean. The fourth, an interval that includes zero, was not met because the whole interval is negative.

**Observations:** 1,654

**Net mean:** -3.26

**95% interval:** -5.21 to -1.4

**Median:** -4.3

**Worst:** -92.5

- On all 2,617 quoted contracts (465 city-days) the market mid price had a Brier score of 0.1125 and the model 0.1466; a lower score is better, so the price was closer to the outcomes.
- The model disagreed with the price by at least 5 c after fees on 1,654 contracts. Net per contract was -3.26 c (95% interval -5.21 to -1.40 c); the median trade was -4.3 c and the worst lost 92.5 c.
- Before the exchange fee the same trades averaged -2.27 c, so the model's disagreements were already unprofitable at the quote, and the fee took a further 0.99 c.
- The first half of the trades by date averaged -4.23 c and the second half -2.28 c: negative in both.
- No city had a positive mean. Per-city means ranged from -5.93 c (Chicago) to -0.26 c (Miami).

### The price scored better than the model (Brier score (lower is better))

Mean squared error between the probability and the 0/1 outcome over all 2,617 quoted contracts. The market mid price has the lower error, so the model was the weaker forecast on the same contracts.

|   | Market mid price | Bias-corrected model |
| --- | --- | --- |
| All quoted contracts | 0.1125 | 0.1466 |

### Trades against the price lost money (c per contract)

Mean net result per contract across the 1,654 trades, with a city-day cluster bootstrap 95% interval. The whole interval is below zero.

|   | Mean | 95% low | 95% high |
| --- | --- | --- | --- |
| All trades, net of fee (n 1,654) | -3.26 | -5.21 | -1.4 |

### No city was positive (c per contract)

Mean net result per contract in each city. All seven are negative, against a pre-registered requirement of at least four positive cities. Per-city means are noisy: none, including Miami (-0.26 c), is distinguishable from zero.

|   | Net per contract |
| --- | --- |
| New York (n 215) | -3.84 |
| Chicago (n 250) | -5.93 |
| Miami (n 212) | -0.26 |
| Austin (n 244) | -2.18 |
| Denver (n 247) | -3.13 |
| Los Angeles (n 224) | -4.37 |
| Philadelphia (n 262) | -2.83 |

## Interpretation

**Why it failed (interpretation, not established):** A likely reason is that traders use fresher model runs than a forecast issued two days earlier, which would explain why the price scores better than the model. The test did not observe what information traders used, so this is a hypothesis.

**Lesson:** A forecast built without look-ahead still has to be judged against the market's own forecast, not only against the outcomes. When a model's probabilities differ from the price by 5 c or more, the first thing to test is whether the model or the price scores better on the same contracts; here it was the price, and the trades lost money.

**Scope:** Covers seven US cities' daily-high contracts, one forecast model run about two days old, one entry time (16:00 UTC on the day before), a 5 c entry threshold, and about two months of quotes.

## Reproducibility

**Steps:** 1) Pull settled daily-high contracts and the 1-hour candle ending 16:00 UTC the day before from the exchange's public API for seven cities; keep two-sided quotes. 2) Pull the hourly 2-day-ahead forecast from a public archive of past model runs at each station's coordinates; F = daily maximum over local hours. 3) Per city and day, mu = F plus the mean of the last 120 residuals up to two days earlier (at least 20), sigma = their standard deviation (floor 1.0 F); compute the range probabilities with the normal distribution on integer degrees. 4) Trade the side with q - price - fee >= 0.05, fee = 0.07 x p x (1 - p), hold to settlement. 5) Bootstrap by city-day; compute Brier scores of the mid price and the model on all quoted contracts.

**Grade:** COMPLETE

---
AI-generated research, checked but not peer-reviewed. Historical, experimental research, not investment advice. Dataset Terms of Use: https://alphanotfound.eu/terms
