Copy trading is the most common bot idea on Polymarket: find the wallets that win and buy what they buy. We tested it on five sports (MLB, NFL, college football, League of Legends and Valorant) and it did not survive. The full results are on our blog and the data and script are on GitHub.
This post is about the backtest itself: how to set it up so it can tell you "no", and the one mistake that makes almost every copy bot backtest look better than it would be live.
1. Define a copy you could actually execute
A "copy" in our test is a wallet's first buy of at least $20 in a market, at a price between 0.30 and 0.85. We buy the same outcome for $10 at the wallet's price plus 1 cent, pay the sports taker fee and hold to resolution. Roughly, in code:
def copy_result(price: float, won: bool, stake: float = 10.0, slip: float = 0.01) -> float:
p = price + slip # you never get the whale's exact price
shares = stake / p
fee = shares * 0.05 * p * (1 - p) # Polymarket sports taker fee
payout = shares if won else 0.0
return payout - stake - fee
One cent is generous. In fast in-play markets the price moves much further before a copy fills. We also reran MLB at +3 cents: every result went negative, including the top 10.
2. Pick on one period, measure on the next
The rule: rank wallets by their copy results over the two months before the test month, then copy only in the test month. Nothing from the test month touches the selection. We used three rules fixed before the run:
-
ALL10: every wallet with at least 10 copies (the "average whale") -
POS: at least 20 copies, mean above zero, t-statistic of 2 or more -
TOP10: the 10 best by t-statistic
MLB, top 10, per $10 copied:
| Test month | While picked | Month after |
|---|---|---|
| July 2026 | +$3.65 | +$0.16 |
| August 2026 | +$3.06 | -$0.04 |
| September 2026 | +$2.72 | -$0.47 |
| Oct 1-4 2026 | +$3.78 | -$2.23 (n 7) |
The same rule that showed +$3 in the pick window showed about zero the month after.
3. Check whether rank carries over at all
Before tuning thresholds, check if past performance predicts future performance for individual wallets. For MLB wallets with at least 10 copies in both periods, the Spearman correlation between the pick months and the next month was -0.01, +0.15, +0.08 and -0.03. NFL was between -0.09 and +0.03.
With correlations like that, picking "the best" is picking the luckiest. With thousands of active wallets, dozens will have a great two months by chance.
4. Look at the baseline before the winners
The average MLB whale, copied one cent worse than its own price, lost 31 to 63 cents per $10 in every test month. If the baseline is negative, a selection rule has to beat a loss before it makes anything. Check ALL10 first.
5. The trap: wallet labels computed today
This one is easy to miss. Analytics sites (ours included) label wallets: "smart money", "50+ resolved markets", win rate, profit factor. Those labels are computed today, on each wallet's full history, including the months you are about to backtest.
If you pick wallets with today's labels and backtest them on last summer, the selection already knows who survived. Wallets that blew up are not labeled "smart", so the backtest never copies them. It will always look better than it would have live.
We hit a mild version of this ourselves: one filter in our profile screen used each wallet's share of activity in the sport on its full history. We disclosed it in the methodology. It most likely flatters the pools, and they still showed no edge.
Rule of thumb: every feature used to pick a wallet must be computable from data strictly before the pick date.
6. Make it reproducible
The repo has scripts/copy_backtest.py (Python 3.9+, standard library only) that runs the same walk-forward on the OrcaLayer API for any league:
export ORCALAYER_API_KEY=sk_orca_... # never commit it
python3 scripts/copy_backtest.py --league mlb --start 2026-05-01 --end 2026-09-30 --max-markets 800
To check that the API path and our internal database agree, we ran both on the same 800 MLB games: 161,094 copies in both, every wallet, price and result equal, total -$83,012.60 in both. The script output showed the same picture: top 10 from about +$3 per $10 to between -$1.29 and +$1.06 the month after.
The script needs a Premium API key. If you just want to look at a wallet's record before copying it, the free OrcaLayer MCP server works from Claude without a key.
What this does not show
Five sports, and picking by past results only. Slower markets like politics, where informed money can stay ahead for days, and picking wallets by how they trade rather than how much they made, were not tested.
Originally published on orcalayer.com. OrcaLayer is an independent Polymarket analytics provider, not affiliated with Polymarket.
Top comments (1)
tr.ee/dev-to