Building a Polymarket Copy-Trading Bot, Part 4: Why I Stopped Letting It Copy Anyone

Why I Stopped Letting It Copy Anyone

A quick note on context before I get into it: I write this series in English because Polymarket operates in a global, English-first environment and isn’t accessible in every jurisdiction. I stay deliberately vague about the money-making specifics — which wallets I watch, how I filter entries, how I size positions — because that’s the edge, and publishing it would dissolve it. What I share in full is the engineering, the infrastructure decisions, and the reasoning behind them. If you’re building something similar, those parts should transfer cleanly even without the private details.

Parts 1 through 3 of this series were about the plumbing: getting approvals right, fixing a logging bug that was masking real errors, and stopping the bot from reading an 848 MB file on every cycle. By the time those were fixed, the infrastructure was stable enough that I could actually sit down and look honestly at what the bot was doing with that stability. What I saw was uncomfortable enough that I ended up switching off its most prominent feature.

What Copy-Trading Actually Is, Structurally

The appeal of copying other traders is obvious. Someone else has already done the work of finding a position worth taking. You observe the signal — a wallet making a move — and you replicate it automatically. The bot I built could do this: detect an on-chain action, parse it, and submit a matching order within seconds.

The problem is structural, and it doesn’t go away no matter how fast your pipeline is. Copying is reactive by construction. The triggering event is someone else acting, which means the move has already partially happened before your order is even formed. You are, by definition, second. On a prediction market, where prices shift immediately with order flow, “second” means you are buying what someone else just made more expensive. You have inherited their timing lag and their price impact without inheriting the thing that made them willing to pay that price in the first place: their reasoning, their research, their conviction about a specific outcome, and — critically — their exit plan.

That last part is easy to underweight. When a trader you’re copying decides to close a position, you won’t know why. You don’t know if they’re taking profit, cutting a loss, rebalancing something elsewhere, or responding to new information you haven’t seen. You will find out when you see the on-chain event, which again puts you second. Exit timing on a prediction market matters enormously; prices can move sharply on resolution news or volume shifts, and being a step behind on the way out is just as costly as being a step behind on the way in.

What the Data Actually Showed

I want to be careful here about what I can say. I’m not going to share performance numbers — not because they’re bad, but because specific figures would either reveal the strategy or invite the kind of outcome-focused thinking I’m specifically arguing against. What I can describe is the structure of what I found when I examined results honestly.

When I separated outcomes by source — meaning, which copied account a trade originated from — the picture was not what the aggregate had suggested. Some sources looked good at first. Under honest, consistent measurement, most of that apparent edge decomposed into one of two things: noise from a small sample, or a narrow pattern that had worked in a specific market condition and showed no sign of generalizing beyond it. A streak of correct calls on one type of event is not a model. It’s a streak.

The approaches that held up under scrutiny were the ones I had written down as explicit, testable rules before running them — rules I could describe precisely, defend logically, and reason about when conditions changed. Those rules did not depend on trusting a stranger’s wallet history. They depended on structural features of the market itself. That distinction turned out to matter a great deal.

Outsourced Judgment Is the First Thing to Fail

There is a version of copy-trading that is more defensible: you follow a trader whose methodology you understand deeply, whose public reasoning you’ve studied, and whose behavior you can model well enough to anticipate rather than just react to. That’s still not what I was doing, and I suspect it’s not what most copy-trading implementations do either.

What I was doing was closer to: “this address has made good trades in my observation window, therefore I will replicate its future actions.” That is a bet on the leader, not on the market. It is a form of delegation — and delegated judgment is the first thing to break when market conditions shift, because the leader will adapt their reasoning and you will have no visibility into that adaptation. You’ll just see different behavior from the wallet and have no framework for interpreting it.

An edge you do not understand is not your edge. You cannot size it correctly, because you don’t know how robust it is. You cannot recognize when it has stopped working, because you never knew why it was working. You cannot improve it, because you don’t have access to its internals. You are a passenger, and passengers don’t get to steer when the road changes.

What I Kept

Turning off the copy behavior did not mean turning off the bot. It meant replacing one mode of operation with another. The rule-based automation I had built alongside the copy logic stayed running. These are rules I can write down as code, inspect, backtest against historical data, and modify deliberately when I have a reason to.

// Simplified structure of a rule-based entry check
function shouldEnter(market: Market, state: BotState): boolean {
  if (!meetsLiquidityThreshold(market)) return false;
  if (!meetsTimeToResolutionWindow(market)) return false;
  if (!priceBelowEntryBand(market)) return false;
  if (state.hasOpenPositionIn(market)) return false;
  return true;
}

Each condition in a structure like that is something I chose, something I can explain, and something I can independently evaluate. If the rule stops performing, I have a place to look. I can ask: has liquidity changed? Has the resolution window shifted? Is the pricing band still calibrated to current market behavior? I cannot ask those questions about a wallet I’m copying, because the wallet doesn’t expose its internals.

The rule-based system is also easier to maintain honestly. I know when I’m changing it and why. Drift is visible. With copy-trading, the “strategy” can change every time the source wallet’s behavior changes, invisibly, with no record of why.

The Lesson Is Generalizable

I want to be clear that the lesson here is not “those traders were bad” or “copy-trading never works.” It might work under specific conditions I didn’t have: a source whose full methodology you’ve internalized, a market with enough latency for you to enter at a comparable price, a signal that is genuinely information-rich rather than noise. What I had did not meet those conditions, and I think that’s the common case, not the exception.

The generalizable principle is this: automation amplifies whatever strategy you feed it. If the strategy is “do what someone else did, a moment later, without their context,” automation will execute that very efficiently. Efficiency is not the same as correctness. Getting faster at the wrong thing is still the wrong thing.

Sitting down to look honestly at what the bot was actually doing — not what I had hoped it was doing — was the most useful engineering decision I made in this phase. It didn’t require writing any code. It required resisting the temptation to rationalize results and instead asking structural questions about the mechanism itself.

The infrastructure built through Parts 1 to 3 is now running rule-based logic exclusively. The next challenge is a different kind: figuring out how to know, in real time, when a rule that was working has stopped working — without waiting for the losses to tell you.

Leave a Comment