← All writing

Introducing Pulse :: Portobello

Welcome to Portobello: the latest version of Pulse, our intraday market simulator. More realistic, 4.5x faster, a refreshed API, MCP, UI, new FIX 4.4 gateway, and early access to our latest foundation model for L2 snapshots. Don’t miss out.

At Simudyne, we design models to reflect the real world as closely as possible. We do this primarily through two methods: AI models and agent-based models (ABM). An ABM is a model designed around the behaviour of many rule-based agents; these agents interact with each other in a realistic environment to simulate particular scenarios. Our AI models are similar to those used in language or image generation. We use large amounts of market data to train domain-specific architectures that generate the next item in a sequence. This generative ability allows us to prompt a model with a pre-defined scenario and get a realistic response in the form of a simulation, without having to make any assumption on the data.

In general, an ABM is only as good as its assumptions, while our AI models are only as good as their training data. Running both in tandem lets us draw on the strengths of each while mitigating their limitations. We are excited to announce both in the latest release of our intraday market simulator, Pulse :: Portobello.

Our latest version of Pulse comes with three major changes. First, the actual model improvements, which include efficiency updates and minor updates to the underlying model architecture. The second batch of changes is our updated methods of providing you access to our simulators. We now provide a user interface, API and MCP servers, as well as FIX connectivity. Finally, we have begun providing access to one of our early foundation models for market simulation: a generative model for recreating regime-specific L2 samples. More on this at the end of the post.

Improving the Model

We improved both the speed and the accuracy of our agent-based market simulator, PulseABM, as well as introducing significant updates to our validation process to ensure that our latest improvements are robust.

How we define improvements (PulseCheck)

We validate our simulators against real market data through a growing suite of complementary measures. One of the metrics we have introduced is based on recent work benchmarking synthetic LOB data (Nagy et al., 2025). This paper takes distributions of microstructure statistics from both the historical and the simulated data and compares them using the L1 or Wasserstein distance. The Wasserstein distance, also known as the earth mover’s distance, measures the minimum amount of probability mass you would have to move to reshape the simulated distribution into the real one, so lower is better, with zero meaning a perfect match.

We ran independent Monte Carlo trials for v1 and Portobello and report the mean for each. Overall, Portobello reduces the Wasserstein distance to the empirical distributions on 15 of our 16 validation metrics, with a median reduction of roughly 50% and up to 80% on order-book depth, while the remaining metric (log inter-arrival time) is statistically unchanged. The full comparison against v1 is below.

Wasserstein distance between simulated and empirical distributions across 20 Monte Carlo trials (700.HK, 2025-09-01), shown on a log scale.

The chart shows how Portobello compares to our previous release (v1) across a set of our validation metrics. (These validation metrics are now available to be run on your data via PulseCheck).

Model Improvements

A handful of small changes to the underlying model have meaningfully improved validation performance. We have re-worked how we model market makers and deep liquidity providers, replacing them with a single background liquidity-providing agent. We also revisited our calibration process, testing a range of optimisation methods, such as Gaussian processes, Random Forest, Particle Swarm Optimisation, and best-batch search, to better navigate the parameter space. This produced both better results and faster convergence.

Simulation speed is always a key focus for us; faster simulation means cheaper compute, more Monte Carlo runs, and more symbols. Therefore, we significantly increased simulation throughput, where Portobello simulates order-flow events 4.5x faster than v1. Users can now run far more Monte Carlo trials when building out their models than ever before.

Simulated order-flow events per second, v1 vs Portobello (700.HK, 2025-09-01, 5 Monte Carlo trials). Normalised for the more granular order flow Portobello simulates per run.

We are in the process of onboarding new exchanges to increase our global coverage (more on this soon). For every exchange that we have onboarded, we test a variety of symbols against our validation metrics to ensure that we have the very best results across all of our offered exchanges and symbols. If there is a symbol or exchange you would like to see included, please get in touch with info@simudyne.com.

New Access Points

To make Pulse as easy to use as possible, we now have an API, an MCP, a UI, and FIX connectivity, all tailored to make simulating the financial markets on our huge compute clusters as easy as possible, letting you connect to Pulse the same way you would an exchange through a FIX 4.4 gateway.

API and MCP

Our improvements to the API include far better logging, more endpoints, and improved docs, as well as providing access to our validation methodology (PulseCheck) via API, so any data in the correct format can be validated against historical data. All of these capabilities are covered in our API cookbook, which is full of pre-built recipes to help you get started.

