SPB Git

spb/wp27_uqo

Public
9.5 KB

# Assumption register — WP 27

Version 1.0, 2026-10-27. Each row states the assumption as implemented in src/market_agents, its role, why it is acceptable for the research question, and the pre-specified check that probes it. Values are the defaults of configs/baseline.yaml unless noted. "Confirmatory base" refers to the overrides in protocol.md §5.1.

# 1. Time, assets and fundamentals

ID Assumption (as implemented) Role Justification Robustness check
A1 Discrete model time: 600 ticks, outcomes on t ≥ 100; no calendar mapping Defines the horizon of every metric Avoids false precision; 30 dividend periods suffice for ACF/VR estimates (≥ 500 returns) n_ticks 1,000 on the control (free); report whether rankings of cells change
A2 Dividend every 20 ticks: D = μ + x + J, x_t = 0.98 x_{t−1} + 2 ε_t (cents), μ = 50 c, r = 0.25 % per period; one asset by default Fundamental process; V ≈ 200.00 and P/D ≈ 400 Persistent, stationary cash-flow state with a closed-form PV (brief §Economy) Sweep ρ ∈ {0.95, 0.98}, σ ∈ {1, 2, 4} on the control (free)
A3 "Efficient price" = full-information PV V_t = μ/r + x_t·ρ/(1 + r − ρ), risk-neutral, constant discount rate, no risk premium Benchmark for msd_log, mad_pct, bubbles, absorption The only unambiguous benchmark in a simulated economy; the latent state is never shown to agents Also report deviations from the public PV (public_value) and from the end-of-run mean price
A4 Public PV = Kalman/HMM posterior on announced dividends; in the baseline (no jumps, one regime) the dividend reveals x_t exactly, so V^pub ≡ V Information structure Simplest case for calibration; but it makes private signals redundant and H1 unidentified Confirmatory base uses noisy dividends (jump_prob 1, jump_sigma ≈ 4 c → SD(V^pub/V − 1) ≈ 0.5 %); both variants reported
A5 No look-ahead: private signals s = x_t + N(0, σ²/precision) are about the current state; news reports x_t with noise; nobody sees future draws Rules out mechanical information advantages Standard in noisy rational-expectations settings Unit test on the signal function; prompt audit (prompting.py builds only from Observation)
A6 Shock: latent jump in x at t = 300 revealed through dividends/news; placebo at t = 450. Baseline size 40 c (+8.4 % on V); confirmatory size 10 c (+2.1 %) Event-study outcomes (time_to_absorb, response_ratio, local projections) A sub-threshold (< 5 %) jump so that a lagged response is not counted as a bubble; placebo for falsification Sizes 10/20/40 c on the control; news_burst variant

# 2. Market mechanism

ID Assumption Role Justification Robustness check
A7 Continuous double auction, price–time priority, limit/market/cancel, partial fills, IOC remainder of market orders, integer ticks (1 c) and lots Price formation; no Walrasian auctioneer and no imposed equilibrium Matches modern electronic markets; prices emerge from order matching call_auction_interval = 5 (batch clearing with a 2 % collar), mock only
A8 Per-agent latency U[0.05, 1] tick, fixed for the run; orders processed in arrival order; LLM agents draw latency like others Removes a speed advantage from either population Speed is not the object of study latency.llm_latency matched-latency variant
A9 Fees: taker 2 bp, maker 0, no rebates; fees leave the economy; exact cash/share conservation asserted after every fill Transaction costs; accounting integrity Low explicit costs so that spreads are endogenous Taker 0 and 5 bp on the control
A10 Order TTL 50 ticks; price band ±50 % of the reference; max order 10,000 lots (policies cap at 40–50) Keeps books finite and prices bounded Prevents stale quotes and absurd limit prices TTL 20 / 100 on the control
A11 No short selling by default; buys limited by free cash (reserved for resting buys) Budget constraint; asymmetry between buying and selling Retail-like constraint; makes the no-short assumption explicit for H3 allow_short with max_short_lots 100 on the control and at φ = 0.25 (mock)
A12 Leverage only for "leveraged" slots: cap 3× gross/equity, maintenance margin 25 %, forced sale of 50 % by market order on the next tick, bankrupt agents frozen The leverage channel of H3 (spiral when λX/m ≥ 1) Mirrors margin trading with mechanical liquidation Cap 2×/5×; maintenance 15 %/35 % (free at φ = 0, live only in the T4 leverage cell)
A13 Safeguards off by default; treatments: halt when 10-tick move > 5 % for 20 ticks with resting orders cancelled; position limit 300 lots H6
A14 Market making by 5 bounded inventory-skewed two-sided quoters (half-spread 8 ticks + volatility term, skew 2 % at 200 lots), endowed ×5, never replaced by LLM agents Liquidity supply; spread floor ≈ 8 bp Keeps a stable liquidity benchmark across cells so liquidity changes come from the treated population quote_qty 10/20 and liquidity shock (makers withdraw) on the control

