{
 "key": "f-post-jump",
 "approach": "Overlay on N: two-state (calm/disturbed) Bayesian filter on competitor-mid moves (scaled by 2 ticks) plus adverse own fills; when disturbed with a >=1 tick mid move, for M=4 steps drop N's new placements on the exposed side at prices the move crossed (+s ticks): sells <= new high after up-moves, buys >= new low after down-moves. N's cancels and resting orders untouched. Acts only when s in {1,2}.",
 "tried": "Tuning 310000..310199: M=4 all spreads diff -0.033 (se 0.082), by s: 1:+0.092, 2:+0.026, 3:-0.074, 4:-0.196; M=10 diff -0.002 (se 0.310), noisy, s=3 -0.46. Chose M=4, spreads {1,2}. N on seed 310000 = 17.1160017503 (matches 17.116002).",
 "next": "Effect is ~0: the static competitor ladder only replenishes, so mid shifts are rare and N already reacts; drop this mechanism or try fill-only detection.",
 "spreads_acted": [
  1,
  2
 ],
 "off_equals_n": true,
 "code": "import dataclasses as _dc\nfrom orderbook_pm_challenge.types import PlaceOrder as _PO, Side as _Sd\n\n\nclass Strategy(BaseStrategy):\n    ACT = (1, 2)\n    M = 4\n    JUMP = 2.0\n    ON = True\n\n    def __init__(self, *a, **k):\n        super().__init__(*a, **k)\n        self._n = _N(*a, **k)\n        self._s = None\n        self._pm = None\n        self._dis = 0\n        self._lo = 0\n        self._hi = 0\n        self._dir = 0\n        self._pd = 0.05\n\n    def on_step(self, state):\n        acts = self._n.on_step(state)\n        b, a = state.competitor_best_bid_ticks, state.competitor_best_ask_ticks\n        if self._s is None and b is not None and a is not None:\n            self._s = max(1, (a - b + 1) // 2)\n        if not self.ON or self._s not in self.ACT or b is None or a is None:\n            return acts\n        mid = (a + b) / 2.0\n        pm = self._pm\n        self._pm = mid\n        if pm is None:\n            return acts\n        mv = mid - pm\n        fb, fs = state.buy_filled_quantity, state.sell_filled_quantity\n        # two-state filter: likelihood-ratio update on quote move and own fills\n        ev = abs(mv) / self.JUMP + (0.5 if (fs > 0 and mv > 0) or (fb > 0 and mv < 0) else 0.0)\n        p = self._pd\n        lr = 2.718281828 ** (3.0 * (ev - 1.0))\n        p = p * lr / (p * lr + (1 - p))\n        self._pd = min(0.95, max(0.01, 0.9 * p + 0.01))\n        if p > 0.5 and abs(mv) >= 1:\n            self._dis = self.M\n            self._dir = 1 if mv > 0 else -1\n            self._lo = min(pm, mid)\n            self._hi = max(pm, mid)\n        elif self._dis > 0:\n            if abs(mv) >= 1 and (mv > 0) == (self._dir > 0):\n                self._lo = min(self._lo, mid)\n                self._hi = max(self._hi, mid)\n                self._dis = self.M\n            else:\n                self._dis -= 1\n        if self._dis <= 0:\n            return acts\n        out = []\n        for x in acts:\n            if isinstance(x, _PO):\n                pr = x.price_ticks\n                if self._dir > 0 and x.side == _Sd.SELL and pr <= self._hi + self._s:\n                    continue\n                if self._dir < 0 and x.side == _Sd.BUY and pr >= self._lo - self._s:\n                    continue\n            out.append(x)\n        return out\n",
 "code_sha256": "5bf56012353053f27ae99edb3b452fd97486d198e68c7ee9b78edb7764109d75",
 "assembled_sha256": "93ab390d012d875f1e8246e3a07901090d99025032fc5d9febca65b9d09e6323",
 "tuning": {
  "n": 200,
  "mean_diff": 0.029057504757000006,
  "se": 0.030859230992502606
 },
 "paired": {
  "first_seed": 410000,
  "last_seed": 410499,
  "n": 500,
  "complete": true,
  "incumbent_mean": 104.4137531881468,
  "mean_diff": 0.041534091033599674,
  "se": 0.033972866517976,
  "sum_d": 20.767045516799836,
  "sum_d2": 288.82437739132325,
  "retail_diff": -0.03846756154559986,
  "arb_diff": 0.08000165258179992,
  "failures": 0
 },
 "by_spread": {
  "1": {
   "runs": 115,
   "incumbent_mean": 28.495154459731303,
   "mean_diff": 0.06300988988782574,
   "se": 0.04849860936089579,
   "sum_d": 7.2461373370999596,
   "sum_d2": 31.292807407046208,
   "retail_diff": -0.028357385453042536,
   "arb_diff": 0.09136727535217419
  },
  "2": {
   "runs": 116,
   "incumbent_mean": 97.76626247947759,
   "mean_diff": 0.1165595532732748,
   "se": 0.13851741726253283,
   "sum_d": 13.520908179699877,
   "sum_d2": 257.53156998427704,
   "retail_diff": -0.13769552970431068,
   "arb_diff": 0.2542550829775856
  },
  "3": {
   "runs": 138,
   "incumbent_mean": 128.4054514027384,
   "mean_diff": 0.0,
   "se": 0.0,
   "sum_d": 0.0,
   "sum_d2": 0.0,
   "retail_diff": 0.0,
   "arb_diff": 0.0
  },
  "4": {
   "runs": 131,
   "incumbent_mean": 151.67248160310686,
   "mean_diff": 0.0,
   "se": 0.0,
   "sum_d": 0.0,
   "sum_d2": 0.0,
   "retail_diff": 0.0,
   "arb_diff": 0.0
  }
 },
 "seconds_per_simulation": 0.922
}