{
 "what_if": "no-jump-loss: the arbitrageur cannot trade against the base on a step where the probability jumped",
 "blocked": null,
 "python_version": "3.12.3",
 "base_mean_edge": 109.27254289017199,
 "base_unseen": {
  "mean_edge": 98.28063388702982,
  "retail_edge": 126.01907227628422,
  "arb_edge": -27.73843838925235
 },
 "diff": {
  "mean": 7.464602365007875,
  "standard_error": 1.0123114988310487,
  "simulations": 4000,
  "seed_start": 50000,
  "retail": 0.12548197081745016,
  "arb": 7.3391203941951755
 },
 "by_spread": [
  {
   "spread": 1,
   "runs": 1016,
   "diff": 3.9469318800400583,
   "standard_error": 2.8730032164619916
  },
  {
   "spread": 2,
   "runs": 998,
   "diff": 4.736768314097796,
   "standard_error": 1.33308470376203
  },
  {
   "spread": 3,
   "runs": 1017,
   "diff": 10.402776816158703,
   "standard_error": 2.043570402172372
  },
  {
   "spread": 4,
   "runs": 969,
   "diff": 10.878645893093704,
   "standard_error": 1.3685704575145148
  }
 ],
 "how": "Scratch copy of simulator commit b244530ee2a6247b5f930830eeca9dd950da0e7e, three edits. process.py: JumpDiffusionScoreProcess.step() records last_jump_count = the Poisson jump count it draws (no extra RNG draws). engine.py: execute_arbitrage is passed jump = (last_jump_count > 0) for the step. market.py: when jump is true, every participant order is popped from the order dict before the arbitrage sweep, the unchanged sweep runs (so the competitor's orders below/above p_t are swept exactly as usual and replenished as usual), and the participant orders are put back untouched (same ids, sequence, sizes, reserves) so they rest through that step's retail flow and are seen by the base next step. Non-jump steps are untouched. With the switch off the copy reproduced the real simulator run for run (60 seeds, identical total_edge and final_wealth). The base file is unchanged (sha256 baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273). All seeds and both arms share the same process and retail random streams, so the comparison is paired run by run.",
 "clean": "Mostly clean, with two side effects that work against the base, so the +7.46 is if anything a slight understatement of 'no loss on jump steps'. (1) Orders the arb would have taken stay in the book at stale prices during that step's retail flow, and retail can hit them on the wrong side of p (retail diff is only +0.125, so this is small). (2) The base's probes are not filled on a jump step, so it loses the fill signal it uses to locate p, keeps stale quotes, and many get swept by the arb on the next non-jump step: the loss is partly deferred, not removed. No information about p or about the jump is given to the base, and no other rule changes. A variant that cancels exactly the participant orders the arb would have taken on a jump step (instead of letting them survive) is the pure 'jump-step loss removed' number: +11.776567126023199 (SE 1.0360469378961532; retail -0.37514209585124986, arb 12.151709221874). It leaks a little, though: it uses the true post-jump p to choose what to cancel, and the base sees those orders disappear just as if they were filled. Treat 7.46 to 11.78 as the band; the brief's rule gives 7.46.",
 "realizable": "Almost none of it, by any mechanism I can find. In the simulator the jump count is drawn after the strategy has quoted (on_step, then process.step, then the arb sweep), as an i.i.d. Poisson draw with nothing observable ahead of it, so a real strategy cannot dodge the jump step itself. Two levers are left. (a) Size at risk: quote less per step wherever a jump would cross the quote. The base already prices this; its quote sizing charges lam_j times the expected jump crossing loss. Scaling that charge on tuning seeds 4000-4999 is a clean trade: 0.5x gives retail 2.4226929364307, arb -3.9755239737244, net -1.5528310372969991; 2x gives retail -4.0336398627809, arb 3.3889647838599, net -0.6446750789249999. Every share of jump loss saved costs about as much retail edge, so the base already sits at the optimum. (b) Per-run jump-rate learning: count jumps seen through competitor-quote shifts and size by the posterior rate. The detector is calibrated (2.58 detections against 2.44 expected per run over 60 tuning runs), but with about 3.8 jumps per run its estimate correlates only 0.24 with the true per-run rate, so it adds nothing. So the 7.5-11.8 points are real money lost to jumps, but it is the cost of quoting at all under unannounced jumps, not a fixable inefficiency. The one partial route would be a faster re-centre after a jump, which pulls in the deferred part (the skip-vs-cancel gap). The base already uses competitor book shifts for that (its jumpinfo rule).",
 "attempt": {
  "mechanism": "online per-run jump-intensity estimate (Gamma-style ratio estimator, 3 pseudo-counts, jump detected when competitor best quote moves >= max(3 ticks, 4x expected one-step diffusion move)), used for both the belief variance and the jump-loss sizing charge; tuned on seeds 4000-4999 only",
  "diff": -0.13092513432870032,
  "standard_error": 0.41662564774833855,
  "simulations": 4000,
  "seed_start": 50000,
  "retail": -0.24157793425057494,
  "arb": 0.11065279993075004
 },
 "tried": [
  "Real scorer, base, seeds 1000-1599 (600 sims, --workers 6): mean 109.27254289017199, matching the author's 109.27254289017199 exactly",
  "Real scorer, base, seeds 50000-53999 (4000 sims): mean 98.28063388702982, retail 126.01907227628422, arb -27.73843838925235; matches 98.28063388702982",
  "What-if copy with switch off, 60 seeds from 1000: identical to the real simulator run for run",
  "What-if (arb skips base orders on jump steps, orders survive), seeds 50000-53999: mean 105.7452362520377, paired diff 7.464602365007875 SE 1.0123114988310487 (retail 0.12548197081745016, arb 7.3391203941951755)",
  "Variant (base orders the arb would take on a jump step are cancelled instead), seeds 50000-53999: paired diff 11.776567126023199 SE 1.0360469378961532; by spread 1-4: 7.068572351018898, 8.515242342446292, 15.36173965997119, 16.309079363782764",
  "Per-run jump-rate learning, sizing only, tuning seeds 4000-4999 (1000 sims): diff -0.6299691534837996 SE 0.46210552841212976",
  "Per-run jump-rate learning, sizing and belief variance, tuning seeds 4000-4999: diff -0.5817823525580998 SE 0.408939064626945; seeds 50000-53999: diff -0.13092513432870032 SE 0.41662564774833855",
  "Jump-loss sizing charge x0.5, tuning seeds 4000-4999: diff -1.5528310372969991 SE 0.6061912922622517 (retail 2.4226929364307, arb -3.9755239737244)",
  "Jump-loss sizing charge x2, tuning seeds 4000-4999: diff -0.6446750789249999 SE 0.5668387385469632 (retail -4.0336398627809, arb 3.3889647838599)",
  "Jump detector check, 60 tuning runs: 2.58 detections against 2.44 expected per run, true expected jumps 3.78 per run, correlation of the estimated with the true per-run intensity 0.24"
 ],
 "next": "Do not build a jump dodge: the ceiling is over two (7.46, or 11.78 with pure cancellation) but it is not realizable, because jumps are unannounced i.i.d. Poisson draws made after the strategy quotes, and the size-at-risk trade is already at its optimum. The only build worth a seat is post-jump recovery: measure how much of the arb loss falls on the one or two steps after a detected jump (the skip-vs-cancel gap, about 4.3, bounds it) and see whether pulling or re-centring quotes the step after a large competitor-quote shift gains anything over the base's jumpinfo rule."
}