99 Francs
sales@99francs.agency

HQ Paphos, Cyprus · worldwide

Are Liquidity Rewards on Polymarket's Weather Markets Profitable? We Measured 256,000 Order-Book Snapshots

By Alexander Vinokurov

A trader asked us to rewrite his weather market maker in Rust. We measured the opportunity first — 256,000 order-book snapshots across 1,702 temperature buckets — and told him not to build it. What the reward economics actually look like, why the richest markets are the worst, and why we threw away our own positive result.

Are Liquidity Rewards on Polymarket's Weather Markets Profitable? We Measured 256,000 Order-Book Snapshots

In September 2026 an independent trader came to us with a working Python market maker on Polymarket's daily temperature markets and a clear request: rewrite it, move the execution path to Rust, and make the liquidity-reward harvest reliable. He believed his exits were too slow and that a faster engine would fix the economics. We have built exactly that system before — a Python quant engine with a Rust low-latency execution core — and written up the latency migration and the anti-pickoff logic that goes with it. So we could have quoted the build. Instead we measured the idea first, unpaid, and the measurement said the build should not happen. His own figures stay his; everything below is either a ratio or something our own instrument measured.

The loss is created at the fill, not at the exit

The first pass was his own tape. We reconstructed the complete set of round trips in his trade export, covering three weeks of live quoting. Four numbers decide the argument. Eighty per cent of his exits closed at a loss. The median exit came 43 seconds after the entry, one cent below it. And the buckets he was filled on came in 39 per cent of the time, at an average entry price implying 46 per cent.

That last line is the whole engagement in miniature. He was buying at a price implying 46 when the thing came in 39. That is not a slow exit, that is an informed counterparty. And his fast exit was already doing its job — holding those same fills to settlement instead of scratching out of them would have been roughly three times worse. The exit was converting a large problem into a small one. Making it faster cannot change the sign, because the loss is created at the moment of the fill.

Rust is not a strategy

His cancel round trip already measured in the low tens of milliseconds. We build Rust execution cores beside Python strategy engines precisely because latency decides profit and loss on fast markets — when the strategy is right. But a faster engine changes *when* you exit; it does not change *whether* the fill was right. Speed is leverage on an edge. Applied to a negative edge, it is leverage on a loss.

We did not trust his export, so we built our own instrument

One trader's export carries selection and survivorship effects you cannot rule out from the outside. So rather than judge a strategy from the data of the person asking us to build it, we deployed a zero-money collector on our own infrastructure. It watched the reward band on every weather market the venue was paying for — live or already decided — and sampled it every five minutes.

What the collector measuredObserved
Observation window27 hours
Order-book band snapshots256,000
Distinct temperature buckets1,702
Trade-tape rows74,000 across 503 markets
Venue-wide reward pool$13,000–17,000 per day
Rewarded markets at any moment360–563
Median advertised rate per market$23 per day
Snapshots with no bid at all15%
Median spread3 cents

Then we simulated this class of quote against that tape: a small two-sided quote one cent off the midpoint, with queue share taken from the venue's own reward score, and every resulting fill marked forward to see what it was actually worth.

SliceWhat the simulation returned
All rewarded weather markets, 18 hours$6,005 in rewards against −$9,410 of adverse selection on 172,000 shares — net −$3,405
Per share filled−5.5 cents
Markets advertising under $30 a dayPositive
Markets advertising over $60 a day−$4,078

The richer the advertised reward, the worse the result

That ordering is the finding. It is monotonic, and it is the opposite of the intuition that brings people to these markets — that a fat advertised rate is money nobody has noticed. The reward is not a gift. It is the price the venue pays someone to stand in a spread and carry inventory risk, and on the markets where that price is highest the risk is highest too. It is being priced by counterparties who know tomorrow's temperature better than the book does. The spread is not vacant because nobody spotted it; it is vacant because standing in it means serving forecasters, and the reward covers roughly half of what they take.

We closed the obvious escape routes as well. Buckets whose outcome is already determined by the observed temperature still carry a reward, but their book is one-sided, so there is no midpoint to quote around. Filters on how far the midpoint sits from even money, and on extreme midpoints, do not change the sign.

We killed our own good news

One slice did come out positive. Far buckets — more than 24 hours from settlement, where the reward band sat unoccupied — modelled at a healthy daily return on a small bank once re-scored against actual settlement outcomes rather than a one-hour markout. It was the only number in the engagement that looked like what the client had hoped for, and it was tempting to hand over as a consolation prize.

