BBCA 8,725 ▲0.9% BBRI 5,140 ▼1.2% BMRI 7,050 ▲0.3% TLKM 3,180 ▲0.4% ASII 5,625 ▼0.6% BBNI 5,475 ▲1.1% ANTM 1,685 ▲3.2% MDKA 2,450 ▼1.7% ICBP 11,300 ▼0.3% UNVR 2,342 ▲0.8% ADRO 2,610 ▲1.4% PTBA 3,120 ▼2.1% GOTO 68 ▲2.3% BRIS 2,890 ▼0.9% KLBF 1,310 ▲0.2%
MonarqiLabs · Stress Trading Desk

MonarqiLabs — What would the market do?

A controlled market of 961 real IDX stocks and ten AI personas with independent memories. Inject one shock, then watch the scenario world drift away from the baseline and find out who kept their head.

Deterministic · seed 42 · 10 agents · 961 tickers
Index · scenario vs baseline equal-weight · end of window
105 100 95 90 85 D0 D80 D160 D240 D320 −12.4% vs baseline · D162 recovered D238 · 88 days
solid = scenario · dashed = baseline · normalised to 100 Market shock · D150 · earnings_miss · BBRI · 0.80
Universe
961 tickers
real IDX, full listed board
Agents
10 personas
independent memories
Horizon
1,000 days
daily ticks, replayable
Thought
hybrid
rules every tick · LLM on triggers
Truth
JSONL
event-sourced, never mutated
01 · The Premise

Two worlds, one seed.

Every experiment runs twice from the same seed: a scenario world that receives your shock, and a baseline world that lives without it. Both trade the same 961 stocks with the same ten agents.

The delta between the curves is the experiment: price impact in basis points, days to recovery, and which agent moved first.

ΔImpactshock-day price move in the scenario world, measured in bps against baseline
t+Overshootdoes the market undershoot fair value before turning, and by how far
t→Recoverydays until the scenario index rejoins the baseline path
ΣAttributionwhich personas bought the dip, which froze, which made it worse
02 · One Trading Day

A day runs in seven moves.

The engine is a strict tick loop. Rules think every day, which keeps runs cheap and deterministic. The LLM thinks only when something happens: a shock lands, volatility doubles, or an account crosses a psychological line. Reflections are cached, so a rerun of the same seed costs nothing.

01Fundamentals driftevery stock's true_value takes its daily random walk with mean reversion
02News layeroptional Tier-2 news items are emitted; News Nelly trades on sentiment alone
03Shock injectionif one is scheduled today, it lands. One shock per day, never two
04Agents computeall ten personas price their orders from Tier-1 rules + memory notes
05Matchingorders meet the book, prices update, fills are recorded
06Vol checkif realized vol exceeds 2× its 20-day mean, affected agents reflect (Tier 2)
07Log & emitthe day is appended to events.jsonl, the single source of truth
03 · The Roster

Ten desks. Ten temperaments.

Ten different nervous systems, not ten copies of one strategy. Each keeps an append-only memory log, and Tier-1 rules read yesterday's notes as today's modifier.

00Value VeraBuys below 0.85× intrinsic, sells above 1.15×slow · conviction
01Momentum Max20-day MA cross, momentum scoringfast · signal-chasing
02MeanRev MiaZ-score reversion, ±1.5σ bandfast · mean-centered
03FOMO FredChases green: buys after back-to-back up daysimpulsive · herding
04Panic PeteExits past 8% drawdown, holds ≥60% cash when scaredemotional · loss-averse
05News NellyTrades the news sentiment score, ignores pricereactive · tier 2
06Contrarian CarlFades short-squeezed rallies and panic washoutsslow · contrarian
07Passive PatEqual-weight buy-and-hold, places no active ordersno memory
08Fund FMVol-scaled sizing, stop-loss, diversification capsdisciplined · systematic
09Macro MargePositions by the rate proxy: longs when rates fallevent-driven
Control group Agent 07 never trades. An equal-weight buy-and-hold runs in every experiment, because a claim that active management beat the market means nothing without a baseline.
04 · Shock Injection

One shock at a time.

Shocks are written in the same grammar the desk uses: day, type, ticker, severity, one per line, one per day. An earnings miss lands on one name; a rate cut hits the whole board. The LLM narrates each shock into the news rail, then every affected agent reflects on it and adjusts tomorrow's behavior.

earnings_miss rate_cut margin_call analyst_downgrade short_squeeze index_rebalance
shocks.txt, same grammar as the desk
# one per line: day|type|ticker|severity
150|earnings_miss|BBRI|0.80
500|rate_cut|global|0.50
740|margin_call|ANTM|0.65
# day multipliers, optional global drag
501|mult|0.75

Severity 0.80 is not decoration. It scales the impulse the price engine absorbs that day, and it decides how many agents trip a Tier-2 reflection.

05 · The Lab Keeps Score

Watchability is the gate. Statistics are the output.

Every metric is computed per agent, per run, then averaged across a batch of 50 seeds with confidence intervals. A single run is a story; fifty runs are a result.

Total P&Lper agent, per run, averaged across seeds with CI+12.4%
Sharpe ratiofrom daily returns1.31
Max drawdowndeepest peak-to-trough equity loss−18.2%
Shock reactionprice impact in bps, days to recovery, and which agent moved first−212 bps · 41d
Crowd rationality1 − (excess volume + price overshoot + panic-sell volume); a declining trend means the market is getting stupid0.87
Strategy driftcorrelation between an agent's actual decisions and its stated strategy, over time0.93 → 0.71
Turnovervolume traded vs average portfolio value per day0.42×
06 · Event Sourcing

Every run is a replayable truth.

The engine never mutates the log. The UI and the metrics both read from it. Replay any finished run and scrub to any day; live mode and replay mode are the same data through the same pipe.

Deterministic by construction: the same seed produces the identical market, and LLM reflections are cached by seed, day, agent, and trigger, so a scientific rerun costs nothing.

experiments/ml_001/events.jsonl
{ "event": "shock", "day": 150, "type": "earnings_miss", "stock": "BBRI", "severity": 0.8 }
{ "event": "order", "day": 150, "agent": "panic_pete", "stock": "BBRI", "side": "sell", "qty": 400, "reason": "tightened_stops" }
{ "event": "fill", "day": 150, "agent": "panic_pete", "stock": "BBRI", "price": 8.62 }
{ "event": "reflection", "day": 150, "agent": "panic_pete", "trigger": "vol_spike", "note": "Market breaking down; tightening stops to 3%.", "confidence": 0.6 }
{ "event": "reflection", "day": 151, "agent": "contrarian_carl", "trigger": "position_breach", "note": "Washout pricing; starting a small long.", "confidence": 0.55 }
{ "event": "day_end", "day": 151 }
The desk is live

Run the seed. Stress the market.

Open the trading desk, write one line of shock, and watch ten agents argue with a market about what things are worth.

Deterministic · seed 42 · 10 agents · 961 tickers