# 3. Agents

ID Assumption Role Justification Robustness check
A15 No rationality or equilibrium assumption: classical agents are documented heuristics (fundamentalist with signal-weighted value, EMA trend, z-score mean reverter, zero-intelligence-plus noise, leveraged trend); LLM agents do whatever the model outputs Defines the "human-like" baseline The brief's theory (β-response traders) is a stylization; the simulator tests directional claims, not point predictions Calibration sweep (360 runs) shows the stylized facts are robust to aggressiveness, trend share, market-order share
A16 Mix 25/15/10/35/5/10 % (fundamentalist/trend/meanrev/noise/MM/leveraged), stratified by wealth; endowment 20,000 + 100 shares × lognormal(0.3) Population composition Common in ABM calibrations; 50/50 cash–stock endowment at V Trend share 10–25 % in the sweep; wealth_dispersion 0/0.6
A17 Decision frequency: classical activation Bernoulli(0.2–0.5) per tick; LLM agents decide every 20 ticks with staggered offsets, from t = 50 Event frequency vs decision frequency API cost; one decision per dividend period is a defensible "slow trader" Realized order/volume shares always reported (mock: 3.5 % / 8 % at φ = 0.25); decision_interval 10 (mock)
A18 Information: 30 % of fundamentalists informed (precision 2 → signal SD 1.4 c); after the gate-4 fix an LLM slot inherits the status of the slot it replaces Holds information quality fixed across arms (H1's premise) Otherwise the treatment bundles policy and information (mock: 44 % vs 6 % informed) Report stratum composition of LLM slots per cell; variant with llm.informed_share 0
A19 Stratified replacement: proportional quotas by classical type, market makers excluded → 95 eligible slots, so φ = 1 means 95 % Dose definition Keeps composition of the replaced population constant along the dose llm_replace: noise (replace one type only) at φ = 0.25 (mock)
A20 LLM observation = canonical snapshot (5 levels of depth, 60-tick mid history, 30 recent trades, last dividend, public PV, ≤ 3 news items, own signal, account, open orders); personas single ("generalist") or 8 diverse; memory 0/5; channel = last 5 rationales of a cohort What the model can condition on Identical information set to the classical agents' Observation Prompt audit; prompt version frozen (v1)
A21 Invalid or infeasible decisions become hold (quantity, ±20 % price window, cash/holdings, owned cancel ids); sells clipped to holdings Reliability rule; ITT estimand A deployed agent that fails holds Validity reported per cell; cells < 80 % flagged
A22 Provider sampling is not seeded; cached responses replay exactly; the frozen library is a nearest-neighbour map, not an agent Reproducibility Only option with current APIs Cache-hit share and online/replay flag per run; library distance diagnostics
A23 Equal decision opportunities across models by default (27 per agent); equal-USD via per-run usd_cap (single-provider cells) Fairness of cross-model comparisons Decision opportunities, not tokens, are the economically relevant unit T5 fairness cell

# 4. Measurement

ID Assumption Role Justification Robustness check
A24 Mid-price is the price; metrics use the mid (fallback in engine.mid_ticks when one side is empty); effective spread uses the start-of-tick mid All price-based outcomes Standard; avoids bid–ask bounce Also compute msd_log on last trade prices
A25 Bubble = P/V − 1 > 5 % for ≥ 10 ticks; crash = drop ≥ 10 % from the trailing 20-tick max; time_to_absorb tolerance 1 % for 5 ticks, censored at 100 Instability and absorption outcomes
A26 Coordination measured among LLM agents only (sign correlation in 20-tick windows; synchrony per decision round) H2/H5 Only LLM decisions are logged with intent Classical analogue from aggressor-signed trades (analysis stage)
A27 Multi-asset: common factor 0.7 in innovations; LLM prompt covers asset 0 only Contagion arm Keeps the prompt single-asset (cost, validity) Report that spillover runs from the LLM-traded asset to the classical-only asset
Files · c1fdf6ca460749ff23b61fccd1b74aa8618ff683
Menu

Theme