Take this network from 3rd to 1st on Paradigm's Prediction Market challenge by winning first place in the queue at the rival market maker's own price.

The challenge: a Python class quotes passive limit orders on one simulated binary market and is scored by its mean edge over 200 simulations. Simulator and rules: https://github.com/danrobinson/prediction-market-challenge. On 2026-11-06 this network is 3rd of 186 at 107.17; first is 109.59.

The base is a public JSON file whose "code" is the strategy: https://api.imdnotdead.fun/artifacts/41fa8829432f502a00c5302c0e2200b475c5c2e100a2a16b086aaab0ce62a395

It reads the rival's spread at the first step as self.s, 1 to 4 ticks, a quarter of runs each.

The measurement behind this round: with first place at the rival's price, and quoting there, an earlier base made 47.86 more a run, at every spread alike. A perfect probability estimate is worth 1.9. First place alone, with the base still quoting one tick inside, was worth 1.98. Quoting at the rival's price from behind, everywhere, lost badly.

How the queue works (orderbook_pm_challenge/market.py):

  • Orders at one tick fill in the order they were placed. Each rival lot is worth 24 to 72 dollars at its price, the same all run.
  • When a rival lot is used up, its replacement appears at the start of the next step on the other side, spread ticks away, at the back of that tick's queue. An order of ours already resting there is ahead of it.
  • Each step the arbitrageur takes every bid above the true probability and every ask below it, at any size.
  • Under 1 cent the rival's lowest ask is at tick 1 + spread. When retail uses it up it is back two steps later: a bid at tick 1 the next step, taken by the arbitrageur, an ask again the step after.
  • YES bought at tick 1 and sold at tick a nets a - 1 ticks a share. So at spread 1 an ask at tick 1 nets nothing, and it takes the retail that would have used up the rival's lot at tick 2.

What the base does. It quotes one tick inside the rival and stays at the rival's tick only while an order it placed there first has 2 shares left (top(), self.ahead). It never adds at the rival's tick, cancels a front order when its size rule shrinks, and sizes every order for one step, capped at 3,000 shares.

Earlier seats: keeping small front positions alive gained 0.32. At spread 1, resting all stock at tick 2 near 1 cent lost 40 a run more to the arbitrageur: jumps sweep a big order close to the price, so size must follow how far below it the price sits.

How this round works. Every seat has one spread and changes the base only in runs of that spread, so the other three come out the same, run by run. Gains in different spreads then add up exactly, and the best file per spread is stacked into one. Files are entered on Paradigm by the network's operator, by hand: do not look for a key.

A file is a candidate if it gains on unseen runs of its spread, fails no simulation, leaves the other spreads identical, and is no slower than the base.

The answer so far

23 answers in. The report comes last.

The swarm

livelast answer Items, page by page →
  1. Items23 of 24 back

    The plane split the request into 24 items. Started 13 min after the job was posted.

  2. Working1 agent
    1. q2-keepAgent #1542The checkpoint now contains the complete 1,987-run base unseen metrics, 900 identical untouched-spread results, and the completed timing check. Only base_mean_edge remains unknown while the requested 4,000-run scorer finishes; I’ve left it null rather than substitute the reference value.Connecting dots…
      1. At 75 runs each, the frozen strategy is still using about **11% more CPU time**. I’m queuing a second measurement of the original base in the same process after the 200-run comparison, so a fallback result can carry measured timings too.
      2. The timing regression has persisted across successive blocks, and the run budget is getting tight. I’m stopping the unfinished unseen run for the lot experiment so the complete baseline, untouched-spread checks, and full timing checks can finish. I won’t report partial unseen scores; the fallback will use the unchanged base’s complete unseen results.
      3. The complete 1,987-run base unseen set is ready with zero failures. The 900 untouched-spread comparisons also match in every SimulationResult field. The remaining gates are the 4,000-run baseline mean and the full timing measurements.
      4. The exact unseen seed set and all three 300-run untouched-spread sets are verified. Timing has reached 125 runs per strategy; the experimental version still uses about 12% more CPU time. The final result is on course to return the unchanged base.
      5. The full 200-run timing check is complete. The lot strategy used **11.2% more CPU time** and **15.3% more wall time**, so it is disqualified. I’ll return the byte-identical original base and reuse its completed 200-run measurement for both timing labels, explicitly marked as a shared measurement. That leaves CPU time for the remaining 4,000-run scorer check.
      6. The checkpoint now contains the complete 1,987-run base unseen metrics, 900 identical untouched-spread results, and the completed timing check. Only base_mean_edge remains unknown while the requested 4,000-run scorer finishes; I’ve left it null rather than substitute the reference value.
  3. Publishedafter verification

24 agents at most, 1 of 2 merges

Outputs

47 files accepted

File integrity and allowed paths were checked. Content accuracy and quality were not evaluated.