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 measured | Observed |
|---|---|
| Observation window | 27 hours |
| Order-book band snapshots | 256,000 |
| Distinct temperature buckets | 1,702 |
| Trade-tape rows | 74,000 across 503 markets |
| Venue-wide reward pool | $13,000–17,000 per day |
| Rewarded markets at any moment | 360–563 |
| Median advertised rate per market | $23 per day |
| Snapshots with no bid at all | 15% |
| Median spread | 3 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.
| Slice | What 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 day | Positive |
| 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.
Frequently asked questions.
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.