Instead we pointed the same model at the one quantity in the engagement that had a known answer: the rewards the venue had actually paid out. The model predicted roughly 300 times more reward income than was really paid. The entire positive far-bucket result rested on reading the venue's advertised daily rate as money that lands in the pocket of whoever stands in the band — and at the payout scale we can actually observe, that seat is worth single-digit dollars a day against an adverse-selection cost an order of magnitude larger.

So we discarded the finding, and told the client we had discarded it. This is the part of the work that is hard to sell and impossible to skip. Producing a positive result is easy; almost any backtest will hand you one. The discipline is calibrating it against something with a known answer and refusing to ship it when the calibration fails. A result you have not tried to kill is not a result.

What we told him

That he should not take that spread, and that we did not want the build. We said plainly that we build execution engines and would happily build his — but not into a position that is lost at the moment it is opened. The honest version of the conclusion is narrower than “this does not work”: the reward economics on these markets do not survive contact with informed flow at the sizes we measured. We are not claiming weather market making is impossible, and one line of the research stays open pending a small live probe we have not run.

What we handed over instead

We did not leave him with nothing. On the same weather markets we had found a different archetype that does make money — one that earns by forecasting rather than by quoting. It buys days ahead of settlement and ladders adjacent temperature buckets in small clips, and its edge measured to settlement is an order of magnitude better than that of other takers trading the same buckets. That gap is information, not execution, which is exactly why no amount of Rust would have produced it. We handed him the archetype with an honest caveat — the wallet we studied it on has since stopped trading, so it is a subject to learn from rather than a live model to follow — and pointed him at a second one that is still active and makes money as a patient maker.

We also gave him the list of things we had already tried on the forecasting side and failed at, so that he would not spend his budget discovering them again. Public weather-model consensus does not beat the book's own implied probabilities. Calibrating station bias on years of observations lifts the hit rate slightly and still returns nothing. Passively accumulating below the market on a multi-day horizon loses for the same adverse-selection reason his quotes did. A negative result handed over for free is worth real money to someone who was about to pay to rediscover it.

The pattern generalises well past prediction markets. When a system is losing money and the instinct says “we need it faster”, the first question is whether the loss is created by the timing of the exit or by the selection of the fill. The two look identical in a profit-and-loss statement and have opposite cures. Measuring which one you have costs a fraction of building the wrong fix.

Alexander and the team at 99 Francs are the embodiment of professionalism. They responded promptly to a difficult research task request and handled it quickly and decisively with an extreme focus on attention to detail. Highly recommended.

Jordan, trader, Dallas

If you already have a strategy you trust and need the execution built — fast quoting, pulling a quote before it goes stale, a Rust hot path beside a Python engine — that is our work. See the Polymarket trading system case study, Rust development and Python development. And if you are not yet sure the strategy survives contact with real flow, we would rather measure that first.

FAQ

Frequently asked questions.

In our measurement of the daily weather markets, no. Simulating a small two-sided quote across every rewarded market for 18 hours returned $6,005 in liquidity rewards against $9,410 lost to adverse selection — a net loss of about 5.5 cents per share filled. The reward covers roughly half of what informed counterparties take. This is a measurement of one venue's weather markets at the sizes we tested, not a claim that reward harvesting can never work anywhere.
Because the reward is the price the venue pays someone to carry a risk, not free money that nobody noticed. In our data the relationship was monotonic: markets advertising under $30 a day came out positive, and markets advertising over $60 a day lost the most, −$4,078 over the same window. The fattest rates sit on the markets where informed flow is most dangerous, and a resting quote there is filled precisely when it is wrong.
Only if the loss is being created by the timing of the exit. If it is being created by the selection of the fill, speed makes no difference to the sign — it changes when you exit, not whether the fill was right. In this engagement the client's exits were already fast, and holding the same fills to settlement would have been roughly three times worse, which proved the exit was helping rather than hurting. Speed is leverage on an edge; applied to a negative edge it is leverage on a loss.
Compare the outcome rate of the positions you were filled on with the price you paid. If your fills win less often than the entry price implies — in this case 39 per cent of the time at an average price implying 46 per cent — the counterparty is better informed and the loss is created at the fill. If the fills are fair but the exits leak, the loss is created afterwards, and that is the case where execution speed actually pays for itself.
Work with 99 Francs

Have a strategy? We build the execution.

Fast quoting, pulling a quote before it goes stale, a Rust hot path beside a Python strategy engine — that is the work. And if the edge has not been measured yet, we measure it before anyone writes code.