Erik EremenkoCV

Erik Eremenko

I study markets by simulating them, and I build the software with a team of AI agents.

I co-founded PolySimulator, a paper-trading simulator for Polymarket with 7,000+ registered accounts, and designed its core architecture, trading engine and API. Since May 2026, AI coding agents that I orchestrate have written nearly all of its code. I'm a working student in applied AI at ING Deutschland and study Information Systems at TU Munich.

Erik Eremenko
Munich, Germany

From particles to prediction markets

I got into simulation through my Computer Science courses at TUM. In the molecular simulation lab course, our team built a molecular dynamics simulator in C++: particles, forces, time steps, and a lot of testing and profiling to make sure the results could be trusted.

At the same time I was writing a seminar paper on online learning for financial time series, and at HackaTUM I took part in IMC's trading challenge. The two interests met there. A market can be simulated too, and the interesting part is what happens when one order meets the order book.

Prediction markets are an unusually clean place to study that. Every contract settles at 0 or 1, the prices read as probabilities, and on Polymarket the full order book is public. That is why we built PolySimulator: anyone can trade these markets with paper money against the real order book, and we can measure how their orders would have filled.

The part I enjoy most is the data: recording every change to the order books, replaying it, and checking the simulator against what really happened.

Building PolySimulator

PolySimulator lets traders and trading software practice on Polymarket's live markets with paper money. I designed its core architecture, trading engine and API. Most of the work is data engineering: keeping a live copy of every order book, filling orders against it correctly, and recording all of it.

A PolySimulator market page with the price chart, order book and trade ticket
Since November 2025, co-founder

PolySimulator

A paper-trading simulator, trading API and public Python SDK for Polymarket's prediction markets, with 7,000+ registered accounts. Built with my co-founder, Wladimir Kirjanovs, and run day to day with AI agents.

How market data moves through PolySimulatorPolymarket's public order-book feed goes two ways. For trading, it is ingested into a live book cache that the matching engine fills orders against; orders arrive through the Polymarket-compatible API and SDK, and balances live in a PostgreSQL ledger. For research, 8 recorder processes write hourly Parquet files with manifests to a datalake on Cloudflare R2, which feeds replay and backtests through the simulation API.Polymarketpublic order-book feedIngestbooks and marketsBook cacheRedis, kept liveMatching enginewalks the live bookLedgerPostgreSQLAPI and SDKPolymarket-compatibleRecorder8 processesHourly filesParquet, manifestsDatalakeCloudflare R2, ~2 TB/weekReplaybacktests, researchsimulationAPI
  1. PolymarketThe public order-book feed goes two ways.
  2. TradingIt is ingested into a live book cache. The matching engine fills orders against it; orders arrive through the Polymarket-compatible API and SDK, and balances live in a PostgreSQL ledger.
  3. Recording8 recorder processes write hourly Parquet files to a datalake on Cloudflare R2: about 6 billion order-book rows a day, around 2 TB of new data a week.
  4. ReplayThe archive feeds backtests and research through the simulation API.
simulated fills
409,000+
traders with at least one fill
3,800+
markets traded
70,000+
order-book rows written a day
~6 billion

Trading engine

Market orders walk the live order book level by level and fill at the volume-weighted price. The engine is complement-aware like Polymarket's own: a bid for No at 40¢ is an offer of Yes at 60¢.

A book older than two seconds (750 ms for live sports) is fetched again before anything fills against it. Takers pay Polymarket's fee formula with per-category rates; makers pay nothing.

Limit orders rest and are matched every second, with partial fills. Every balance change is an atomic ledger entry, a repeated order ID returns the original order instead of filling twice, and resolved markets pay $1 or $0 a share.

API and SDK

REST and WebSocket, with routes and channels that follow Polymarket's, so a bot written for Polymarket can point at PolySimulator instead. Orders never reach Polymarket.

API keys are stored hashed and rate-limited per key, in published tiers from 2 to 100 requests a second. It handled 3.3 million API requests in the 24 hours to 22 October 2026.

