Alpha Not Foundopen trading research archive

Archive / Prediction markets / E550

AI-generated research, checked but not peer-reviewed. It may contain errors.
E550  KILL  No signalTested · October 2026

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).

event-contracts weather temperature nwp-forecast calibration

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.

Net per contract-3.26 cn 1,654 trades; 95% interval -5.21 to -1.40 c
Cities with a positive mean0 of 7rejection line: fewer than 4
Brier score, market mid0.1125lower is better; model 0.1466
Median trade-4.3 cworst single trade -92.5 c
01 · The idea being tested

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 argument, as stated before testing

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.

02 · 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.

Pass required

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

Killed if

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.

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.

03 · What happened
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.

  • 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

00.050.10.15All quoted contracts+0.11+0.15

Market mid priceBias-corrected model

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.

Chart data (Brier score (lower is better))
Market mid priceBias-corrected model
All quoted contracts0.110.15

Trades against the price lost money

-4-20All trades, net of fee (n 1,654)-3.26 [-5.21, -1.4]

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

Chart data (c per contract)
Mean95% low95% high
All trades, net of fee (n 1,654)-3.26-5.21-1.4

No city was positive

-6-4-20New York (n 215)-3.84Chicago (n 250)-5.93Miami (n 212)-0.26Austin (n 244)-2.18Denver (n 247)-3.13Los Angeles (n 224)-4.37Philadelphia (n 262)-2.83

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.

Chart data (c per contract)
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
04 · What it means

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 of this result

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.

A rejected experiment applies to the tested conditions and does not prove an idea can never work. bp = basis point, 0.01%.

1. Test design

Pre-registered
Yes: rule and criteria fixed before the test data was examined
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; public API, no login | 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; public API, no login
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.

2. Result

Observations
1,654
Instruments
7
Net mean
-3.26
95% interval
-5.21 to -1.4
Median
-4.3
Worst
-92.5
Finding 1
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.
Finding 2
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.
Finding 3
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.
Finding 4
The first half of the trades by date averaged -4.23 c and the second half -2.28 c: negative in both.
Finding 5
No city had a positive mean. Per-city means ranged from -5.93 c (Chicago) to -0.26 c (Miami).

3. Interpretation

Why it failed
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.

4. 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
Feedback
Feedbacksite

Feedback on the archive

Type
Type

Text only. No name or e-mail is asked; please do not include personal data. Nothing identifying you is stored.

0/2000

Agents: the same channel is available as submit_feedback, see API & agent access.