Alongside improvements to our API, we are happy to announce the PulseMCP server. For those unfamiliar with MCP, this means that AI agents can interact with Pulse directly. In our own testing this has proven remarkably powerful, and the use cases that our AI agents have come up with have genuinely surprised us. We’d encourage anyone curious to try it out for themselves.

Here’s a real worked through demo session, connected live to the Pulse MCP server:

claude · Pulse MCP
User: If a 3% flash crash hits 700.HK while I'm executing a 100-lot (10,000 share) sell order, would a TWAP or VWAP schedule perform better? Use 25 Monte Carlo runs so the result is more robust, and make sure the order is large enough that the schedules actually play out over the full window rather than finishing instantly.
pulse - run_simulation (MCP)
↪ symbol: "700.HK", scenario: "flash_crash", n_runs: 25
↪ exec_algos: TWAP 100 lots over 1h from 10:00; VWAP 100 lots over 1h from 10:00
↪ Job a04a8df7 queued · 75 simulations
pulse - check_job (MCP)
↪ 75/75 complete
pulse - get_mid_price_series (MCP)
↪ Mid-price path for one representative TWAP run and one VWAP run
pulse - get_exec_results (MCP)
↪ Implementation-shortfall decomposition (slippage, impact, risk, in HK$ against the engine's own calibration reference) for all 25 TWAP runs and all 25 VWAP runs
At this size the schedules actually take the full hour to work through the order. You can see both TWAP and VWAP tracking the crash and the recovery in real time rather than finishing before the injection even lands. Averaged across all 25 runs, TWAP and VWAP are essentially tied on slippage: impact is now the dominant cost for both (HK$5.17 for TWAP, HK$5.37 for VWAP), overtaking market risk (HK$3.14 / HK$2.95) for the first time, a reversal from smaller orders, where risk swamps impact. VWAP fills a little more of the order (85.5 vs 82.4 of 100 lots), but that edge in fill rate doesn't translate into a meaningfully cheaper average execution.
AlgoSlippageImpactRiskFilled
TWAPHK$8.30HK$5.17HK$3.1482.4 / 100 lots
VWAPHK$8.32HK$5.37HK$2.9585.5 / 100 lots
Basically a coin flip: HK$0.02 apart per lot, well within run-to-run noise. Want me to push to a size where the two schedules are forced to trade very differently through the crash, to see if a real gap opens up?
User: yes, try 500 lots, still with 25 Monte Carlo runs
pulse - run_simulation (MCP)
↪ symbol: "700.HK", scenario: "flash_crash", n_runs: 25
↪ exec_algos: TWAP 500 lots over 1h from 10:00; VWAP 500 lots over 1h from 10:00
↪ Job ea6069b4 queued · 75 simulations
pulse - check_job (MCP)
↪ 75/75 complete
pulse - get_mid_price_series (MCP)
↪ Mid-price path for one representative TWAP run and one VWAP run
pulse - get_exec_results (MCP)
↪ Implementation-shortfall decomposition (slippage, impact, risk, in HK$) for all 25 TWAP runs and all 25 VWAP runs
Now a real gap opens up, and TWAP wins it. At 500 lots, VWAP is trying to trade in proportion to a volume curve that the crash has just torn up, and it costs VWAP on every dimension: TWAP is HK$2.45 cheaper per lot, has lower impact, and fills more of the order (405.8 vs 371.6 of 500 lots). Spreading evenly through the hour turns out to be more robust than chasing a volume profile that no longer reflects what's actually happening in the book.
AlgoSlippageImpactRiskFilled
TWAPHK$20.68HK$17.79HK$2.89405.8 / 500 lots
VWAPHK$23.13HK$20.09HK$3.05371.6 / 500 lots
Not a simple "bigger order, bigger gap" story either: at 100 lots the two algos were tied, and only past that point does TWAP's flat schedule start to dominate. Worth checking directly for your actual order size and averaging over enough runs to trust the answer, rather than assuming either algo always wins.

FIX Connectivity

To make integration to Pulse as easy as possible, we are launching FIX connectivity, where we expose our simulator via a FIX 4.4 gateway. Point your existing FIX engine at Pulse the same way you’d point it at a real venue, and the simulated matching engine sends back execution reports as your order fills.

Here’s an over-the-wire simulation and execution shown in FIX messages:

Simudyne PULSE
FIX 4.4 · SESSION LIVE
SYMBOL
700.HK
SIDE · QTY
SELL · 500 lots
ALGO
TWAP
HORIZON
60 min
EXECUTION REPORT LOG
→ Logon (35=A)
49=ALGO1 | 56=PULSESIM | 34=1 | 52=20250902-09:59:50.102 | 98=0 | 108=30
← Logon (35=A)
49=PULSESIM | 56=ALGO1 | 34=1 | 52=20250902-09:59:50.140 | 98=0 | 108=30
→ NewOrderSingle (35=D)
11=ORD-70045A | 21=1 | 55=700.HK | 54=2 | 38=50000 | 40=1 | 59=0 | 60=20250902-10:00:00.000
9001=TWAP | 9002=3600 (Pulse custom tags: exec algo, horizon secs)
← ExecutionReport (35=8) · New
37=ORD-70045A-1 | 17=EXEC-0001 | 11=ORD-70045A | 150=0 | 39=0 | 151=50000 | 14=0
← ExecutionReport (35=8) · Partial Fill · 10:15:00
17=EXEC-0042 | 150=1 | 39=1 | 31=590.25 | 32=830 | 14=12480 | 151=37520 | 6=601.85
← ExecutionReport (35=8) · Partial Fill · 10:30:00 (scenario injected)
17=EXEC-0087 | 150=1 | 39=1 | 31=586.00 | 32=780 | 14=24900 | 151=25100 | 6=598.40
← ExecutionReport (35=8) · Partial Fill · 10:45:00
17=EXEC-0119 | 150=1 | 39=1 | 31=586.00 | 32=310 | 14=33200 | 151=16800 | 6=593.10
← ExecutionReport (35=8) · Expired · 11:00:00 (horizon complete)
17=EXEC-0164 | 150=C | 39=C | 31=570.75 | 32=290 | 14=40583 | 151=9417 | 6=590.85

If your algo wrapper or OMS already speaks FIX to your real venues, it can start trading and testing on Pulse with ease. See the FIX connectivity docs for session setup.

New UI

Finally, to make the API easier to use, we’ve wrapped it in a brand new user interface. This gives you access to all of the necessary API endpoints and, crucially, guides you through usage. The UI also includes useful visibility tools, report generation, and data download. This makes it a genuinely easy, no-code way to access the API and visualise our synthetic markets.

Foundation Model Release

For our Pro users, we are thrilled to provide early access to the next generation of our market simulators, a deep generative model that can recreate L2 snapshots with fine-grained control over market conditions. Using state-of-the-art techniques behind large image generation models, we are able to generate LOB snapshots with surprising accuracy and then alter them to have controlled changes in features such as volatility or imbalance. We are still training and increasing the size and scope of our models with exciting news on this coming soon.

Get Started

Portobello is live today. The free tier gives you immediate access to our library of pre-computed simulations to use as a synthetic data source; the pro tier unlocks custom simulations, scenarios, and execution algorithms across our supported exchanges, with the API, MCP server, UI, and FIX gateway all included. Point your agent, your FIX engine, or just your browser at pulse.simudyne.com and run your first simulation in minutes.

This is the first release in a series. Our exchange coverage is expanding, and we have deep-dives coming soon on our new validation work, our calibration toolkit, and our first foundation model for L2 data . If you want early access, a demo, or you’re weighing up a research collaboration, email us at info@simudyne.com. We’d love to see what you build on Portobello.

FAQs

Should I try it? YES! You can get started here.
How much does it cost? Nothing — ish. We have both a free tier and pro tier: the free tier gives you access to our pre-run simulations to be used as a synthetic data database, while the pro tier lets you run custom simulations on a variety of exchanges and symbols with customisable scenarios and execution algorithms.
Is it complicated? The model is built using a complicated agent-based modelling framework; for more information see this paper. However, despite this complexity, the model is both easy to use (thanks to our new improved access points) and easy to interpret.
Why use synthetic data? There are a huge number of use cases for synthetic data in the real world (Our favourite example). The key reason synthetic data is so appealing is its controllability: it lets us directly control what data our AI trading algorithms (or similar systems) are trained on, reducing our exposure to high-risk but rare events and letting us deliberately explore training in new regimes.
How do I upgrade my tier to pro? Upgrading to pro involves emailing us directly at support@simudyne.com, where we can set up a demo and discuss pricing.
How do I collaborate with Simudyne? We love collaboration and are excited to explore research projects and use cases for Pulse. If you're contemplating a research collaboration, please don't hesitate to get in touch, as we may be able to help you get off the ground faster. And don't forget to cite us in your work.

References

Nagy, P., Frey, S., Li, K., Sarkar, B., Vyetrenko, S., Zohren, S., Calinescu, A., & Foerster, J. (2025). LOB-Bench: Benchmarking Generative AI for Finance — an Application to Limit Order Book Data. https://arxiv.org/abs/2502.09172