The Python SDK on PyPI follows the interface of Polymarket's own Python client. A partner API lets other platforms run simulated accounts for their users.

Order-book recorder

8 recorder processes keep about 1,900 WebSocket connections open to Polymarket's public market feed and record every book snapshot, price change and trade, around the clock since 31 July 2026.

Every hour each process writes Parquet files to Cloudflare R2 and reads each upload back to check it. Every frame is numbered, so a gap shows up instead of hiding, and a check compares the recorded layers every 20 minutes.

That is about 6 billion order-book rows a day, around 2 TB of new data a week. An hourly job sorts it by market for replay and backtests.

  • Backtests

    Replay without look-ahead

    Backtests replay the recorded order books. Each order can be delayed by a realistic latency (we suggest the 104 ms median we measured in production) and is priced against the book as it stood when it would have arrived. Each fill carries a look-ahead flag computed from the data.

  • October 2026

    Moving production to London

    Four days from decision to cutover. The website was in maintenance for 11 minutes 22 seconds; 7,590 user records and 7,867 login identities were copied with matching row counts and checksums, with reverse replication ready for a rollback.

Engine, API and recorder: PolySimulator's code, October 2026. Fills, traders and markets: production database, 22 October 2026. Recorder volume: the recorders' own logs, average of 15 to 21 October 2026. Move figures: production records, 21 October 2026.

How I work

PolySimulator is built and run by a small team of AI agents. I set the direction and design the controls around them. Production releases need my co-founder or me.

How the agent team around PolySimulator worksI give goals to agent sessions with fixed roles. They share a versioned memory. Their code goes through pull requests, AI review and staging; production releases need one of us. Alerts go back to the operations session, and I get briefings by email.MeSets direction,approves releasesgoalsbriefingsAgent sessionsClaude Code and Codex, each in a fixed roleOperationsBusiness and financeResearchWebsitesThey message each other directly.Shared memoryVersioned, synced every 20 minutesPull requestwritten by an agentAI reviewon most code changesStagingagents merge hereProductionreleases approved by one of usalerts
  1. MeSet the direction and approve production releases.
  2. Agent sessionsClaude Code and Codex in fixed roles: operations, business and finance, research, websites. They message each other directly.
  3. Shared memoryVersioned notes and lessons, synced across machines every 20 minutes.
  4. Pull request, AI review, stagingAn agent writes the change, most code changes get an AI review, and agents merge into staging.
  5. ProductionReleases need one of us. Alerts go back to the operations session, and I get briefings by email.
  • Fixed roles

    Each agent session owns one area, such as operations, business or a website, and hands work to the others instead of redoing it.

  • A shared memory

    Every session starts from the same versioned notes. When an agent gets something wrong, it writes down what happened and, where it can, turns that into an automatic check.

  • Review before merging

    Most code changes get an AI review before they merge into staging. Production releases need one of us; during an incident, agents act in production under a standing permission from us.

  • Measured, not assumed

    In a one-week sample of 553 merged changes, one in four needed a follow-up fix within 48 hours. Review time, not writing code, became the bottleneck.

Sources: our pull-request records. Review coverage: the 30 days to 16 October 2026. Follow-up fixes: 553 pull requests merged between 29 August and 4 September 2026. More on bavariance.com

Software we built for the agents

Coding agents out of the box forget what they learned, get in each other's way and can see whatever is in their terminal. The tooling around them is our own, about 70 scripts and 11,000 lines, and several pieces exist because something went wrong.

Shared memory
One memory store per project, kept in git and synced between two machines every 20 minutes. Its index is generated to stay within the agents' context limit, after an index that had grown too large was silently cut off.
Assignment queue
Every request becomes a file with its status kept in place. Built after requests were lost when a session's context was compacted.
Prior-work check
Before starting, a session checks whether the work already exists. Built after two sessions rebuilt the same thing on the same day.
Session registry
Stable names, roles and message receipts for every session, plus watchers that keep running when a session ends.
Secret guard
Rewrites commands so credentials are masked in their output, blocks reads of key files, and sweeps the transcripts every night.
Review gate
Runs a Codex review on a pull request and posts it with the model, commit and transcript hash. It refuses to post without the reviewer's final message, after a full disk once made it report zero findings.
Alerts and mail
Grafana alerts land in the assignment queue every five minutes, and every email the agents send me is logged word for word.

