Measurement · 21 August 2026
We built a Polymarket whale tracker, then measured that ranking whales is impossible
17,794 resolved positions from 98 wallets. No wallet is distinguishable from luck — in either direction. A single address accounts for the entire net loss.
An audit of our own arithmetic found two errors in the first version of this page, both in the analysis code written for it, neither in the product. The fee was applied per share instead of per dollar staked, overstating it 2.5×. And multi-fill positions had their share count derived from an averaged price instead of summed per fill — which understates shares whenever a whale buys the same leg at different prices, as they do in 58% of positions. Every number below is recomputed. The findings about ranking wallets never depended on either. Details in what we got wrong.
We spent three months building a tool that watches large Polymarket wallets, analyses each position with an LLM, and pushes a BUY / WATCH / SKIP verdict to Telegram. The premise was the same one every tracker in this category runs on: some whales are better than others, and following the good ones beats following the bad ones.
We finally measured the premise. It is false — not unproven, but unmeasurable in principle at the volumes anyone in this category actually has.
Here is what we found, what we got wrong along the way, and what we changed.
The data
106,272 individual fills from 98 wallets, May–August 2026, aggregated into 17,794 resolved positions worth $21.0M staked. A position is one wallet, one market, one outcome leg. Fills are grouped into positions because twenty fills into the same bet are one bet, not twenty.
Outcomes come from Polymarket's CLOB winner flag. We cross-checked
1,462 of them against our own resolver: zero disagreements.
Finding 1: whale positions are priced correctly
Take every position and compare the entry price to what actually happened. Under the null hypothesis that the market price is the probability, a position bought at 0.60 should win 60% of the time.
17,794 positions · average entry 0.555 · actually won 56.0% edge: +0.51 percentage points (cluster-robust 95% CI: +0.06 to +1.00)
Whales beat their own entry prices — by half a point. It is real and it is almost nothing, and you cannot see it in any individual wallet.
Yet dollar-for-dollar they lost money: -3.1% before fees. The typical position slightly beats its price; the largest ones lose. Fees widen the gap, by an amount that depends on who you are.
what the whales actually paid $168,300 0.80% of stake -> -3.9%, 20% of the loss what a copier would have paid $441,685 2.10% of stake -> -5.2%, 40% of the loss
Only takers pay on Polymarket. Across 7,053 live positions from our 25 largest wallets, 30% of their volume carried no fee at all — they were resting orders, not crossing the spread. Someone copying an alert has no such option: by the time you see the trade, taking is the only way in. That gap, about 1.2 points of stake, is a cost of following that the person you are following never pays.
The fee itself is shares × rate × price × (1 − price), which as a
fraction of what you stake is rate × (1 − price) — heaviest on cheap
legs. A bet at 0.20 pays 4.0% of stake to get in; a bet at 0.95 pays 0.25%. We
verified the formula against the fees Polymarket actually charged: the implied
rate lands exactly on the two published coefficients, 0.0300 and 0.0500.
Finding 2: you cannot rank these wallets, and the reason is arithmetic
The obvious next move is to find which wallets are good. We ran the same null test per wallet, 6,000 simulations each, on the 38 addresses with at least $20k staked and at least 10 resolved positions.
beat the market at p < 0.05: 0 of 38 (expected by chance: 1.9) lost to the market at p < 0.05: 0 of 38 (expected by chance: 1.9)
Zero. In both directions. Not "weak evidence" — literally nobody, and fewer than chance alone would have produced.
That is not about our sample being small. It is about what these samples are. To detect a 5-percentage-point edge at 80% power you need roughly 580 equal-weight positions. Whales do not bet equal weights. They bet $36 and then $740,000. Once you account for that, the usable sample collapses:
| Wallet | Positions | Effective (Kish) | Retained |
|---|---|---|---|
| 0x2005d16a… | 1,881 | 254 | 13% |
| 0x2a696600… | 3,865 | 229 | 6% |
| 0x204f72f3… | 4,548 | 169 | 4% |
| 0xfe787d2d… | 1,174 | 137 | 12% |
| median of all 38 | — | 13 | — |
| wallets with 400+ effective | — | 0 | — |
The wallet with 4,548 positions gives us the statistical power of 169. The median wallet gives us 13. At the current rate, the best-sampled wallet reaches 500 effective positions in about seven months. The median one takes roughly ten years.
Every product that ranks traders by track record — ours included — is ranking noise at these volumes. That is not a criticism of anyone's engineering. It is a property of unequal bet sizing that no amount of data collection fixes quickly, because the same wallets keep making the same lopsided bets.
Finding 3: the losses are five addresses, not a population trait
| Group | Staked | Share | Return | Of all losses |
|---|---|---|---|---|
| One address | $2.3M | 11% | -37.8% | 105% |
| Top 5 wallets | $12.1M | 58% | -8.4% | 123% |
| The other 93 | $8.9M | 42% | +2.1% | -23% |
Read the last column again. The other 93 wallets are up 2.1%; the entire net loss, and then some, is five addresses — and 105% of it is one: 16 positions, $2.30M staked, -37.8%, three quarters of it in Counter-Strike, including a single $739k bet at 0.28 that lost. Without that one bet the same wallet sits at -7.9%.
And it sits at p = 0.31 against the null. Losing $868k on 16 bets at an average price of 0.40 is entirely ordinary luck. "Whales lose money" is, in our book, one person having a bad month.
What we got wrong
Five times in two days a result came out wrong. Three were caught by the same question — is this number even possible? The fourth by reading the documentation instead of our memory of it. The fifth only by auditing code that had already produced a published number.
-1. Shares derived from an averaged price
A whale fills one leg many times at different prices. We summed the dollars, took
the value-weighted mean price, and divided to get shares. That is not the same as
adding up the shares each fill actually bought — a fill at 0.06 buys a pile of
shares while barely moving a mean anchored at 0.60. Across our book it understated
shares by 5.2% and the gross return by 2.3 points of
stake. 58% of positions have more than one fill, so it was not an edge
case. The product's own aggregator had it right: stake / shares.
0. The fee, applied to the wrong denominator
Polymarket charges takers shares × rate × price × (1 − price). We had
it as rate × (1 − price) per share — the right expression for
a fraction of stake, applied to the wrong quantity. That overstates the
fee by 1/price: 1.8× at our average entry, 10× on a 10-cent leg. It
put $1.07M of fees in the book instead of $426k and made every net return look
worse than it was, including our own.
What is uncomfortable is how it was caught. It was not caught by a test. We were rewriting a tweet, the number looked wrong in the other direction, and reading the fee documentation settled it. The product's own code had the formula right the whole time; only the analysis scripts written for this article had it wrong. There is now one implementation both use.
1. An anchor that depended on the outcome
Measuring price calibration, we sampled each market's price N hours before
min(endDate, closedTime). But a market that resolves YES closes
early, the moment the event happens; a market that resolves NO runs to its
deadline. The measurement time was a consequence of the result. The data
sorted itself — NO markets into low price buckets, YES into the middle — and the
answer came out exactly backwards: the market appeared to
underprice favourites and offer +26% in the 0.5–0.7 band. The tell was
that the number was too good. Fixed by anchoring on an exogenous calendar date.
2. A position key without the wallet address
We aggregated positions by (market, outcome leg) and forgot the wallet. Positions from different wallets in the same market merged into one and were credited to whoever appeared first. Aggregates were unaffected; the per-wallet breakdown was garbage. Caught because one wallet's graded volume came out larger than its total buy volume, which cannot happen.
3. Comparing dust to real bets
Splitting positions into size quintiles showed a dramatic effect: in the 0.30–0.40 band the smallest 20% won 37.6% and the largest 20% won 22.0%. "Big bets lose." Except the smallest quintile had a median size of $2–7. On real sizes the effect vanishes ($100–1k: 24.6%, $1k–10k: 21.3%, overlapping intervals), and on favourites it reverses.
Two silent API behaviours
Polymarket's prices-history endpoint returns an empty array,
not an error, when interval=max&fidelity=60 exceeds its
point cap on a long-lived market — collection silently produced zero rows for
hours. And Gamma resolves only about 1 in 6 of our condition IDs, while the CLOB
/markets/{condition_id} endpoint resolves 6 of 6.
What we changed
Our landing page claimed we track "50 of Polymarket's top wallets" and keep "the 50 best," rotating in "rising stars." All of that asserts a selection for skill we cannot perform. It is gone. The page now says, in the FAQ:
What we don't claim: that these are skilled traders. We measured it. Across resolved positions from 98 wallets, not one is distinguishable from luck — in either direction, after correcting for the number of wallets tested.
We added regression tests that fail the build if those phrases come back.
We also re-measured a claim we had been shipping: an "underdog band" filter, originally +15.0 points of edge on 74 bets. On 240 bets it is +5.0 points (p = 0.043), and widening the band by five cents drops it to +0.4. That is what a finding discovered by scanning looks like as data accumulates — it regresses toward zero. The bot copy now says so, and the test pins the sample size, so the next person is forced to re-measure rather than inherit a stale number.
What survived
One thing did. Our own verdicts discriminate, slightly. Stratified by price band, so price cannot explain it:
BUY vs WATCH: +7.7 points (permutation p = 0.013) BUY vs rest: +5.8 points (permutation p = 0.028)
But BUY's absolute edge is +2.0 points, and it is not significant (p = 0.21). At an average entry of 0.541 you need 55.4% to break even after a taker's fee and we are at 56.1% — 0.7 points above, which sounds like a result and is not one: proving an edge that small would take roughly 9,950 BUY calls, more than a decade at our rate.
So the honest summary of our own product: it is measurably better at saying don't than at saying do, and the do side is indistinguishable from breaking even.
Caveats
- The verdict result is marginal: two tests near p = 0.02–0.03, and a sign test across price bands does not reach significance. Several tests were run. We would not call it proven.
- Our WATCH underperformance concentrates in tennis (ATP -8.6%, WTA -14.0%); baseball and LoL sit near zero. Not a general property.
- Effective sample size (Kish) approximates power. It is right to an order of magnitude, not to the second digit.
- 98 wallets over 3.5 months is one venue and one period.
Reproducing this
Every number above comes from four scripts that hit public endpoints — market calibration, order-book depth, whale P&L by price band, and verdict edge. No private data is needed beyond our own alert history. Numbers were last re-measured on 21 August 2026 and move slightly every day as positions resolve.
We build WhaleSense, the tracker described above. It is still running, with the claims corrected.