We Built a Weather Trading Bot. Here's What Day 1 Taught Us.
Kalshi offers weather prediction markets — binary contracts like "Will Denver's high temperature exceed 58°F tomorrow?" If yes, the contract pays $1. If no, you lose your stake.
These contracts settle based on the National Weather Service Daily Climate Report (CLI). And here's the interesting part: the data that settles the contract is freely available to anyone. NOAA publishes temperature forecasts that are, in our experience, remarkably accurate.
So we built a system to compare NOAA's forecast against Kalshi's market prices, looking for mispricings. The theory: if NOAA says there's a 70% chance the high exceeds 58°F, but the market is pricing it at 40%, that's edge.
We ran it for 48 hours with zero capital at risk. Here's what we learned.
Day 1: The "Big Edge" That Wasn't
Our model flagged Denver as the biggest opportunity: a 68-cent edge on a contract asking whether the high would exceed 58°F. NOAA's forecast was 60°F — comfortably above the strike. Our model said 69% probability. The market said 1%.
The market was right. The contract settled NO.
At first, this looked like a devastating model failure. A 2°F+ miss by NOAA? That would mean our entire thesis was wrong.
The Plot Twist: It Was Only 1°F
When we pulled the actual observed temperature from the NWS station, Denver recorded 59°F — only 1°F below NOAA's forecast of 60°F. That's excellent forecast accuracy.
So why did "above 58°F" settle NO if the station recorded 59°F?
The answer: rounding. Kalshi settles on the NWS Daily Climate Report, which uses a specific measurement and rounding pipeline. The automated weather station records temperature in Celsius, rounds it, converts to Fahrenheit, and rounds again. At boundary temperatures, this process can shift the reported value by 1°F compared to raw station observations.
The math: 14.4°C × 9/5 + 32 = 58.4°F → rounds to 58°F. But 14.3°C × 9/5 + 32 = 57.7°F → rounds to 58°F too. One-tenth of a degree Celsius can be the difference between a contract settling YES or NO.
The Real Scorecard
| City | NOAA Forecast | Actual (Station) | Error |
|---|---|---|---|
| Chicago | 48°F | 48°F | 0°F ✅ |
| Miami | 79°F | 76°F | 3°F |
| Denver | 60°F | 59°F | 1°F |
Average forecast error: ~1.3°F. Much better than the 3°F we initially assumed.
The model wasn't broken. NOAA's forecasts were actually quite good. The problem was trading a contract right at the boundary where a tiny rounding artifact flipped the outcome.
The Rule We Discovered: Avoid the Boundary
Don't trade contracts within 2°F of NOAA's forecast. At the boundary, you're not betting on weather — you're betting on rounding.
If NOAA says 60°F, trade "above 55°F" or "below 65°F" — not "above 58°F." The edge lives in the tails, not at the boundary. Cheap contracts (under 30¢) in the tails offer asymmetric payoffs with margin for error.
The Fee Reality Check
Kalshi charges 1% on trades and 10% on settlement winnings plus 2% on withdrawals.
| Buy Price | Net Profit if Win | Min Win Rate Needed |
|---|---|---|
| 10¢ | ~80¢ | 11% |
| 20¢ | ~70¢ | 22% |
| 30¢ | ~60¢ | 33% |
| 50¢ | ~40¢ | 56% |
| 70¢ | ~20¢ | 78% |
| 90¢ | ~$0 | Unprofitable |
The sweet spot is contracts priced at 10-30¢. Above 50¢, fees eat most of the profit.
What's Next
We're exploring forecast revisions as signals (when NOAA updates and the market hasn't repriced), per-city calibration (Chicago was perfect, Miami was off by 3°F), and CLI-specific validation. Three cities, one day — we need weeks of data before trusting any of this. Prove it before you trade it.
The Lesson
We went from "our model is broken" at 9 AM to "our model is decent, our strike selection was the problem" by 1 PM. That swing only happened because we had $0 at risk and took the time to dig into the data. Prove the edge before you risk the capital. Every time.