Size: the agent tooling repository, counted on 22 October 2026.

Eleven months in the repository

The repository started on 17 November 2025. Until March 2026 we committed straight to the main branch (803 commits against 6 merged pull requests), so the commits show those months best. Since May 2026, agents have written nearly all of the code.

7,448commits under my name, by me and, since May 2026, mostly by my agents; 773 of them before March
Pull requests from MarchRecorder goes liveProduction moves to LondonExamsMonWedFri17 Nov 2025: 0 commits18 Nov 2025: 1 commits19 Nov 2025: 0 commits20 Nov 2025: 0 commits21 Nov 2025: 0 commits22 Nov 2025: 0 commits23 Nov 2025: 0 commits24 Nov 2025: 0 commits25 Nov 2025: 0 commits26 Nov 2025: 0 commits27 Nov 2025: 0 commits28 Nov 2025: 3 commits29 Nov 2025: 2 commits30 Nov 2025: 2 commits1 Dec 2025: 7 commits2 Dec 2025: 0 commits3 Dec 2025: 0 commits4 Dec 2025: 0 commits5 Dec 2025: 1 commits6 Dec 2025: 0 commits7 Dec 2025: 0 commits8 Dec 2025: 4 commits9 Dec 2025: 0 commits10 Dec 2025: 0 commits11 Dec 2025: 0 commits12 Dec 2025: 0 commits13 Dec 2025: 40 commits14 Dec 2025: 28 commits15 Dec 2025: 0 commits16 Dec 2025: 0 commits17 Dec 2025: 0 commits18 Dec 2025: 0 commits19 Dec 2025: 6 commits20 Dec 2025: 0 commits21 Dec 2025: 0 commits22 Dec 2025: 19 commits23 Dec 2025: 3 commits24 Dec 2025: 6 commits25 Dec 2025: 0 commits26 Dec 2025: 7 commits27 Dec 2025: 11 commits28 Dec 2025: 21 commits29 Dec 2025: 13 commits30 Dec 2025: 7 commits31 Dec 2025: 3 commits1 Jan 2026: 10 commits2 Jan 2026: 0 commits3 Jan 2026: 0 commits4 Jan 2026: 0 commits5 Jan 2026: 29 commits6 Jan 2026: 4 commits7 Jan 2026: 6 commits8 Jan 2026: 3 commits9 Jan 2026: 23 commits10 Jan 2026: 15 commits11 Jan 2026: 8 commits12 Jan 2026: 9 commits13 Jan 2026: 34 commits14 Jan 2026: 9 commits15 Jan 2026: 10 commits16 Jan 2026: 9 commits17 Jan 2026: 21 commits18 Jan 2026: 0 commits19 Jan 2026: 0 commits20 Jan 2026: 0 commits21 Jan 2026: 0 commits22 Jan 2026: 1 commits23 Jan 2026: 0 commits24 Jan 2026: 0 commits25 Jan 2026: 0 commits26 Jan 2026: 0 commits27 Jan 2026: 0 commits28 Jan 2026: 0 commits29 Jan 2026: 0 commits30 Jan 2026: 0 commits31 Jan 2026: 0 commits1 Feb 2026: 17 commits2 Feb 2026: 41 commits3 Feb 2026: 28 commits4 Feb 2026: 6 commits5 Feb 2026: 8 commits6 Feb 2026: 2 commits7 Feb 2026: 0 commits8 Feb 2026: 0 commits9 Feb 2026: 14 commits10 Feb 2026: 20 commits11 Feb 2026: 14 commits12 Feb 2026: 25 commits13 Feb 2026: 40 commits14 Feb 2026: 41 commits15 Feb 2026: 8 commits16 Feb 2026: 5 commits17 Feb 2026: 7 commits18 Feb 2026: 2 commits19 Feb 2026: 13 commits20 Feb 2026: 17 commits21 Feb 2026: 22 commits22 Feb 2026: 13 commits23 Feb 2026: 32 commits24 Feb 2026: 12 commits25 Feb 2026: 0 commits26 Feb 2026: 3 commits27 Feb 2026: 0 commits28 Feb 2026: 8 commits1 Mar 2026: 15 commits2 Mar 2026: 6 commits3 Mar 2026: 24 commits4 Mar 2026: 30 commits5 Mar 2026: 8 commits6 Mar 2026: 12 commits7 Mar 2026: 0 commits8 Mar 2026: 0 commits9 Mar 2026: 5 commits10 Mar 2026: 22 commits11 Mar 2026: 24 commits12 Mar 2026: 11 commits13 Mar 2026: 24 commits14 Mar 2026: 19 commits15 Mar 2026: 16 commits16 Mar 2026: 34 commits17 Mar 2026: 5 commits18 Mar 2026: 13 commits19 Mar 2026: 0 commits20 Mar 2026: 0 commits21 Mar 2026: 0 commits22 Mar 2026: 0 commits23 Mar 2026: 0 commits24 Mar 2026: 4 commits25 Mar 2026: 5 commits26 Mar 2026: 0 commits27 Mar 2026: 0 commits28 Mar 2026: 0 commits29 Mar 2026: 0 commits30 Mar 2026: 0 commits31 Mar 2026: 0 commits1 Apr 2026: 0 commits2 Apr 2026: 0 commits3 Apr 2026: 0 commits4 Apr 2026: 0 commits5 Apr 2026: 0 commits6 Apr 2026: 0 commits7 Apr 2026: 1 commits8 Apr 2026: 4 commits9 Apr 2026: 8 commits10 Apr 2026: 8 commits11 Apr 2026: 4 commits12 Apr 2026: 5 commits13 Apr 2026: 5 commits14 Apr 2026: 9 commits15 Apr 2026: 20 commits16 Apr 2026: 0 commits17 Apr 2026: 0 commits18 Apr 2026: 0 commits19 Apr 2026: 1 commits20 Apr 2026: 13 commits21 Apr 2026: 13 commits22 Apr 2026: 29 commits23 Apr 2026: 0 commits24 Apr 2026: 0 commits25 Apr 2026: 0 commits26 Apr 2026: 2 commits27 Apr 2026: 20 commits28 Apr 2026: 30 commits29 Apr 2026: 23 commits30 Apr 2026: 1 commits1 May 2026: 2 commits2 May 2026: 14 commits3 May 2026: 120 commits4 May 2026: 34 commits5 May 2026: 30 commits6 May 2026: 52 commits7 May 2026: 74 commits8 May 2026: 52 commits9 May 2026: 12 commits10 May 2026: 110 commits11 May 2026: 73 commits12 May 2026: 49 commits13 May 2026: 65 commits14 May 2026: 47 commits15 May 2026: 45 commits16 May 2026: 114 commits17 May 2026: 56 commits18 May 2026: 65 commits19 May 2026: 53 commits20 May 2026: 34 commits21 May 2026: 35 commits22 May 2026: 35 commits23 May 2026: 33 commits24 May 2026: 61 commits25 May 2026: 43 commits26 May 2026: 27 commits27 May 2026: 43 commits28 May 2026: 59 commits29 May 2026: 84 commits30 May 2026: 93 commits31 May 2026: 67 commits1 Jun 2026: 152 commits2 Jun 2026: 78 commits3 Jun 2026: 84 commits4 Jun 2026: 73 commits5 Jun 2026: 64 commits6 Jun 2026: 1 commits7 Jun 2026: 0 commits8 Jun 2026: 16 commits9 Jun 2026: 42 commits10 Jun 2026: 119 commits11 Jun 2026: 39 commits12 Jun 2026: 17 commits13 Jun 2026: 8 commits14 Jun 2026: 48 commits15 Jun 2026: 34 commits16 Jun 2026: 32 commits17 Jun 2026: 109 commits18 Jun 2026: 69 commits19 Jun 2026: 28 commits20 Jun 2026: 84 commits21 Jun 2026: 8 commits22 Jun 2026: 8 commits23 Jun 2026: 10 commits24 Jun 2026: 22 commits25 Jun 2026: 0 commits26 Jun 2026: 0 commits27 Jun 2026: 0 commits28 Jun 2026: 0 commits29 Jun 2026: 7 commits30 Jun 2026: 7 commits1 Jul 2026: 0 commits2 Jul 2026: 0 commits3 Jul 2026: 0 commits4 Jul 2026: 0 commits5 Jul 2026: 0 commits6 Jul 2026: 4 commits7 Jul 2026: 0 commits8 Jul 2026: 0 commits9 Jul 2026: 0 commits10 Jul 2026: 0 commits11 Jul 2026: 0 commits12 Jul 2026: 20 commits13 Jul 2026: 3 commits14 Jul 2026: 2 commits15 Jul 2026: 0 commits16 Jul 2026: 7 commits17 Jul 2026: 0 commits18 Jul 2026: 0 commits19 Jul 2026: 0 commits20 Jul 2026: 0 commits21 Jul 2026: 0 commits22 Jul 2026: 0 commits23 Jul 2026: 0 commits24 Jul 2026: 0 commits25 Jul 2026: 0 commits26 Jul 2026: 0 commits27 Jul 2026: 0 commits28 Jul 2026: 0 commits29 Jul 2026: 6 commits30 Jul 2026: 0 commits31 Jul 2026: 31 commits1 Aug 2026: 48 commits2 Aug 2026: 66 commits3 Aug 2026: 66 commits4 Aug 2026: 22 commits5 Aug 2026: 5 commits6 Aug 2026: 7 commits7 Aug 2026: 3 commits8 Aug 2026: 5 commits9 Aug 2026: 111 commits10 Aug 2026: 23 commits11 Aug 2026: 115 commits12 Aug 2026: 67 commits13 Aug 2026: 117 commits14 Aug 2026: 73 commits15 Aug 2026: 17 commits16 Aug 2026: 83 commits17 Aug 2026: 70 commits18 Aug 2026: 7 commits19 Aug 2026: 24 commits20 Aug 2026: 2 commits21 Aug 2026: 0 commits22 Aug 2026: 0 commits23 Aug 2026: 0 commits24 Aug 2026: 0 commits25 Aug 2026: 0 commits26 Aug 2026: 7 commits27 Aug 2026: 5 commits28 Aug 2026: 0 commits29 Aug 2026: 0 commits30 Aug 2026: 9 commits31 Aug 2026: 27 commits1 Sep 2026: 66 commits2 Sep 2026: 212 commits3 Sep 2026: 214 commits4 Sep 2026: 69 commits5 Sep 2026: 86 commits6 Sep 2026: 85 commits7 Sep 2026: 168 commits8 Sep 2026: 119 commits9 Sep 2026: 58 commits10 Sep 2026: 47 commits11 Sep 2026: 31 commits12 Sep 2026: 22 commits13 Sep 2026: 105 commits14 Sep 2026: 10 commits15 Sep 2026: 4 commits16 Sep 2026: 10 commits17 Sep 2026: 15 commits18 Sep 2026: 107 commits19 Sep 2026: 134 commits20 Sep 2026: 30 commits21 Sep 2026: 5 commits22 Sep 2026: 0 commits23 Sep 2026: 0 commits24 Sep 2026: 0 commits25 Sep 2026: 0 commits26 Sep 2026: 1 commits27 Sep 2026: 4 commits28 Sep 2026: 0 commits29 Sep 2026: 0 commits30 Sep 2026: 0 commits1 Oct 2026: 11 commits2 Oct 2026: 174 commits3 Oct 2026: 106 commits4 Oct 2026: 1 commits5 Oct 2026: 10 commits6 Oct 2026: 41 commits7 Oct 2026: 17 commits8 Oct 2026: 0 commits9 Oct 2026: 5 commits10 Oct 2026: 0 commits11 Oct 2026: 51 commits12 Oct 2026: 12 commits13 Oct 2026: 5 commits14 Oct 2026: 5 commits15 Oct 2026: 23 commits16 Oct 2026: 27 commits17 Oct 2026: 29 commits18 Oct 2026: 28 commits19 Oct 2026: 4 commits20 Oct 2026: 70 commits21 Oct 2026: 89 commitsNov8Dec176Jan191Feb398Mar277Apr196May1,681Jun1,159Jul73Aug979Sep1,602Oct708N176D191J398F277M196A1.7kM1.2kJJ979A1.6kS708ONov 2025Oct 2026
Monthly totals as a table
MonthMy commits
November 20258
December 2025176
January 2026191
February 2026398
March 2026277
April 2026196
May 20261,681
June 20261,159
July 202673
August 2026979
September 20261,602
October 2026708

