· 7 min read

Everything I Learned Trading Prediction Markets, Minus the Useful Part

A month of experiments, with the parts that made money removed.

Tuition

In early October I started poking at prediction markets to see whether anything was left for a college student with a laptop.

A month later there are servers, a fleet of AI agents that write and review the code, approval files that say exactly how much each bot may risk, and a rule that any trade a bot cannot explain stops everything until I look at it. The first thing I ran with real money made about a dollar a day. I was thrilled for roughly one day.

I am not going to tell you what makes money. In a market, an idea that gets shared stops being worth anything, and I have grown attached to this one. Everything else is fair game, and most of the month was “everything else” anyway.

The Market Is Smarter Than My Model

Almost every idea I had was a version of “I can price this better than the market can.” A fair-value model built from a faster market somewhere else. Being quicker than everyone. Arbitrage across venues. Order books that looked suspiciously wide, as if nobody had noticed they were free money.

They all lost, usually after fees, sometimes before. The wide books in particular taught me the most expensive lesson in market making for free: a wide spread is rarely an oversight. It usually means the person on the other side knows something you do not, and you are the reason they are still in business.

The cleanest failure was a pricing model I trusted enough to trade live. On day one it made 33 trades and won 21 of them, which sounds fine until you read the bill. The model turned out to be about 40% too confident, because short-term moves trend more than its assumptions allowed. Meanwhile the plain market price, the thing I was supposedly smarter than, predicted outcomes as well as my model or better. Thirty seconds after each of my fills, the price had on average moved against me.

I lost about eighteen dollars, and the bot was switched off a little after four. A fast trader with a wrong fair value just loses faster. Speed was never the problem; being wrong was.

Three Bets Are One Bet

That same afternoon, the bot made the same bet three times in sixty seconds. All three lost.

Each trade respected the limits I had written. The limit was per time window, not per bet, so the bot saw three separate opportunities where there was really one opinion expressed three times. Correlated bets are one bet. The cap now applies to each market and side, and repeated takes on the same idea count together.

Excellent Test Coverage, Five Failed Launches

Before one bot touched a real order, it passed about 3,600 automated tests and roughly ten rounds of code review. Then it failed five live starts in a row, each on a different surprise.

Quantities came back as the string “75.0000”. Fields documented as numbers arrived as null. A data stream never sent the snapshot its documentation promised. Order books were served from a cache and were quietly stale. None of this was exotic. All of it was invisible to the tests, because the tests were written against the documentation, and so were the mocks, and so was the code. Everything agreed with everything except reality.

The fix was a boring build order I now follow for any new venue. First, place a tiny real order far from the market and record every response the venue sends back. Those recordings become the test fixtures. Then review the code against the recordings, not the docs. Only then does it trade with money, starting with an amount I would not notice losing.

A Safety Check That Never Fires Looks Like a Bot That Is Off

One morning I switched to a configuration that looked strictly safer. It spread the same budget across more markets. It then did nothing at all, all morning, while reporting that nothing was eligible.

The arithmetic took me an embarrassingly long time to see. An earlier fill had used part of the daily budget, the remainder split four ways came out below the smallest order the strategy places, and so every market failed the check. The reviews had all asked whether the bot could lose too much. Nobody asked whether it could still do anything. Now every configuration change gets run against the account’s actual current state before it goes live, and “nothing passed” and “the limits blocked everything” are reported as different things.

Read Your Own Data First

At one point I concluded that a certain kind of payment program did not exist, because the documentation did not mention one. Our own downloaded data had nearly ten thousand records of exactly those payments. I had read the docs instead of adding up what was in front of me.

The rule since then: before concluding anything, count every type of record in the raw data, with totals by month. Anything the docs do not explain is a lead, not a footnote. An unexplained six-figure number does not appear out of nowhere.

Ask What Every Dollar Is Doing

For about three weeks, while I searched hard for the next idea, the money behind the one idea that already worked was doing far less than it could have. The improvement was not a new edge. It was sitting down and asking, hour by hour, what each dollar was actually doing.

Searching for new things is more fun than auditing old ones. It is also how you end up with a research pipeline and a pile of cash doing nothing.

The Agents Write the Code

Most of the code was written by AI agents and reviewed by other AI agents. My job turned into writing rules, which turned out to be the actual engineering.

Reviews were the first thing to get wrong. I ran two reviewers on the same code, and for a while they disagreed constantly. Over 63 rounds the strict one blocked 51, the lenient one approved most of those, and the strict one was almost always right. The builders kept fixing the exact example in each report, and the strict reviewer kept finding its sibling in the next round. Now every fix round has to fix the class of bug, not the instance.

Later the strict reviewer started inventing ever more hostile inputs (a price of NaN, an order size of 10^40), and the code never converged. So “blocking” got a written definition. It has to be a real logic bug that can lose money, break a limit, or stall the bot under ordinary conditions, and it has to be plausible within about a week of normal running. Everything else gets written down and does not block.

Then a change passed three reviews and still broke, because the reviewers could not run the tests in their sandbox and said yes anyway. A reviewer’s approval is no longer what merges code. Whoever merges runs the full test suite and trials the changed code against live market data first, with no trading key loaded.

The rules for the bots themselves are short and strict. Every bot has caps that only I can raise. Every bot has a loss limit that stops it. Anything it cannot explain, whether an order, a fill or a position, pauses it until I approve it again. The first time a bot lost money, it stopped and waited for me to read the logs. That was the most reassuring thing it has ever done.

What I Would Tell Myself on October 2nd

None of the money came from out-predicting the market. Every time I tried, the market won, and it did not even notice. What worked came from paying closer attention than other people, and that is all I will say about it.

Most of what I learned was not how to make money. It was how to stop losing it: count your data before you believe your docs, test against reality instead of your guesses, treat three bets on one idea as one bet, and write rules that make the machine stop and ask.