Source: git history of PolySimulator's main repository, commits without merges and without bot commits, by author and UTC date; fetched 22 October 2026. Period: 17 Nov 2025 to 21 Oct 2026.

Studies and hackathons

  • October 2025 to February 2026, TUM lab course

    Molecular dynamics simulator

    A team-built simulator in C++ with the Lennard-Jones potential and the linked-cell algorithm, parallelized with OpenMP and checked with GoogleTest, sanitizers and Valgrind.

  • Winter semester 2025/26, TUM seminar

    Online learning for time-series forecasting

    A seminar paper with Sam Muller comparing online SNARIMAX, a ternary classifier and batch ARIMA on S&P 500 data, with the theory behind them: regret minimization, the online Newton step, catastrophic forgetting.

  • November 2025, HackaTUM

    IMC Trading Challenge

    A trading bot with exchange API integration, automated order management and an ensemble model for price prediction, built as team Bavariance.

  • March 2025, TUM Venture Labs

    Robo.Innovate hackathon

    On the BMW team: an on-premise server setup, and training and fine-tuning of robot policies by imitation learning with LeRobot.

Experience and education

Experience

  1. Nov 2025 – now
    Co-founderPolySimulator, Munich

    Product, architecture and the agent system that builds and runs it.

  2. Jul – Dec 2026
    Working Student, AI Workplace AssistanceING Deutschland, COO Digital Office

    Applied AI and automation for teams across the bank, including internal software built with AI coding agents.

Education

  1. Since Oct 2026
    B.Sc. Information SystemsTechnical University of Munich (Wirtschaftsinformatik)
  2. Oct 2023 – Oct 2026
    B.Sc. Computer ScienceTechnical University of Munich (Informatik), six semesters
  3. 2015 – 2023
    Abitur, final grade 1.2Königin-Luise-Gymnasium Erfurt
  4. 2022 – 2023
    Data Science Bootcamp; Applied Edge AIHasso Plattner Institute, certificates

Skills

AI engineering
Claude Code and Codex CLI, multi-agent orchestration, agent memory and context design, review gates, MCP servers
Software
Python (FastAPI), TypeScript, React and Next.js, SQL and PostgreSQL, Redis, WebSockets, C++ with OpenMP; also C, Java and OCaml
Operations
Docker, GitHub Actions, Cloudflare (R2, Workers), AWS, Grafana, Prometheus and Loki, database migrations, incident analysis
Data and ML
Real-time capture pipelines, NumPy, pandas, Matplotlib, online learning, imitation learning with LeRobot
Languages
German and Russian (native), English (C1), French (DELF B1)

Contact

Email is the quickest way to reach me.

erik@eremenko.io

Erik Eremenko, Munich, 2026